Symfony формы: коллекция полей формы не отображается - PullRequest
0 голосов
/ 26 апреля 2020

Учитывая следующую архитектуру

entityA
{
    entityB [12]
}

entityB
{
    entityC[]
}

entityC
{
   name, defaultValue
}

При создании нового объекта entityA я хочу перечислить каждый объект C в базе данных, чтобы иметь возможность выбирать их и настраивать defaultValue следующим образом:

CHECKBOX [x] LABEL name1, INPUT defaultValue1
CHECKBOX [ ] LABEL name2, INPUT defaultValue2
CHECKBOX [x] LABEL name3, INPUT defaultValue3
CHECKBOX [x] LABEL name4, INPUT defaultValue4
etc

... цель состоит в том, чтобы автоматически генерировать объекты сущности C в соответствии с выбором, указанным выше, в каждом из 12 объектов entityB этой новой сущностиA

->add('categories', CollectionType::class, [
    "mapped" => false,
    'entry_type'    => SharedCategoryType::class
])

Использование категории (сущность *) 1021 *) как тип сущности не работает, потому что я тоже хочу выставить значение по умолчанию. Вот SharedCategoryType

class SharedCategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('enabled', CheckboxType::class, [
                "mapped" => false
            ])
            ->add('name' , TextType::class) //not a label but not important for now
            ->add('defaultValue' , MoneyType::class); 
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Category::class,
        ]);
    }
}

С этим кодом отображение не работает, но я не знаю, чего не хватает ...

Редактировать: первые попытки, которые я сделал, были такими:

->add('budgets', EntityType::class, [
            "class" => Category::class,
            "mapped" => false,
            "multiple" => true,
            "expanded" => true
}

но тогда я не могу изменить поле defaultValue. Он автоматически создает метку на основе имени (используя метод __toString, который я определил, вероятно,), но я не могу найти, как добавить defaultValue к полям, отображаемым

1 Ответ

0 голосов
/ 26 апреля 2020

Если вы создаете связанную сущность, вы можете использовать событие формы, например

public function buildForm(FormBuilderInterface $builder, array $options)
{
  ...
  $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) 
  {
            /** @var ResultModel $model */
            $model = $event->getData();
            $form = $event->getForm();
            if (!$model->getExecutive()) {
                $form->add('executive', EntityType::class, [
                    'class' => BundesligaExecutive::class,
                    'placeholder' => 'bundesliga.executive.choose',
                    'help' => 'bundesliga.executive.help',
                ]);
            } 
...
}

Здесь вы найдете более подробную информацию https://symfony.com/doc/current/form/dynamic_form_modification.html

Кстати, это Вероятно, лучше использовать selectBox вместо флажков

...