Подтвердить что ты не робот

Форма Symfony2: выберите объект или добавьте новый

У меня есть объект order и client.

Мне интересно, возможно ли с помощью системы форм Symfony2 создать форму заказа, которая позволит:

  • Выберите несколько клиентов из раскрывающегося списка (сочетание форм collection и entity)
  • И создавать новые клиенты "на лету" (по умолчанию для типа collection), если нет в раскрывающемся списке.

Я видел способ сделать это, создав несколько форм на одной странице, но это не так, как хотелось бы.

Есть ли лучшие способы сделать это?

4b9b3361

Ответ 1

У меня была аналогичная проблема, которая может привести к вашему решению:

У меня есть отношение "Категория и элемент" ( "Много-к-одному" ), и я хотел либо выбрать существующий элемент, либо создать новый элемент.

В моем классе Form:

    $builder->add('item', 'entity', array(
        'label' => 'Item',
        'class' => 'ExampleItemBundle:Item',
    ));

    $builder->add('itemNew', new EmbedItemForm(), array(
        'required' => FALSE,
        'mapped' => FALSE,
        'property_path' => 'item',
    ));

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
        $data = $event->getData();
        $form = $event->getForm();

        if (!empty($data['itemNew']['name'])) {
            $form->remove('item');

            $form->add('itemNew', new EmbedItemForm(), array(
                'required' => TRUE,
                'mapped' => TRUE,
                'property_path' => 'item',
            ));
        }
    }); 

Ответ 2

Вы можете сопоставить два поля в форме с тем же свойством, используя опцию property_path. Затем, используя события формы, используйте представленные данные, чтобы принять решение и изменить форму, чтобы только одно из полей имеет параметр mapped, который true.

Ответ 3

Если я понял, вы хотите создать и хранить новых клиентов в форме "на лету", на данный момент. Я думаю, что вы должны сделать это с помощью JavaScript и установить дополнительные действия в своем контроллере.

  • JS → Захват события для добавления нового клиента в вашу базу данных (т.е. "Добавить новое" событие нажатия кнопки)
  • JS → Внутри этого события вызовите через AJAX ваш контроллер со значениями нового клиента. (Использование FOSJsRoutingBundle легко сделать)
  • Symfony2 → Внутри вашего нового действия сохраните нового клиента в своей базе данных.
  • JS → Событие OnSuccess, в вашем вызове AJAX, добавьте нового клиента в DropDownBox (ddb.append(новый тег элемента)

Просто сделав это, ваш новый клиент будет сохранен в базе данных и добавлен в ваш dropdownbox

Ответ 4

Со своей стороны у меня была такая же проблема, и я решил ее, создав 2 атрибута в formType;

Например, для вас это будет:

customer->entity
new_customer-> collection

В вашем файле сущности вашего заказа вам нужно будет добавить 3 метода (getter, setter и remover), getter и remover ничего не делают, но setter должен вызвать setCustomer(c)

Я не уверен, что это лучший способ, но это единственный способ понять это!

Ответ 5

Тип формы collection позволяет добавлять и удалять на лету с атрибутами allow_add и allow_delete.

Дополнительная информация, следуя этим двум ссылкам:

Если вам не нравится получать дополнительные формы на одной странице, вы можете интегрировать их в диалоговые окна... Но вам определенно нужна форма для создания новых элементов...