Validando formulários com Zend Form, jQuery e Ajax.

Sabemos que validar formulários hoje em dia é uma obrigação de todo bom desenvolvedor. E não validar apenas no cliente usando javascript, mas validar também no servidor. Validação é o primeiro de muitos passos para tornar sua aplicação mais segura.

Uma técnica que eu acabei descobrindo recentemente e estou usando bastante é juntar o poder do componente Zend_Form com o beleza do jQuery, o que me trouxe resultados muito bons, principalmente nos quesitos qualidade e desenvolvimento ágil.

Para demostrar essa técnica que eu estou utilizando eu vou partir do pressuposto que você já esta familiarizado com o ambiente do Zend Framework. Partindo disso, vou mostrar o código simples do formulário de cadastro:

<?php

class Cadastro_Form extends Zend_Form {
        public function init() {
                $this->setAttrib(‘id’, ‘cadastro’)
                     ->setAction(‘/index/index’)
                     ->setMethod(‘post’);
                $this->addElement( ‘text’, ‘nome’, array(
                        ‘label’   => ‘Nome’,
                        ‘required’            => true,
                        ‘validators’    => array(
                                ‘NotEmpty’,
                                array(‘StringLength’, false, array(0, 60) )
                        )
                ));
                $this->addElement(‘text’, ‘email’, array(
                    ‘label’         => ‘E-mail’,
                    ‘required’      => true,
                    ‘validators’   => array(
                        ‘NotEmpty’,
                        ‘EmailAddress’
                    )
                ));
                $this->addElement( ’submit’, ’submit’, array(
                        ‘ignore’        => true,
                        ‘label’  => ‘Entrar’
                ));
                $this->getElement(’submit’)->removeDecorator(‘label’);
        }
}

Agora que nosso formulário de cadastro já é um componente do projeto, vamos fazer as paginas, vou supor aqui que estamos trabalhando no controller index, portando criaremos duas actions para que nosso controller aqui fique da seguinte maneira:

class IndexController extends Zend_Controller_Action {
        /** Nesta action iremos exibir o formulario */
        public function indexAction() {}
        /** Nesta action iremos receber o dados por ajax para validação */
        public function validarAction() {}
}

Temos o básico para começarmos a trabalhar. Agora a ideia é validarmos estes dados na tela do cliente via ajax, para que antes do cliente submeter os dados ele consiga visualizar os possíveis erros e já corrigi-los. Lembrando também que isso NÃO descarta a validação no servidor.

Vamos ver como fica nosso metodo indexAction():

public function indexAction() {
        $form = new Cadastro_Form;
        if ($this->_request->isPost()) {
                if ($form->isValid( $this->_request->getPost() )) {
                        $this->view->mensagem = ‘Formulario valido’;
                }
                else {
                        $this->view->mensagem = ‘Ops. Formulario invalido.’;
                        $form->populate( $this->_request->getPost() );
                }
        }
        $this->view->form = $form;
}

E agora nossa index.phtml

