A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

7.5. Recuperar los datos del formulario desde una acción del controlador

El sitio web del usuario generalmente trabaja con el formulario en el siguiente orden:

Generalmente estas dos páginas web se generan en la misma acción del controlador.

En el siguiente ejemplo mostraremos como podemos crear una acción en el controlador para mostrar el formulario de contacto y recuperar los datos enviados por el usuario. Para comenzar agregamos la plantilla de vista contact-us.phtml dentro de la carpeta application/index que esta dentro de la carpeta /view del módulo (ver figura 7.6 para un ejemplo).

Figura 7.6. Crear el archivo contact-us.phtml Figura 7.6. Crear el archivo contact-us.phtml

Colocamos el código HTML del formulario de contacto que usamos en la sección anterior dentro del archivo de plantilla de vista.

Luego, agregamos el método de acción contactUsAction() a la clase IndexController. Con el método de acción queremos extraer los datos crudos del formulario de contacto que fue enviado por el usuario del sitio:

<?php
namespace Application\Controller;

// ...

class IndexController extends AbstractActionController
{
  // This action displays the feedback form
  public function contactUsAction()
  {
    // Check if user has submitted the form
    if($this->getRequest()->isPost()) {

	  // Retrieve form data from POST variables
	  $data = $this->params()->fromPost();

	  // ... Do something with the data ...
	  var_dump($data);
    }

    // Pass form variable to view
    return new ViewModel([
          'form' => $form
       ]);
  }
}

En el código de arriba definimos el método de acción contactUsAction() dentro de la clase IndexController (línea 9).

Luego en las línea 12 revisamos si la solicitud es una petición POST (revisando la primera línea de la petición HTTP). Generalmente, el formulario usa el método POST para enviar los datos. Por esta razón podemos detectar si el formulario se envío o no revisando la primera línea de la petición HTTP.

En la línea 15 recuperamos los datos crudos enviados por el usuario. Extraemos todas las variables POST con la ayuda del complemento para controladores Params. Los datos se regresan en forma de un arreglo y se guardan dentro de la variable $data.

Finalmente debemos agregar una ruta de tipo literal para hacer una URL corta y fácil de recordar para la página Contactanos. Agregamos la siguiente llave contactus a la configuración de rutas en el archivo module.config.php:

<?php
return [
  // ...
  'router' => [
    'routes' => [
      // Add the following routing rule for the "Contact Us" page
      'contactus' => [
        'type' => Literal::class,
          'options' => [
             'route'    => '/contactus',
             'defaults' => [
               'controller' => Controller\IndexController::class,
               'action'     => 'contactUs',
             ],
           ],
         ],
       ],
    ],
  ],
  // ...
];

Ahora si escribimos la URL "http://localhost/contactus" en la barra de navegación del navegador web deberíamos ver una página como la que se muestra en la figura 7.7.

Figura 7.7. Formulario de Contacto Figura 7.7. Formulario de Contacto

Ingresamos el correo electrónico, el asunto y el cuerpo de texto y hacemos clic en el botón Submit del formulario. Los datos serán enviados al servidor y finalmente extraídos en el método IndexController::contactUsAction().

Abajo se muestra una ejemplo del arreglo $data (producido con la función PHP var_dump()). Como podemos ver el arreglo contiene una llave para cada campo incluyendo el campo "submit".

array (size=4)
    'email' => string 'name@example.com' (length=16)
    'subject' => string 'Happy New Year!' (length=15)
    'body' => string 'Dear Support, I'd like to thank you for the
              excellent quality of your support service and wish you
              a Happy New Year!' (length=118)
    'submit' => string 'Submit' (length=6)

Top