Tableless

Busca Menu

Formulário sem Model no CakePHP 3.x

Seja o primeiro a comentar por

Requisitos do artigos:
– Ter o CakePHP 3 instalado ( Artigo de como instalar o Cakephp 3.x)

O que aprenderemos:

  • Como trabalhar com formulários que não necessitam de um Model.
  • Criar uma página de contato.

Formulários

Na maioria das vezes, trabalhamos com formulários relacionados a um Model para persistir dados. Outras vezes precisamos validar os dados de um formulário onde não há persistência, como é no caso de um Formulário de Contato. Para tal tarefa, o CakePHP 3.x nos disponibiliza o que chamamos de Modelless Forms.

Para começar, precisamos criar uma pasta chamada ‘Forms’ dentro do diretório ‘app\src’. Para exemplificar vamos assumir que iremos criar um formulário de contato básico com nome, email e mensagem.

Na pasta Forms, crie um arquivo chamado ‘ContactForm.php’ com o seguinte conteúdo:

namespace App\Form;
use Cake\Form\Form;
use Cake\Form\Schema;
use Cake\Validation\Validator;
class ContactForm extends Form
{
 /*
 * Cria schema do formulário
 * @param Schema object
 * @return Schema object
 */
 protected function _buildSchema(Schema $schema)
{
 return $schema->addField('name', 'string')
 ->addField('email', ['type' => 'string'])
 ->addField('body', ['type' => 'text']);
}
/*
*Add regras de validação aos campos do formulário
* @param Validator object
* @return Validator object
*/
protected function _buildValidator(Validator $validator)
{
 return $validator->add('name', 'length', [
 'rule' => ['minLength', 10],
 'message' => 'Campo nome é obrigatório'
 ])->add('email', 'format', [
 'rule' => 'email',
 'message' => 'Endereço de e-mail inválido',
 ]);
}
/*
* Envia e-mail com os dados do contato
* @param array $data dados da requisição
* @return bool true caso tenha enviado o e-mail com sucesso
*/
protected function _execute(array $data)e
{
// Send an email.
return true;
}
}

Linha 1:4 — Declaramos o namespace e importamos classes que iremos utilizar.

Linha 5 — Declaração da classe, obrigatório o sufixo Form tanto na declaração da classe como no nome do arquivo, Modelless Forms devem obrigatoriamente estender da classe Form.

Linha 12:17 — Método ‘_buildSchema‘, recebe como parâmetro um objeto do tipo Schema. É usado para definir o esquema de dados que será utilizado pelo FormHelper para criar o formulário html. É possível definir o tipo do campo, tamanho do campo e precisão. Este método deve retornar o próprio objeto Schema.

Linha 23:32 — Método ‘_buildValidator‘, recebe como parâmetro um objeto do tipo Validator. É usado para definir o esquema de validação do formulário quando processado. É possível definir várias regras de validação para mesmo campo. Este método deve retornar o próprio objeto Validator. Veja mais regras e opções em: http://book.cakephp.org/3.0/en/core-libraries/validation.html. Em breve irei publicar um artigo sobre Validação de dados.

Linha 38:~ — Método ‘_execute‘, recebe como parâmetro um array contendo os dados da requisição ou no caso os dados do formulário que o usuário preencheu. O retorno deste método é de acordo com a implementação.

Processando o Formulário

Uma vez definida a classe do formulário, temos agora de processa-lo, para isto podemos utilizar um Controller. Na pasta ‘app\src\Controller’ crie um arquivo chamado ‘ContactController.php’ com o seguinte conteúdo.

namespace App\Controller;
use App\Controller\AppController;
use App\Form\ContactForm;
class ContactController extends AppController
{
  /*
  * Exibe e processa o formulário de contato caso seja uma requisição post
  * @return void\Response
  */
public function index()
{
 $contact = new ContactForm();
 if ($this->request->is('post')) {
 if ($contact->execute($this->request->data)) {
 $this->Flash->success('Mensagem enviado, aguarde nosso retorno.');
} else {
 $this->Flash->error('Ocorreu um problema ao enviar sua mensagem.');
}
}
 $this->set('contact', $contact);
}
}

Linha 13 — Verificamos se a requisição é do tipo ‘POST’.

Linha 14 — Caso seja, tentamos processar o formulário executando o método ‘execute()’ que recebe como parâmetro os dados da requisição que estará disponível no método ‘_execute’ do Form. Ao executar o método ‘execute’, automaticamente o formulário irá tentar validar os dados de acordo com sua implementação do método ‘_buildValidator’, se a validação passar, só então o método ‘_execute’ é chamado.

Linha 20 — Envia o objeto do formulário à view para ser utilizado no FormHelper.

Capturando erros de validação

Para capturar os erros de validação, utilize o método ‘errors()’ do objeto do formulário, veja abaixo um exemplo:

// Na action do controller
public function index()
{
 $contact = new ContactForm();
 $erros = [];
 if ($this->request->is('post')) {
 if ($contact->execute($this->request->data)) {
 $this->Flash->success('Mensagem enviado, aguarde nosso retorno.');
} else {
//Captura erros
 $erros = $contact->errors();
 $this->Flash->error('Ocorreu um problema ao enviar sua mensagem.');
}
}
 $this->set('contact', $contact);
 $this->set('erros',$erros);
}

O método ‘errors’ retorna um array com a listagem de campos que não estão válidos, sendo os índices os nomes dos campos e os valores as mensagens de erro.

Exibição do Formulário

Para que o formulário seja exibido para usuário, crie uma view no diretório ‘app\src\View\Template\Contact’ com o nome ‘index.ctp’ e o seguinte conteúdo:

Por enquanto é só galera, em breve irei publicar como enviar os dados do formulário para um e-mail.

Qualquer dúvida, estou a disposição para ajudar.

Abraços!

Publicado no dia