Вложенная коллекция Symfony 4 by_reference не работает - PullRequest
0 голосов
/ 25 сентября 2018

У меня проблема со сложной формой

Это шаблон, который описывает фильм (сцены, элементы, условия, ...)


Это выглядит так:enter image description here

Внутри коллекции элементов у меня есть варианты вложенной коллекции:

enter image description here

Моя странная проблема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;
...