Форма Symfony 3.4 EntityType Выбранное значение пусто - PullRequest
0 голосов
/ 07 июня 2018

У меня проблема с Symfony 3.4 EntityType.

CategoryType.php

class CategoryType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('spec', CollectionType::class, [
                'entry_type' => SpecificationType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'label' => false,
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Category::class,
        ));
    }
}

SpecificationType.php

class SpecificationType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title', EntityType::class, [
            'class' => Specification::class,
            'label' => false,
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Specification::class,
        ));
    }

    public function getBlockPrefix()
    {
        return 'specification';
    }
}

Форма отображается должным образом: заголовок в виде текстового поля и 2 выбранных элемента.Но проблема отображается, элемент выбора не выбирает выбранное значение.

form.html.twig

{{ form_widget(form.title) }}
{{ form_widget(form.spec) }}

Результат
enter image description here

Ожидаемый результат
enter image description here

В случае SpecificationType.php EntityType::class заменяется наTextField:class теперь форма отображает не 2 элемента выбора. Шина 2 ввода текста (ожидаемое поведение) и назначенные значения верны:
enter image description here

Я начал копать, как эти элементы выборарендерился на первое место и обнаружил, что этот блок {%- block choice_widget_options -%} отвечает за рендеринг элемента select.

Внутри этого блока находится код мира:

<option value="{{ choice.value }}"{% if choice.attr %}{% with { attr: choice.attr } %}{{ block('attributes') }}{% endwith %}{% endif %}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice_translation_domain is same as(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}</option>

Именно это условие: {% if choice is selectedchoice(value) %} selected="selected"{% endif %} отвечает за добавление атрибута selected к опции.Но расширение value в selectedchoice(value) почему-то пусто, поэтому он не помечает выбранную опцию.

Может кто знает, как решить эту проблему?

ОБНОВЛЕНО *Свойство 1060 *

spec определяется следующим образом:

CategoryEntity.php

/**
 * @ORM\ManyToMany(targetEntity="Specification", inversedBy="categoryList")
 * @ORM\JoinTable(name="category_specification")
 */
private $spec;

1 Ответ

0 голосов
/ 07 июня 2018

Найденное решение здесь .

Как писал @Nickolaus:

[..] You are having this problem because it is a compound form in your implementation and no simple form and symfony is unable to resolve which field created inside the subform needs to be used as source for the entity field

Итак, решение таково:

Refactor SpecificationType.php вот так:

class SpecificationType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'class' => Specification::class,
            'label' => false,
        ));
    }

    public function getParent()
    {
        return EntityType::class;
    }

    public function getBlockPrefix()
    {
        return 'specification';
    }
}

Используйте метод getParent(), переместите все поля конфигурации в configureOptions и удалите метод buildForm().

Наконец ... так много часов потрачено впустую ..

...