4. Formulários

Criar, validar e filtrar formulários

Nós implementamos uma forma bem simples e produtiva de criar formulários, uma vez que um projeto normalmente dispõe de muitos formulários e isto acaba nos fazendo perder bastante tempo programando cada um deles.

A proposta do SuitUp não é monopolizar seu formulário e tomar conta dele, isso faz com que você perca o controle sobre alguns pontos e acaba gerando muitas dificuldades de alterações e personalizações. Nós queremos facilitar sua vida por isso automatizamos a parte chata e deixamos para você o HTML totalmente livre para ser alterado.

Criar

Vamos começar montando o HTML do formulário.

Arquivo: ModuleDefault/views/index/index.phtml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<form action="" method="post">

    <div class="input-group">
        <span class="input-group-addon">Nome *:</span>
        <input type="text" name="name" class="form-control" value="<?php echo isset($data['name']) ? $data['name'] : '' ;?>" />
    </div>
    <?php if (isset($form->messages['name'])): ?>
        <span class="text-danger"><?php echo implode("<br/>", $form->messages['name']); ?></span>
    <?php endif; ?>
    <br/>

    <div class="input-group">
        <span class="input-group-addon">E-mail:</span>
        <input type="text" name="email" class="form-control" value="<?php echo isset($data['email']) ? $data['email'] : '' ;?>" />
    </div>
    <?php if (isset($form->messages['email'])): ?>
        <span class="text-danger"><?php echo implode("<br/>", $form->messages['email']); ?></span>
    <?php endif; ?>
    <br/>

    <button type="submit" class="btn btn-success pull-right">
        <i class="fa fa-save"></i> Salvar
    </button>

</form>

Validação

Agora vamos a classe que irá fazer a validação e filtros do formulário. Você se lembra que comentamos la na [[1. Instalação]] que a estrutura de Form era opcional? Pois é, você pode colocar as classes de formulários onde quiser, mas nós recomendamos que sejam organizados os formulários segundo a estrutura de views

No arquivo abaixo, por exemplo, este formulário aparecerá na mesma view que segue sua estrutura, ou seja, ModuleDefault/views/index/index.phtml. Desse modo somente de olhar para uma view você sabe exatamente onde estará a classe do formulário.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
// File: ModuleDefault/Form/Index/Index.php

namespace ModuleDefault\Form\Index;

use SuitUp\FormValidator\AbstractFormValidator;

class Index extends AbstractFormValidator
{
    /**
     * Tudo que você tem que fazer é indicar aqui como
     * quer que seu formulário seja validado e filtrado.
     * 
     * Note que você pode criar métodos para validação
     * a sua maneira como o metodo randomTrueFalse()
     * 
     * O indice 'name' e 'email' são os nomes do campos no HTML.
     * 
     * @var array 
     */
    protected $data = array(
        'name' => array('validation' => array('notEmpty', 'randomTrueFalse'), 'filter' => array('trim')),

        // Exempo com validação do Zend
        'email' => array(
            'validation' => array(
                '\Zend\Validator\EmailAddress' => array(
                    'messages' => array(
                        \Zend\Validator\EmailAddress::INVALID => "Endereço de e-mail inválido",
                        \Zend\Validator\EmailAddress::INVALID_FORMAT => "Endereço de e-mail inválido",
                        \Zend\Validator\EmailAddress::INVALID_HOSTNAME => "Endereço de e-mail inválido",
                    )
                ),
            ),
            'filter' => array('trim'),
        )
    );

    /**
     * Exemplo de metodo para validacao, crie quantos quiser.
     * 
     * @param type $value
     * @return \stdClass
     */
    public function randomTrueFalse($value)
    {
        $result = new \stdClass();
        $result->error = false;
        $result->message = "";

        if ((mctime()%2) == 0) {
            $result->error = true;
            $result->message = "Randomicamente eu quero que dê erro";
        }

        return $result;
    }
}

Note que a validação de e-mail foi feita utilizando as validações do Zend Framework. Se você abrir o arquivo composer.json do SuitUp vai notar que os projetos do Zend para validações já estão inclusas. O Zend é um framework grande, muito bem testado com uma garantia de funcionalidade incrível, por isso nós aproveitamos para incluí-lo. Nós temos também diversos métodos que nós mesmos desenvolvemos para validações e filtros corriqueiros. Acompanhe a lista abaixo.

No controlador

Depois disso basta adequar o controlador para utilizar esta validação. Você só precisa instanciar a classe do formulário, verificar se houve post e se o formulário é válido.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace ModuleDefault\Controllers;

use Braghim\Enum\MsgType;

class IndexController extends AbstractController
{
    public function indexAction()
    {
        // Note que nos preferimos colocar o formulário a exemplo do caminho na URL
        // Assim fica mais fácil achar ele para dar manutenção.
        $form = new \ModuleDefault\Form\Index\Index();
        $data = array();

        // Houve post?
        if ($this->isPost()) {

            // Formulário é válido?
            if ($form->isValid()) {

                // Sim, aqui você prossegue com sua logica...
                $data = $form->getData();
                dump($data);

            } else {
                // Erro de formulário, adiciona mensagem geral e alimenta data para
                // preencher novamente os campos.
                $this->addMsg("Verifique os erros no formulário", MsgType::DANGER);
                $data = $form->getData();
            }
        }

        // Envia dados para view.
        return $this->addViewVar(array(
            'form' => $form,
            'data' => $data,
        ));
    }
}