Как установить 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)}}, чтобы отобразить полную форму, а не только строки? Спасибо!
Ответы
Ответ 1
Возможно из коробки - 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();
Ответ 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
.