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

24

у меня естьorder иclient юридическое лицо.

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

Select several clients from a dropdown (mix of collection and entity form type) And to create new clients on the fly (the default way for the collection type) if not in the dropdown list.

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

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

Ваш Ответ

5   ответов
3

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

Мне действительно интересно это решение, не могли бы вы привести подробный пример? Wirone
@ antony, можешь ли ты уточнить, пожалуйста? SteeveDroz
@ SteeveDroz Я ответил на это почти 2 года назад. Я думаю, что информация, которую вы требуете, зде Knpuniversity.com / блог / property_path а также Symfony.com / док / ток / компоненты / форма / form_events.html. antony
0

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

Более подробную информацию можно получить по следующим 2 ссылкам:

Официальная ссылка на тип поля формы сбора Книга о добавлении и удалении на лету с типом коллекции

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

Спасибо за Ваш ответ. Я знаю оcollection тип. Но у меня такое ощущение, что я могу либо добавить и удалить существующих клиентов, либо добавить и удалить новых клиентов, но не могу добавить существующего клиента и создать нового (например) в той же форме. Я ошибся ? Надеюсь, это понятно. Simon Taisne
Я считаю, что это не отвечает на первоначальный вопрос, который для меня был: есть ли элегантный способ добавить существующие или новые объекты в коллекцию? Я не понимаю, почему этот ответ был принят. Julien
Ты прав, это больше не так. Simon Taisne
Я полагаю, вам нужно отличить «Добавить существующего клиента» от «Добавить нового клиента», так как формы должны отличаться. AlterPHP
6

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

В моем классе 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',
            ));
        }
    }); 
Это хорошо работает для меня. Я просто изменил его, чтобы мне не пришлось использовать два разных ключа формы. Перед слушателем я использую свой собственный тип формы. В слушателе я просто проверяю, является ли (is_numeric ($ data ['item']), затем я удаляю форму и добавляю форму EntityType. mameluc
Нужно использовать EmbedItemForm :: class, так как type is string | null в методе add, начиная с symfony 3 (возможно, 2.?) Jean-Luc Barat
@ patrick Я использую точно такой же пример, но по какой-то причине я получаю сообщение об ошибке "эта форма не должна содержать дополнительные поля". Я уверен, что вызывается eventListener для правильного удаления / добавления полей. Simon
1

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

JS -> Захватить событие, чтобы добавить нового клиента в вашу базу данных (т.е. событие нажатия кнопки «Добавить новый») JS -> Внутри этого события, вызовите через AJAX ваш контроллер со значениями нового клиента. (С помощью FOSJsRoutingBundle это легко сделать) Symfony2 -> Внутри вашего нового действия сохраните нового клиента в вашей базе данных. JS -> Событие OnSuccess, в вашем вызове AJAX добавьте нового Клиента в свой DropDownBox (ddb.append (новый тег элемента)

Просто сделайте так, чтобы ваш новый клиент был сохранен в базе данных и добавлен в выпадающий список

Идея заключалась в том, чтобы создать раскрывающийся список, показывающий существующих клиентов, а также возможность создания нового клиента (если его нет в списке) в той же форме. И я действительно решил использовать некоторые JS для достижения этого поведения. Simon Taisne
1

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

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

customer->entity
new_customer-> collection

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

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

Похожие вопросы