Как я могу установить URL для формы POST, используя FormBuilder в Symfony2? - PullRequest
24 голосов
/ 18 марта 2012

Я динамически загружаю различные классы форм в свой контроллер и отображаю их в своем шаблоне.Это прекрасно работает, за исключением того, что документы Symfony2 показывают добавление маршрута для формы к POST в шаблоне вручную.

<form action="{{ path('task_new') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}

    <input type="submit" />
</form>

Мне нужно установить это действие формы в классе FormBuilder - маршруты POST (например, 'task_new') различаются в зависимости от класса формы, который я использую.Есть ли способ установить URL-адрес действия формы в классе FormBuilder?Как мы можем получить {{form_widget (form)}} для отображения полной формы, а не только строк?Спасибо!

Ответы [ 5 ]

48 голосов
/ 30 октября 2013

Можно из коробки - http://symfony.com/doc/current/book/forms.html#changing-the-action-and-method-of-a-form

$form = $this->createFormBuilder($task)
->setAction($this->generateUrl('target_route'))
->setMethod('GET')
->add('task', 'text')
->add('dueDate', 'date')
->add('save', 'submit')
->getForm();
32 голосов
/ 21 декабря 2013

У меня была такая же проблема. Я использовал простой класс FormType и хотел установить URL-адрес действия в функции buildForm. Я пробовал разные вещи, но не мог сделать это таким образом.

В конце концов я использовал опцию «Форма» под названием «действие». Я не думаю, что это задокументировано в справочнике Symfony, я нашел его случайно, читая отчет об ошибке :). Вы можете установить опцию при создании формы в вашем контроллере следующим образом:

$form = $this->createForm(new FormType(), $obj, array( 'action' => 'whatever you want'));

Это не так красиво, как заключить его в класс формы, но это работает .. Надеюсь, это поможет.

10 голосов
/ 02 марта 2016

Неправильно менять маршрут отправки в типе формы. Это не форма ответственности типа. Если вы добавили форму из не обработанного маршрута формы, вы можете просто изменить URL действия в шаблоне:

  {{ form_start(yourForm,{action:path('yourSubmitRoute')}) }}
8 голосов
/ 23 июля 2015

Я решил эту проблему, введя маршрутизатор в мой тип формы. В моем приложении я создал форму поиска по почтовому индексу ZipCodeSearchType :

Форма Класса

use Symfony\Component\Form\AbstractType;
/*
 * I'm using version 2.6. At this time 2.7 has introduced a 
 * new method for the Option Resolver. Refer to the documentation 
 * if you are using a newer version of symfony.
 */
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Routing\Router;

/**
 * Class ZipCodeSearchType is the form type used to search for plans. This form type
 * is injected with the container service
 *
 * @package TA\PublicBundle\Form
 */
class ZipCodeSearchType extends AbstractType
{   
    /**
     * @var Router
     */
    private $router;

    public function __construct(Router $router)
    {
        //Above I have a variable just waiting to be populated with the router service...
        $this->router = $router;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('zipCode', 'text', [
                'required' => true,
            ])
            /*
             * Here is where leverage the router's url generator
             */
            //This form should always submit to the ****** page via GET
            ->setAction($this->router->generate('route_name'))
            ->setMethod("GET")
        ;
    }

    ...
}

Следующий шаг - настроить форму как службу и сообщить Symfony, что вам нужна служба маршрутизатора, внедренная в ваш класс:

Определить форму как услугу

/*
 * My service is defined in app/config/services.yml and you can also add this configuration
 * to your /src/BundleDir/config/services.yml
 */
services:
    ############
    #Form Types
    ############
    vendor_namespace.zip_search_form:
        class: VENDOR\BundleNameBundle\Form\ZipCodeSearchType
        arguments: [@router]
        tags:
            - { name: form.type, alias: zip_code_search }

Используйте его в вашем контроллере

/**
 * @param Request $request
 * @return Form
 */
private function searchByZipAction(Request $request)
{
    ...

    $zipForm = $this
        ->createForm('zip_code_search', $dataModel)
    ;
    ...
}
0 голосов
/ 18 марта 2012

Я не думаю, что сегодня это возможно вне коробки (18 марта 12 года). Вы могли бы, однако, сделать что-то вроде этого:

в вашем контроллере:

....
....

$post_route = null;
if ( $something ){
    $post_route = "some_post_route";
}else if ( $something_else ){
    $post_route = "some_other_post_route"
}else{
    $post_route = "my_default_route";
}

....
....

return array(
    'post_route' => $post_route
);

... и в вашем шаблоне:

<form action="{ path(post_route) }" method="post" {{ form_enctype(form) }}>

Аналогичный подход будет заключаться в создании URL (а не только имени маршрута) в вашем контроллере и передаче его в шаблон, в этом случае вам не нужна функция path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...