<?php if (isset($this->mensagem)) { ?>
<p><?php echo $this->mensagem; ?></p>
<?php echo $this->form; ?>

Não podemos esquecer de adicionar a biblioteca jQuery a nossa camada view, pois ela irá nos ajudar muito no processo, vejamos o nosso código javascript para a validação:

$(document).ready(function() {
        $(‘#submit’).bind(‘click’, function (e) {
                e.preventDefault();
                var nome = $(‘#nome’).val();
                var email = $(‘#email’).val();
                $.ajax({
                        url: ‘/index/validar’,
                        type: ‘post’,
                        dataType: ‘json’,
                        data: {
                                nome: nome,
                                email: email
                        }
                        success: function (data) {
                                $(‘.form-errors’).remove();
                                if (data == true) alert( ‘Passou…’ );
                                else {
                                        for (campo in data) {
                                                $(‘#’+campo).after(‘<ul id="’+campo+‘_errors" class="form-errors"></ul>’);
                                                for (mensagem in data[campo]) {
                                                        $(‘#’+campo+‘_errors’).append(‘<li>’+data[campo][mensagem]+‘</li>’);
                                                }
                                        }
                                }
                        }
                });
        });
});

Como vocês podem ver, nosso método validar irá retornar um objeto json para o jQuery poder trabalhar, e com o for iremos percorrer este objeto colocando cada mensagem em seu devido lugar. É um bom método por não fazer você ter que escrever duas validações, uma para javascript e outra para php. Você escreve apenas uma e utiliza em ambas as validações.

Agora nosso método validar:

public function validarAction() {
        if ($this->_request->isXmlHttpRequest()) {
                $form = new Cadastro_Form;
                echo $form->processAjax($this->_request->getPost());
        }
}

Como vocês viram, devido ao nosso componente de formulário já está pronto tudo ficou muito mais simples, com apenas algumas linhas validamos e retornamos o resultado para o javascript poder exibir ao usuário.

O resultado desta combinação é muito interessante, pois mantem nossa aplicação modularizada, de forma que para adicionar novos campos no nosso formulário de cadastro não é necessário se preocupar com html e validação javascript, basta editar o componente Cadastro_Form.

Qualquer duvida deixa nos comentários ai que vamos trocando uma ideia. :)

Referencias:
http://framework.zend.com/manual/en/zend.form.html
http://framework.zend.com/manual/en/zend.validate.html
http://docs.jquery.com/Ajax

Manipulando XML com a SimpleXML

Quando eu começei a trabalhar com XML, principalmente em aplicações ajax, eu custumava fazer XML na mão, como se fossem string’s. Funcionavam, é verdade, mas não era uma boa solução, e na epoca eu pensava que a SimpleXML só servia para ler xml. Ledo engano.

A SimpleXML é bem mais poderosa do que eu imaginava, ela pode manipular XML da forma que você precisar, seja apenas para leitura ou para alteração.

Vou mostrar algum codigo pra provar que a SimpleXML é realmente muito simples.

Instanciando um objeto para gerar um XML:

$xml = simplexml_load_string( ‘<?xml version="1.0" encoding="utf-8"?><root></root>’ );

Ou entao você pode carregar um arquivo XML:

$xml = simplexml_load_file( ‘arquivoXML.xml’ );

A partir disso você pode manipular o XML como quiser. Vamos supor que você queira adicionar nós com atributos. Dois metodos são importantes agora: addChild e addAttribute. Um exemplo do metodo addChild:

$xml->addChild(‘database’);

Isso geraria um xml assim:

<?xml version=“1.0″ encoding=“utf-8″?>
<root>
        <database></database>
</root>

Agora suponhamos que queremos adicionar um novo nó dentro de database chamado connection com varios atributos:

$xml->database->addChild(‘connection’);
$xml->database->connection->addAttribute(’server’, ‘localhost’);
$xml->database->connection->addAttribute(‘user’, ‘root’);
$xml->database->connection->addAttribute(‘pass’, ‘123′);
$xml->database->connection->addAttribute(’schema’, ‘tabela’);

Com os codigos acima nosso XML ficaria assim:

<?xml version=“1.0″ encoding=“utf-8″?>
<root>
        <database>
                <connection server=“localhost” user=“root” pass=“123″ schema=“tabela” />
        </database>
</root>

Viu como é simples manipular XML com a SimpleXML?
Ah, se você precisar apagar um nó é ainda mais simples, basta usar o velho e conhecido unset, assim:

unset( $xml->database->connection );

E se você precisar salvar essa XML em arquivo é só usar a função file_put_contents, assim:

file_put_contents( ‘arquivoSaida.xml’, $xml->asXML() );

Então é isso, qualquer duvida sobre manipulação de XML posta ae nos comentarios.

:)

Referencias:
Manual do PHP: http://br.php.net/manual/en/ref.simplexml.php

Sobre o 1 Encontro do PHP-MG

Então, aconteceu. Finalmente!

Cheguei a UNI-BH muito ansioso para o evento, e posso dizer que foi muito emocionante ver o auditorio lotado, e saber que as pessoas gostaram do evento. As palestras foram muito boas e o networking foi sensacional.

Eu e o Sandro

Fotos do evento no Flick: http://www.flickr.com/photos/21986800@N08/sets/72157617360166596/show/

PHP na linha de comando

Hoje começei a brincar com o php na linha de comando e a desenvolver um pequeno script para postar mensagens no Twitter. O que é mais legal é que finalmente eu encontrei uma forma de entrar com dados via linha de comandos.
No C, para entrarmos com dados fazemos assim:

printf(“Digite seu nome: “);
scanf(“%s”, nome);

Agora, no PHP muda um pouco, porem a ideia é a mesma:

echo ‘Digite seu nome: ‘;
$nome = fgets(STDIN);

Notem que na função fgets eu inserir a constante STDIN ao inves de um resource (arquivo por exemplo). Atraves dessa constante informamos ao php para buscar os dados na entrada padrão, que no caso é a linha de comando. Simples né? Porem eu realmente só aprendi isso hoje. :)
Tambem existe a constante STDOUT, que é a saida padrão.

Segue o codigo do pequeno script do Twitter que desenvolvi para quem quiser estuda-lo, e se acaso você melhora-lo, não deixe de me avisar postando um comentario aqui ou me mandando um email.

twitter.php

Flickr e PHP 5

Eu sempre defendo iniciar novos projetos em php 5 por alguns motivos:
- Programação Orientada a Objetos;
- Framework: uso muito o Zend Framework e ele só roda por cima do PHP 5;
- PHP 4 descontinuado.

Pois bem, agora eu tenho mais um grande motivo para defender o PHP 5 e ate para convencer algumas pessoas a migrarem suas aplicações de PHP 4 para a versão 5. Recentemente o Flick migrou de php 4 para php 5 e um dos resultados da migração é este grafico de consumo de CPU, que foi publicado por John Allspaw’s.

Incrivel né???

ps.: Quando eu digo que sempre defendo iniciar novos projetos usando php 5 é porque ainda existem pessoas por ai querendo iniciar novos e interessantes projetos em php 4, não me pergunte porque. :)

←Older