Создание формы Symfony из общих данных

Я разрабатываю приложение для управления отчетами. Я разрабатываю это с Symfony 3.2.6 В этом картина Вы можете увидеть мою модель данных. Я хочу сделать две вещи:
1. Создайте новые макеты для отчета с несколькими заданными модулями.
2. Создайте экземпляры этих отчетов и сохраните их в базе данных.

Так что я думаю, что это способ сделать это с этой моделью данных, не так ли? Но как я могу теперь создать форму в Symfony из этого?

Я делаю что-то подобное:

$builder
->add('name', TextType::class)
;

foreach ($options['moduleValues'] as $moduleValue)
{
if($moduleValue instanceof RangeModuleValue)
{
$builder->add('value', RangeType::class, array(
'attr' => array(
'min' => $moduleValue->getRangeModule()->getStartValue(),
'max' => $moduleValue->getRangeModule()->getEndValue()
)
));
}
}

Но тогда я получаю ошибку:

Neither the property "value" nor one of the methods "getValue()", "value()", "isValue()", "hasValue()", "__get()" exist and have public access in class "ReportBundle\Entity\Report".

Я думаю, что ошибка ясна, «значение» находится в таблице range_module_value. Но как мне изменить свой дизайн или форму, чтобы справиться с этим?

Примечание: родительский класс Module существует, потому что в будущем появятся другие модули, такие как «TextModule».

Вот мой класс Отчет:

class Report
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;

/**
* @ORM\ManyToOne(targetEntity="ReportBundle\Entity\ReportLayout")
* @ORM\JoinColumn(name="layout_id", referencedColumnName="id")
*/
private $layout;

/**
* Report constructor.
* @param int $id
*/
public function __construct($layout)
{
$this->layout = $layout;
}/**
* @return int
*/
public function getLayout()
{
return $this->layout;
}

/**
* @param int $layout
*/
public function setLayout($layout)
{
$this->layout = $layout;
}

/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}

/**
* Set name
*
* @param string $name
*
* @return Report
*/
public function setName($name)
{
$this->name = $name;

return $this;
}

/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}

}

А вот класс RangeModuleValue, в котором я хочу сохранить значение модуля для конкретного отчета.

class RangeModuleValue
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="ReportBundle\Entity\RangeModule")
* @ORM\JoinColumn(name="rangeModule_id", referencedColumnName="id")
*/
private $rangeModule;

/**
* @ORM\ManyToOne(targetEntity="ReportBundle\Entity\Report")
* @ORM\JoinColumn(name="report_id", referencedColumnName="id")
*/
private $report;

/**
* @var int
*
* @ORM\Column(name="value", type="integer")
*/
private $value;

/**
* RangeModuleValue constructor.
* @param $rangeModule
* @param $report
*/
public function __construct($report, $rangeModule)
{
$this->report = $report;
$this->rangeModule = $rangeModule;
}/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}

/**
* Set rangeModule
*
* @param string $rangeModule
*
* @return RangeModuleValue
*/
public function setRangeModule($rangeModule)
{
$this->rangeModule = $rangeModule;

return $this;
}

/**
* Get rangeModule
*
* @return string
*/
public function getRangeModule()
{
return $this->rangeModule;
}

/**
* Set report
*
* @param string $report
*
* @return RangeModuleValue
*/
public function setReport($report)
{
$this->report = $report;

return $this;
}

/**
* Get report
*
* @return string
*/
public function getReport()
{
return $this->report;
}

/**
* Set value
*
* @param integer $value
*
* @return RangeModuleValue
*/
public function setValue($value)
{
$this->value = $value;

return $this;
}

/**
* Get value
*
* @return int
*/
public function getValue()
{
return $this->value;
}

}

1

Решение

В отчет о классе вы добавите эту функцию, чтобы позволить добавить много $rangeModule или же $value :

public function addrangemodule (RangeModuleValue $rangeModule)
{
$day->setIdReport($this);
$this->ranges->add($day);
}

Но ранжирование должно быть ArrayCollection:

 public function setranges(ArrayCollection $ranges)
{
$this->ranges= $ranges;
}

В контроллер добавляется столько, сколько вам нужно:
$ range = new RangeModuleValue ();

    $report->addrangemodule ($range);

Этот код просто пример, я не уверен, что он работает.

Для получения дополнительной информации это документация:

https://symfony.com/doc/current/form/form_collections.html

http://www.doctrine-project.org/api/common/2.3/class-Doctrine.Common.Collections.ArrayCollection.html

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector