Ver índice de contenidos del libro

10.1. Mostrando un formulario

Un formulario de contacto sencillo que incluya los campos de nombre, email, asunto y mensaje suele mostrarse de la siguiente forma:

Contact form

Figura 10.1 Contact form

En Symfony los formularios son objetos que se definen en la acción y se pasan a la plantilla. Para mostrar un formulario, primero tienes que definir sus campos, que en Symfony se llaman widgets. La forma más sencilla de hacerlo consiste en crear un nuevo objeto de tipo sfForm dentro del método de la acción.

// en modules/mimodulo/actions/actions.class.php
public function executeContacto($request)
{
  $this->form = new sfForm();
  $this->form->setWidgets(array(
    'nombre'  => new sfWidgetFormInputText(),
    'email'   => new sfWidgetFormInputText(array('default' => '[email protected]')),
    'asunto'  => new sfWidgetFormChoice(array('choices' => array('Asunto A', 'Asunto B', 'Asunto C'))),
    'mensaje' => new sfWidgetFormTextarea(),
  ));
}

El método sfForm::setWidgets() espera un array asociativo que contiene el nombre y el objeto de cada widget. Los objetos sfWidgetFormInputText, sfWidgetFormChoice y sfWidgetFormTextarea son algunos de los muchos widgets predefinidos en Symfony. Más adelante se muestra la lista completa de widgets disponibles.

El ejemplo anterior muestra dos de las opciones que puedes utilizar en los widgets: default establece el valor del widget y lo pueden definir todos los widgets. La opción choices es específica de los widgets de tipo choice (que se muestran como una lista desplegable) y define los valores entre los que puede elegir el usuario.

La acción mimodulo/contacto define el objeto del formulario y se lo pasa a la plantilla contactoSuccess mediante la variable $form. La plantilla utiliza esta objeto para mostrar en la página HTML las diferentes partes del formulario. La forma más sencilla de hacerlo es mediante el código echo $form, que muestra todos los campos del formulario junto con sus etiquetas. También puedes utilizar el objeto del formulario para generar la etiqueta del formulario:

// en modules/mimodulo/templates/contactoSuccess.php
<?php echo $form->renderFormTag('mimodulo/contacto') ?>
  <table>
    <?php echo $form ?>
    <tr>
      <td colspan="2">
        <input type="submit" />
      </td>
    </tr>
  </table>
</form>

Symfony sólo necesita la información pasada al método setWidgets() para mostrar correctamente todo el formulario. El resultado es un formulario idéntico al de la imagen anterior y cuyo código HTML se muestra a continuación:

<form action="/frontend_dev.php/mimodulo/contacto" method="POST">
  <table>
    <tr>
      <th><label for="name">Nombre</label></th>
      <td><input type="text" name="nombre" id="nombre" /></td>
    </tr>
    <tr>
      <th><label for="email">Email</label></th>
      <td><input type="text" name="email" id="email" value="[email protected]" /></td>
    </tr>
    <tr>
      <th><label for="asunto">Asunto</label></th>
      <td>
        <select name="asunto" id="asunto">
          <option value="0">Asunto A</option>
          <option value="1">Asunto B</option>
          <option value="2">Asunto C</option>
        </select>
      </td>
    </tr>
    <tr>
      <th><label for="mensaje">Mensaje</label></th>
      <td><textarea rows="4" cols="30" name="mensaje" id="mensaje"></textarea></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" />
      </td>
    </tr>
  </table>
</form>

Cada widget se muestra en una fila de tabla, con su correspondiente etiqueta <label> para el título y otra etiqueta para introducir los datos. Symfony deduce el título a partir del nombre del widget y lo pasa a mayúsculas (el nombre del widget asunto se tansforma en Asunto). La etiqueta para introducir datos depende del tipo de widget. Symfony añade además un atributo id a cada etiqueta HTML, cuyo valor también se obtiene a partir del nombre del widget. Por último, todo el código generado cumple con la sintaxis del lenguaje XHTML.