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

Как установить URL-адрес формы в POST с помощью FormBuilder в Symfony2?

Я динамически загружаю разные классы форм в свой контроллер и отображаю их в своем шаблоне. Это прекрасно работает, за исключением того, что документы 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)}}, чтобы отобразить полную форму, а не только строки? Спасибо!

4b9b3361

Ответ 2

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

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

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

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

Ответ 3

Я решил эту проблему, введя маршрутизатор в мой тип формы. В моем приложении я создал форму поиска почтового индекса под названием 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 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)
    ;
    ...
}

Ответ 4

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

  {{ form_start(yourForm,{action:path('yourSubmitRoute')}) }}

Ответ 5

Я не думаю, что это возможно из коробки сегодня (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.