Formulario de contacto en cakephp 3.0

En las versiones anteriores a la 3.0 era necesario declarar un modelo explícito para crear un formulario de contacto para nuestro proyecto. Obviamente el objetivo de los modelos es mantener información persistente en el tiempo, salvando finalmente dicha información en una tabla. En el caso de los formularios de contacto, la mayoría de las veces, esa información se envía por correo electrónico al interesado, haciendo claramente innecesario el uso de un modelo. En las versiones 3.x han implementado una subclase Form que permite gestionar los datos de nuestro formulario sin la necesidad de un modelo. Dicho objeto permite implementar las reglas de validación de los campos del formulario.

A continuación desarrollaremos un ejemplo completo para entender mejor como funciona la nueva clase Form.

// in src/Form/ContactForm.php
namespace App\Form;

use Cake\Form\Form;
use Cake\Form\Schema;
use Cake\Validation\Validator;

class ContactForm extends Form
{

    protected function _buildSchema(Schema $schema)
    {
        return $schema->addField('name', 'string')
            ->addField('email', ['type' => 'string'])
            ->addField('body', ['type' => 'text']);
    }

    protected function _buildValidator(Validator $validator)
    {
        return $validator->add('name', 'length', [
                'rule' => ['minLength', 10],
                'message' => 'A name is required'
            ])->add('email', 'format', [
                'rule' => 'email',
                'message' => 'A valid email address is required',
            ]);
    }

    protected function _execute(array $data)
    {
        // Send an email.
        return true;
    }
}
        

El el ejemplo anterior podemos ver 3 métodos que proporciona la clase form:

  • _buildSchema, se usa para definir el esquema datos a utilizar por FormHelper para crear el formulario en HTML. Aquí es donde se definen las características de los campos, como su longitud, tipo y precisión.
  • _buildValidator, es una instancia de  Cake\Validation\Validator y en este método se definen las reglas de validación de los campos.
  • _execute, necesita poca explicación. Aquí es donde desarrollamos la lógica de "qué hacer" con los datos del formulario una vez ha sido validado. Normalmente enviar un correo electrónico, o visualizarlos en pantalla.

En esta clase podemos definir métodos públicos adicionales en caso de necesitarlos.

Procesando el formulario en el controlador

Una vez que hemos definido la clase Form, ya la podemos usar desde el controlador:

// In a controller
namespace App\Controller;

use App\Controller\AppController;
use App\Form\ContactForm;

class ContactController extends AppController
{
    public function index()
    {
        $contact = new ContactForm();
        if ($this->request->is('post')) {
            if ($contact->execute($this->request->getData())) {
                $this->Flash->success('We will get back to you soon.');
            } else {
                $this->Flash->error('There was a problem submitting your form.');
            }
        }
        $this->set('contact', $contact);
    }
}
    

En el código anterior, usamos el método execute para ejecutar nuestro formulario, este únicamente es ejecutado cuando pasa el proceso de validación, mostrando el mensaje Flash correpondiente. Podríamos haber usado el método validate para únicamente validar los pasados al formulario.

Capturando los errores del formulario

Una vez que se ha realizado la validación podemos cargar en una variable de nuestro controlador los errores generados por los campos del formulario:

$errors = $form->errors();
/* $errors contains
[
    'email' => ['A valid email address is required']
]
*/

Vista del formulario

Contenido del fichero index.ctp

echo $this->Form->create($contact);
echo $this->Form->control('name');
echo $this->Form->control('email');
echo $this->Form->control('body');
echo $this->Form->button('Submit');
echo $this->Form->end();

Volver al índice del blog