У меня проблема со сложной формой
Это шаблон, который описывает фильм (сцены, элементы, условия, ...)
Это выглядит так:
Внутри коллекции элементов у меня есть варианты вложенной коллекции:
Моя странная проблемаis: Следующий установщик, когда я отправляю всю форму, отправляет массив вместо коллекции.Дело в форме обновления, при отправке коллекция уже настроена.
/**
* @param Collection $options
* @return Element
*/
public function setOptions($options): Element
{
if (!$options instanceof Collection) {
var_dump($options);
var_dump('fall here');exit;
$this->options = new ArrayCollection($options);
} else {
var_dump($options);
$this->options = $options;
}
return $this;
}
Более странная вещь:
/**
* @param \App\Domain\Toto\Template\Entity\ElementOptions $option
* @return $this
*/
public function addElementOptions(ElementOptions $option): self
{
var_dump('Element::addElementOptions'); exit;
$option->setElement($this);
$this->options->add($option);
return $this;
}
/**
* @param ElementOptions $option
*/
public function removeElementOptions(ElementOptions $option)
{
$this->options->removeElement($option);
}
Они никогда не называются.
Мойвариант by_reference
от построителя форм не работает во вложенной коллекции.
Но я действительно поражен, я был бы признателен за предложение того, что я, возможно, пропустил.
Вот код, относящийся к этой вложенной коллекции:
Element.orm (элемент имеет один или несколько elementOption)
<one-to-many field="options" target-entity="App\Domain\Toto\Template\Entity\ElementOptions" mapped-by="element" fetch="LAZY">
<cascade>
<cascade-all/>
</cascade>
</one-to-many>
Элемент ElementOption
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="App\Domain\Toto\Template\Entity\ElementOptions" table="tpl_element_options">
<id name="id" type="integer" column="id">
<generator strategy="IDENTITY"/>
</id>
<many-to-one field="element" target-entity="App\Domain\Toto\Template\Entity\Element" inversed-by="options" fetch="LAZY">
<join-columns>
<join-column name="element_id" referenced-column-name="id" on-delete="CASCADE"/>
</join-columns>
</many-to-one>
<many-to-one field="type" target-entity="App\Domain\Toto\Template\Entity\Type">
<join-columns>
<join-column name="type_id" referenced-column-name="id" on-delete="CASCADE" nullable="1"/>
</join-columns>
</many-to-one>
<field name="value" type="string" column="value" length="150" precision="0" scale="0" nullable="false">
<options>
<option name="comment">This column stores the value for the option</option>
</options>
</field>
</entity>
</doctrine-mapping>
Построитель формы элемента, объявление коллекции elementOption
->add('options', CollectionType::class,
[
'entry_type' => ElementOptionsForm::class,
'by_reference' => false,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'prototype_name' => '__ELEMENT_OPTION__',
'attr' => [
'class' => 'table scene-elements-option',
],
'label' => 'templates.new.form.scene.element.option.title'
]
);
В контроллере моя форма заполняется значениями записи следующим образом:
$form = $this->formFactory->create($type, $data, $options);
$form->handleRequest($this->requestStack->getCurrentRequest());
return $form;