Introdução ao Zend Form

Um dos melhores componentes do Zend Framework é sem duvidas o Zend Form, inclusive me arrisco a dizer que usar o ZF sem usa-lo é perda de tempo. O Zend Form nos ajuda a gerar formulários html e a valida-los com muita eficacia, e sua operação é extremamente simples. Vou dar um exemplo de como gerar um formulário de login usando-o. Eu não gosto muito de ficar falando de teoria portanto vou mostrar o exemplo todo comentado e espero que ele demostre com clareza o funcionamento do Zend Form.

Nota.: Eu estou partindo do pressuposto que você já tem um ambiente do ZF configurado, caso contrario recomendo a leitura deste artigo do Julio Martini no Imasters:
http://imasters.uol.com.br/artigo/4609/php/zend_framework_-_uma_visao_geral/

Arquivo do Controller: IndexController.php

/**
 * Controlador principal
 */

class IndexController extends Zend_Controller_Action {
       
        /**
         * Metodo Index
         */

        public function indexAction() {
               
                // Inclui o componente Zend Form
                require( ‘Zend/Form.php’ );
               
                // Instancia um novo formulario
                $form = new Zend_Form();
                // Configura o action e o method (para os dados serão enviados e através de que metodo (get ou post)
                $form->setAction(‘/index/index’)->setMethod(‘post’);
               
                // Instancia um campo do tipo texto
                $usuario_email = new Zend_Form_Element_Text(‘usuario_email’, array(
                        // Define o label do campo
                        ‘label’                 => ‘E-mail: ‘,
                        // Define que o campo é obrigatório (por padrão esta opção é falso)
                        ‘required’              => true,
                        // Adiciona filtros para o campo (estes filtros são elementos do Zend Validate)
                        ‘validators’    => array(
                                ‘NotEmpty’, // Define que este campo não pode ser vazio
                                ‘EmailAddress’ // Define que este campo deve ser um endereço de email valido
                        )
                ));
                // Adiciona as mensagens de erro
                $usuario_email->getValidator(‘NotEmpty’)->setMessages( array(
                        Zend_Validate_NotEmpty::IS_EMPTY        => ‘Este campo não pode ser vazio!’
                ));
                $usuario_email->getValidator(‘EmailAddress’)->setMessages( array(
                        Zend_Validate_EmailAddress::INVALID => ‘Email invalido!’
                        // Existem varias outras validções de email, inclusive de host valido!
                ));
                // Obs.: Por padrão as mensagens de erro do Zend Validate estão em inglês, em outro post mostrarei como traduzi-las
                // de uma só vez através do componente Zend Translate
               
               
                // Instancia um campo do tipo password
                $usuario_senha = new Zend_Form_Element_Password(‘usuario_senha’, array(
                        // Define o label do campo
                        ‘label’                 => ‘Senha: ‘,
                        // Define que o campo é obrigatorio (por padrão esta opção é falso)
                        ‘required’              => true,
                        // Adiciona os filtos
                        ‘validators’    => array(
                                array(‘NotEmpty’, true), // Não pode ser vazio
                                // Definimos aqui o tamanho da string para um valor entre 6 e 20 caracteres
                                array(‘StringLength’, false, array(6, 20))
                        )
                ));
                // Adiciona as mensagens de erro
                $usuario_senha->getValidator(‘NotEmpty’)->setMessages( array(
                        Zend_Validate_NotEmpty::IS_EMPTY        => ‘Este campo não pode ser vazio!’
                ));
                $usuario_senha->getValidator(‘StringLength’)->setMessages( array(
                        Zend_Validate_StringLength::TOO_SHORT   => ‘Senha deve ter mais de 6 caracteres’,
                        Zend_Validate_StringLength::TOO_LONG    => ‘String deve ter menos de 20 caracteres’
                ));
               
                // Instancia um campo do tipo checkbox para persistir a sessão do usuário
                $usuario_mantemLogado = new Zend_Form_Element_Checkbox(‘usuario_mantemLogado’, array(
                        // Define o label do campo
                        ‘label’                 => ‘Permanecer logado’
                ));
                // Aqui invertemos a ordem com que ele exibirá o label, deixando o mesmo após o campo
                $usuario_mantemLogado->getDecorator(‘label’)->setOption(‘placement’, ‘APPEND’);
                // Por padrão o Zend Form gera o label antes do campo (PREPEND)
               
                // Instancia um botão do tipo submit
                $submit = new Zend_Form_Element_Submit(‘submit’, array(
                        // Define o label do botão
                        ‘label’ => ‘Entrar’
                ));
                // Aqui removemos a tag <label>, ela não é necessária em um botão
                $submit->removeDecorator(‘label’);
               
                // Adiciona os campos ao formulário
                $form->addElements( array( $usuario_email, $usuario_senha, $usuario_mantemLogado, $submit ));
               
                // Vamos verificar se o formulário foi enviado
                if ($this->_request->isPost()) {
                       
                        // Obtém os dados do formulário
                        $data = $this->_request->getPost();
                       
                        // Verifica se o formulário é valido
                        if ($form->isValid( $data )) {
                               
                                // Aqui você define a ação de um formulário valido
                                 
                        }
                        // Caso o formulário não seja valido continuamos a executar a pagina para exibir as mensagens de erro do usuário
                       
                }
               
                // Coloca o formulário na view
                $this->view->form = $form;
               
        }
       
}

Arquivo da View: index/index.php

// Renderiza o formulário.
echo $this->form;
// Simples. Não?

Observações: Uma maneira melhor de trabalhar com o Zend Form é estendendo a classe Zend_Form e configurando seu formulário como um objeto, desta forma:

/**
 * Cria um formulário estendendo a classe Zend Form
 */

Class Form_Login extends Zend_Form {

        /**
         * Inicializa e configura o formulário
         * Por padrão todas as classes do Zend Framework usam um método init logo após o construtor,
         * é uma forma de estender as classes sem sobrescrever o construtor original
         */

        public function init() {
       
                // Configuração do form aqui!
       
        }
       
}

É isso ai. Teve duvidas? Deixa nos comentários ai.

Referências:

http://framework.zend.com/manual/en/zend.form.html

http://framework.zend.com/manual/en/zend.validate.html

Comments (5)

Márcio Pedrosafevereiro 28th, 2009 at 15:56

Saudações Diego!
Aqui é o Marcio do UNIBH, me adiciona ao messenger:
marciopedrosa.ti@hotmail.com ok?
Abraços!

Marcelojaneiro 28th, 2010 at 13:57

Mas essa classe Form_Login fica aonde na minha estrutura? No Controller?

Diego Henriquejaneiro 28th, 2010 at 14:04

A localização do arquivo depende de como você configurou sua aplicação.

Normalmente deve ficar em application/forms/Login.php

Mas como disse antes, depende de como você configurou sua aplicação.

Abraços

Cleitonmaio 24th, 2010 at 09:07

Amigo, vc tem algum material sobre a formatação do Zend Form? Eu tentei de várias formas formatar corretamente, mas em sucesso…

Posta um exemplo pra gente ai…

Diego Henriquejulho 16th, 2010 at 14:52

Cleiton

Meu blog ta um pouco abandonado mas vou ver se nas proximas semanas eu preparo um artigo sobre isso. :)

Abraços

Leave a comment

Your comment