form_widget - symfony using form
¿Cómo puedo configurar la URL del formulario para POST utilizando FormBuilder en Symfony2? (5)
Estoy cargando dinámicamente diferentes clases de formularios en mi Controlador y mostrándolos en mi plantilla. Esto funciona bien, excepto que la documentación de Symfony2 muestra cómo agregar la ruta del formulario a POST en la plantilla a mano.
<form action="{{ path(''task_new'') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" />
</form>
Necesito establecer esa acción de formulario en la clase FormBuilder: las rutas POST (por ejemplo, ''task_new'') son diferentes dependiendo de la clase de formulario que estoy usando. ¿Hay alguna manera de establecer la url de acción de formulario en la clase FormBuilder? ¿Cómo podemos obtener {{form_widget (form)}} para representar el formulario completo, y no solo las filas? ¡Gracias!
Es posible fuera de la caja - 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();
Es una mala práctica cambiar la ruta de envío en el tipo de formulario. No forma responsabilidad del tipo. Si agregó el formulario desde no manejar la ruta del formulario, solo puede cambiar la url de acción en la plantilla:
{{ form_start(yourForm,{action:path(''yourSubmitRoute'')}) }}
No creo que sea posible salir de la caja hoy (18 de marzo de 2014). Podrías, sin embargo, hacer algo como esto:
en su controlador:
....
....
$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
);
... y en tu plantilla:
<form action="{ path(post_route) }" method="post" {{ form_enctype(form) }}>
Un enfoque similar sería generar una URL (no solo el nombre de la ruta) dentro de su controlador y pasarla a la plantilla, en cuyo caso no necesita la función de path
allí.
Resolví este problema inyectando el enrutador en mi tipo de formulario. En mi solicitud, he creado un formulario de búsqueda de código postal llamado ZipCodeSearchType :
Clase de formulario
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")
;
}
...
}
El siguiente paso es configurar tu formulario como un servicio, y avisar a Symfony que necesitas que el servicio de enrutador sea insertado en tu clase:
Definir forma como servicio
/*
* 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 }
Úsalo en tu controlador
/**
* @param Request $request
* @return Form
*/
private function searchByZipAction(Request $request)
{
...
$zipForm = $this
->createForm(''zip_code_search'', $dataModel)
;
...
}
Yo tuve el mismo problema. Estaba usando una clase simple de FormType
y quería establecer la url de acción en la función buildForm
. Probé diferentes cosas, pero no pude hacerlo de esa manera.
Eventualmente utilicé una opción de formulario llamada ''acción''. No creo que esté documentado en la referencia de Symfony, lo encontré por accidente mientras leía un informe de error :). Puede configurar la opción al crear el formulario dentro de su controlador de esta manera:
$form = $this->createForm(new FormType(), $obj, array( ''action'' => ''whatever you want''));
No es tan bonito como tenerlo encapsulado en la clase de formulario, pero funciona ... Espero que esto ayude.