symfony2 personalizar formularios form dependientes createform avanzados forms symfony

forms - personalizar - symfony formularios avanzados



Cómo obtener valores de formulario en el controlador Symfony2 (11)

Creo que para obtener los datos de solicitud, enlazados y validados por el objeto de formulario, debe usar este comando:

$form->getViewData(); $form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.

Estoy usando un formulario de inicio de sesión en Symfony2 con el siguiente código de controlador

public function loginAction(Request $request) { $user = new SiteUser(); $form = $this->createForm(new LoginType(), $user); if ($request->getMethod() == ''POST'') { $form->bindRequest($request); $data = $form->getValues(); // Need to do something with the data here } return $this->render(''GDSiteBundle::header.html.twig'', array(''form'' => $form->createView())); }

Pero recibo la siguiente advertencia:

Advertencia: array_replace_recursive () [function.array-replace-recursive]: Argumento # 1 no es una matriz en / vendor / symfony / src / Symfony / Component / Form / Form.php línea 593 500 Internal Server Error - ErrorException

¿Alguien puede ayudarme a entender qué es incorrecto y cómo puedo solucionarlo? Gracias.

Actualización: el archivo twig es algo como esto:

<div class="form"> {{ form_errors(form) }} <form action="{{ path(''site_user_login'') }}" method="POST" {{ form_enctype(form) }}> <div class="level1"> {{ form_row(form.username) }} <a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a> </div> <div class="level2"> {{ form_row(form.pwd_hash) }} <div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div> </div> <input type="submit" class="submit" name="login" value/> <div class="clr"></div> </form> </div>

Aquí está la función en el tipo de formulario

public function buildForm(FormBuilder $builder, array $options) { $builder->add(''username'', ''text'', array(''label'' => ''Username : '')); $builder->add(''pwd_hash'',''password'', array(''label'' => ''Password : '')); }

Aquí está la ruta:

site_user_login: pattern: /{_locale}/login defaults: {_controller: GDSiteBundle:SiteUser:login}


En Symfony 2 (para ser más específico, la versión 2.3) puede obtener datos de un campo

$var = $form->get(''yourformfieldname'')->getData();

o puede obtener todos los datos enviados

$data = $form->getData();

donde ''$ data'' es una matriz que contiene los valores de sus campos de formulario.


En Symfony> = 2.3, puede obtener el valor de los campos individuales con:

$var = $form->get(''yourformfieldname'')->getData();

Por otro lado, puedes usar:

$data = $form->getData();

PERO esto te daría dos cosas diferentes:

  • la entidad con valores poblados por el formulario, si su formulario tiene habilitada la opción de data-class (por lo tanto, está vinculada a una entidad); esto excluirá cualquier campo con la opción ''mapping'' => false

  • de lo contrario, una matriz con todos los campos del formulario


En las forms Symfony, hay dos tipos diferentes de transformers y tres tipos diferentes de datos subyacentes: En cualquier forma, los tres tipos diferentes de datos son:

  • Datos del modelo

    Estos son los datos en el formato utilizado en su aplicación (por ejemplo, un objeto Issue). Si llama a Form::getData() o Form::setData() , se trata de los datos del "modelo".

  • Datos de norma

    Esta es una versión normalizada de sus datos y es comúnmente la misma que su información de "modelo" (aunque no en nuestro ejemplo). No se usa comúnmente directamente.

  • Ver datos

    Este es el formato que se utiliza para completar los campos del formulario. También es el formato en el que el usuario enviará los datos. Cuando llamas a Form::submit($data) , los $ datos están en el formato de datos "ver".

Los dos tipos diferentes de transformadores ayudan a convertir ay desde cada uno de estos tipos de datos:

  • Transformadores modelo :

    transform() : "datos de modelo" => "datos de norma"
    reverseTransform() : "datos de norma" => "datos de modelo"

  • Ver transformadores :

    transform() : "datos normativos" => "ver datos"
    reverseTransform() : "ver datos" => "datos de norma"

Qué transformador necesitas depende de tu situación.

Para usar el transformador de vista, llame a addViewTransformer() .

Si desea obtener todos los datos del formulario:

$form->getData();

Si buscas un campo de formulario específico (por ejemplo, first_name ):

$form->get(''first_name'')->getData();


Lo hice funcionar por esto:

if ($request->getMethod() == ''POST'') { $username = $request->request->get(''username''); $password = $request->request->get(''password''); // Do something with the post data }

¡También debe tener la solicitud Request $ como parámetro en la función! Espero que esto ayude.


Ninguno de los anteriores funcionó para mí. Esto funciona para mí:

$username = $form["username"]->getData(); $password = $form["password"]->getData();

Espero que ayude.


Para los campos de formulario no mapeados, uso $ form-> get (''inputName'') -> getViewData ();


Si está utilizando la administración de seguridad de Symfony 2, no necesita obtener los valores contabilizados, solo necesita administrar la plantilla de formulario (consulte la documentation ).

Si no está utilizando la administración de seguridad de Symfony 2, le aconsejo encarecidamente que la use. Si no quiere o no puede, ¿puede darnos las fuentes de LoginType ?


Si tiene campos adicionales en el formulario que no está definido en Entity, $form->getData() no funciona, una de las formas podría ser esta:

$request->get("form")["foo"]

O bien:

$form->get(''foo'')->getData();


Simplemente :

$data = $form->getData();


private function getFormDataArray($form) { $data = []; foreach ( $form as $key => $value) { $data[$key] = $value->getData(); } return $data; }