Dec 30 2008

Escrevendo URLs no Zend Framework

Category: Framework, Php, TecnologiaMarcelo Rodrigues @ 15:40

O Zend Framework, assim com os demais frameworks que utilizam o padrão MVC, possui uma estrutura de roteamento para mapear e direcionar corretamente os seus controles e ações de acordo com determinada url requisitada pela aplicação. Também como os demais, possibilita a escrita de urls para estes controles na camada de visualização quando necessário, através dos “helpers”.

Infelizmente, o helper responsável pela escrita dessas urls ainda é bastante imaturo. A forma como deve ser feita esta tarefa é trabalhosa, chata e principalmente, improdutiva. Só o fato de ter de indicar “TODOS” os parâmetros para a escrita da URL em uma estrutura de array associativa soa como um paradoxo, já que o próprio framework possui mecanismos que fazem o parser na url requisitada, identificando os parâmetros necessários e passando-os ao roteador. Ou seja, é um retrabalho e não um reúso. Exemplo de uma url escrita da forma padrão em um arquivo de template.

<?php
echo $this->url(array(
 	'controller' => 'users',
 	'action'     => 'edit',
 	'id'         => 25
 	));
?>

A saída do exemplo será: /users/edit/id/25. Analisando a url, seria mais fácil simplesmente escrever da seguinte forma:

<?php
echo "/users/edit/id/25";
?>

Desta forma o resultado é mais rápido, porém, você perde em termos controle, já que a escrita é manual e se você alterar o nome do controle ou da ação, a url passará a ser inválida (a não ser que você use roteadores customizados).

A maioria dos frameworks, como Symfony, Cake etc, implementam tanto a forma de escrita com os parâmetros em um array, quanto uma string contendo a url desejada, fazendo a conversão automática dos mesmos para o formato padrão do framework ou da aplicação. O Symfony, por exemplo, implementa a escrita da seguinte forma:

<?php echo url_for('users/edit?id='. 25); ?>

O Symfony automaticamente converterá isso para o formato /users/edit/id/25. Considero essa forma muito mais elegante e produtiva, pois está mais próximo da realidade das urls “dinâmicas”. No entanto, se houver mais parâmetros, a coisa já começa a complicar.

Voltando a forma como o Zend Framework implementa este recurso, já se sabe que ele não é tão flexível assim, então é necessário criar um helper na camada de visualização para esta tarefa. Podemos inclusive, aproveitar o que já foi desenvolvido e é padrão do framework e encontra-se na pasta: Zend/View/Helper/Url.php.

#Zend/View/Helper/Url.php
class Zend_View_Helper_Url extends Zend_View_Helper_Abstract
 {
 	public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
 	{
 	$router = Zend_Controller_Front::getInstance()->getRouter();
 	return $router->assemble($urlOptions, $name, $reset, $encode);
 	}
 }

Crie um arquivo de helper com o nome que você quiser e o coloque no diretório de helpers da sua aplicação. O meu eu chamei de MyUrl.php. Crie neste arquivo a classe Zend_View_Helper_MyUrl. Dentro da classe, crie o método myUrl. É importante ressaltar que o nome do helper deve estar no nome do arquivo, como sufixo do nome da classe e como método principal, que é avaliado e chamado pelo objeto Zend_View ao ser requisitado no template.

O método myUrl terá os mesmos parâmetros do helper Url, com exceção que o primeiro parametro poderá tanto ser uma string quanto um array, então não é necessário tipá-la.

A classe então terá a seguinte estrutura.

<?php
require_once 'Zend/View/Helper/Abstract.php';
class Zend_View_Helper_MyUrl extends Zend_View_Helper_Abstract
 	{
 /**
 	* Return the URL
 	*
 	* @param string|array $urlOptions
 	* @param string       $name
 	* @param bool         $reset
 	* @param bool         $encode
 	* @return string
 	*/
 	public function myUrl($urlOptions, $name = null, $reset = false, $encode = true)
 	{
 	$front  = Zend_Controller_Front::getInstance();
 	$router = $front->getRouter();
 if (is_string($urlOptions)) {
 	$urlOptions = '/'. ltrim($urlOptions, '/'); // Case the first character is a '?
 	$request = new Zend_Controller_Request_Http(); // Creates a cleaned instance of request http
 	$request->setBaseUrl($front->getBaseUrl());
 	$request->setRequestUri($urlOptions);
 	$route = $router->route($request); // Return the request route with params modifieds
 	$urlOptions = $route->getParams();
 	}
 	return  $router->assemble((array) $urlOptions, $name, $reset, $encode);
 	}
 	}

Salvo o helper, é só utilizá-lo. Agora ele suporta todos os formatos:

<?php echo $this->myUrl(array(
 	'controller'=> 'users,
 	'action'    => 'edit,
 	'id'        => 25
 	)); ?>

ou

<?php echo $this->myUrl('users/edit?id=25'); ?>

ou

<?php echo $this->myUrl('users/edit/id/25'); ?>

Muito mais simples, elegante e bem produtivo!

É possível ainda utilizar os outros parâmetros do helper padrão, como o nome do roteador a ser utilizado para formatar a url, se o mesmo vai ou não utilizar a url base ou somente a partir da atual e se a url será codificada ou não - bastante útil para utilizar como valor de outros parametros. ;-)

Até a próxima.

Tags: , , , , , ,


Nov 20 2008

Zend Framework 1.7

Category: Php, TecnologiaMarcelo Rodrigues @ 09:33

Já está disponível a versão 1.7 do Zend Framework. Vários aprimoramentos importantes foram incluídos. Claro, o destaque, sem dúvida alguma, é para o componente AMF (que pode ser baixado separadamente), para criação de aplicativos remotos Flash com PHP.

Além do suporte ao AMF, os componentes FileTransfer e ProgressBar foram dois adicionais importantes para upload e download de arquivos e verificação do status de envio e carregamento de arquivos, respectivamente. Mas, ainda precisam amadurecer bastante, pois há muita coisa não implementada, principalmente no FileTransfer, que não tem implementação para download e somente suporta o protocolo HTTP.

Um componente bacana que fazia muita falta era o de paginação, que no ZendFramework, serve não só para paginar resultados de consultas de banco, mas também para datasources oriundos de xmls, arrays, desde que os mesmos implementem ou a interface Iterator. Como é quase certo que boa parte da utilização desse componente é com banco de dados, implementaram agora o suporte ao Zend_Db_Table. Isso é muito importante na hora de paginar, pois o Paginator apenas implementava a paginação e executa os resultados retornando um objeto ArrayIterator apenas, dificultando bastante a tarefa de paginar os resultados de uma tabela extendida do Zend_Db_Table, que teria que ser feito manualmente pelo método limit no select da tabela. Agora o paginator já faz isso, bastando apenas passar o objeto da tabela, que o fará utilizar o adaptador DbTableSelect.

Outra novidade, é o ZendX, que nessa versão, traz o componente Zend_JQuery, que suportará métodos para escrita de código javascript na camada de visualização. Isso é um passo importante, pois o Zend Framework já suporta o Dojo, e como há uma variedade frameworks javascript, é interessante esse suporte. O mais legal é que não será preciso dizer ao script de visualização que componente você utilizará, mas, apenas escrever o método relativo a funcionaliadde javascript que deseja e o framework se encarrega do resto. Como o jQuery é praticamente o mais famoso e mais utilizado hoje, é certo que esse componente fará uma grande diferença no futuro.

Também foi promovido ao incubator, o Zend_Tool, componente que proverá classes para geração de código Php, interface em linha de comando para criação e gerenciamento de projetos MVC em ZendFramework, que para mim era o que faltava para ser de fato o melhor framework, pois há muito tempo os demais já ofereciam essa opção, como o Symfony. Alías, esse será o foco do framework na versão 1.8, o desenvolvimento rápido de aplicações, ou RAD, do termo em inglês, para os íntimos.

Na integração de serviços, foi aperfeiçoado o suporte ao GData e adicionado suporte ao Twitter.

O Zend Framework 1.7 está disponível para download here.

Tags: , , , , ,


Sep 05 2008

Zead Project

Category: GeralMarcelo Rodrigues @ 16:51

Estou iniciando um projeto pessoal, o Zead, uma aplicação para construção e gerenciamento de cursos para educação a distância em formato hipertextual (HTML), através de interface web. 

O projeto está hospedado no Google Code sob a licença BSD (provisoriamente) e Creative Commons. 

Ah, se o nome lhe parece estranho ou familiar, é porque é mesmo. A letra Z é de Zend Framework, já que o projeto é baseado todo nele, e EAD, de educação a distância. 

Em breve mais detalhes do projeto. :)

Tags: , , , ,


Jul 24 2008

Zend Framework 1.6 RC1

Category: FrameworkMarcelo Rodrigues @ 11:49

Já está disponível a versão 1.6rc1 do Zend Framework. Olhando rapidamente as mudanças desta nova versão, considerei algumas como excelentes e até demoradas para um framework maduro como o Zend. Nos meus últimos trabalhos, o adotei como o framework oficial para aplicações MVC, e foi uma grande experiência. Fiquei muito satisfeito tanto com o resultado final quanto com a produtividade.

Mesmo assim, tive algumas necessidades de implementação, principalmente aquelas relacionadas a banco de dados, que acabei desenvolvendo eu mesmo. Não foi uma tarefa tão difícil, já que o framework oferece os recursos de plugins/helpers, bastando estender as classes nativas do framework e implementar as funcionalidades que necessitava.

A paginação de resultados do banco tanto na camada de visualização quanto na própria abstração do banco e o envio de arquivos por upload foram os recurso que eu precisei implementar na unha mesmo. Para minha grata surpresa, esta nova versão do framework traz dois componentes que fazem exatamente essas tarefas, o Paginator e File Transfer.

Mas como bom beta tester que sou, já vou começar a explorar as novas mudanças até o lançamento da versão final, que deve sair até o fim do ano, presumo.

Tags: , , , ,


May 03 2008

Reestréia

Category: CotidianoMarcelo Rodrigues @ 00:27

Mais uma reestréia. Dessa vez em um domínio próprio e que espero ser definitivo. Assim vou ter mais liberdade para gerenciar não só o site, mas também o site de clientes para quem desenvolvo sites e aplicações. 

Não pretendo dar ao blog um ar de site “formador de opinião”. Como é um site pessoal, o intuito aqui é apenas compartilhar uma ou outra informação que por ventura seja comum a outros desenvolvedores. E claro, também divulgar meus trabalhos. 

Que esta reestréia seja próspera.


Nov 26 2007

Postando diretamente do Microsoft Word 2007

Category: Cotidiano, Opinião, TecnologiaMarcelo Rodrigues @ 00:29

Um, dois, três…testando.

Sim, é apenas um teste….ou não. Instalei o Office 2007 e estou testando seus recursos. Confesso que não sou fã de ferramentas de escritório e nem tenho essa necessidade de utilização constante, a não ser o Word para textos esporádicos de manuais e relatórios no trabalho ou trabalhos de faculdade e ainda assim em raras ocasiões. Acho que uso mais o Excel, para fazer as continhas a pagar no mês e às vezes para importar, formatar e exportar alguns dados, geralmente de bancos de dados, tabelas HTML e arquivos textos separados por tabulação. E só!

Até que estou gostando desta nova suíte. Mesmo sendo um adepto da utilização de softwares de código aberto, ainda tenho preferência por alguns softwares licenciados para algumas tarefas e para escritório não é diferente. E sim, já utilizei Open Office, BrOffice , mas sinceramente, não gostei muito, mesmo torcendo pelo sucesso dela, principalmente por utilizar o formato OpenDocument, que é o único fator lamentável no Office.

Mas, o resultado final realmente é muito bom. A mudança na interface melhorou muito a experiência de usuário. A meu ver, apenas transformaram os comandos localizados nos clássicos menus rollover no canto superior esquerdo para o esquema da abas. Mas estão bem mais organizadas, agrupadas por temas e funções, acompanhadas em sua maioria de ícones e elementos visuais, que tornam a interface bem mais intuitiva.

E esta postagem, com uma singela mini-resenha das “velhas” novidades do Office, está sendo redigida, ou melhor, foi redigida e publicada diretamente do novo Word. Sim, agora ele conta com uma nova funcionalidade que já é bem conhecida e velha em outros pequenos programas, que permite escrever e postar diretamente em um Blog. E na lista de provedores de serviços, estão os mais conhecidos e o Wordpress marca presença. Basta criar um novo documento, selecionar blog e serão solicitados os dados de tipo de provedor, endereço do provedor, usuário e senha. Feito isso, é só escrever e publicar.

Ponto pro Office!

Tags: ,


Jun 16 2007

1º Encontro Brasileiro de Arquitetura da Informação

Category: TecnologiaMarcelo Rodrigues @ 03:43

Saiu hoje no Revolução Etc.

Se eu tiver condições de ir, estarei presente com certeza. Apesar do meu foco profissional ser o desenvolvimento mais voltado para programação, gosto muito também desta parte de arquitetura da informação. Aliás, qualquer coisa relacionada a gestão da tecnologia da informação, me interesso. Arquitetura principalmente, depois que participei de alguns projetos de reestruturação de alguns sites, atuando desde o rascunho do projeto, análises, desenhos, protótipos até a implementação e publicação final. Enfim, só quem pariticipa, sabe o quão importante é arquitetura da informação e de quanto essa é uma parte da gestão da informação que merece realmente uma profissionalização.

 A quem interessar, fica aí dica. Ah, o link para o site do evento é este: http://www.aibrasil.org/encontro/home/

Tags: ,


Jun 11 2007

Safari para Windows

Category: TecnologiaMarcelo Rodrigues @ 22:03

Saiu a versão para Windows.

Sendo sincero, não gostei. Já quando li o post no Tableless e fui comentar, o bicho travou. Não consegui nem vizualizar os campos do formulário de comentários. Mas enfim, vai ver que dei azar. Algumas listas não ordenadas de alguns sites ficaram totalmente desalinhadas.

Pra falar a verdade, tem gente dizendo que foi  uma bela jogada da Apple para abocanhar uma fatia do mercado de browsers. Já eu penso que foi um tiro no pé, pelo menos por enquanto, porque se preocuparam mais em lançar o Browser para Windows adaptado muito porcamente.

Sinceramente, acho que uma das vantagens da Apple é que tudo nela é bonitinho, mas somente no que diz respeito ao seu sistema. Já tentei rodar várias coisas com visual a la maçã e não gostei nenhum um pouco. Com o Saffari não foi diferente. As fontes renderizam muito diferente do Windows, talvez pela engine KHTML não ser tão amigável no Windows quanto no Linux e Mac. A interface do Browser também poderia deixar de imitar o visual do MAC e entrar pra cara de Windows mesmo, deixando o usuário mais livre a escolha de como deve ficar, afinal se o cara muda o tema do Windows, a tendência é também a interface do browser mudar um pouco, mas isso não acontecerá no Safari.

Mas bem, apenas uma singela opinião. Vou deixar instalado aqui, afinal, para desenvolvimento foi uma bela notícia.

Até a próxima.

Tags: , ,


May 05 2007

Yahoo! fechará antigo serviço de fotos sem migrar usuários

Category: Opinião, TecnologiaMarcelo Rodrigues @ 19:52

Se tem uma coisa que considero fator essencial quando um serviço ou empresa é comprada por outra empresa, é o respeito ao cliente, desde o atendimento até a preservação de suas informações. Mas nem sempre isso acontece, não é mesmo?

Para falar a verdade, sou mais fã do Google, abertamente, não só pela criatividade dos caras, mas também pela estratégia de oferecer serviços. Tá, vá lá que com o Docs & Spreadsheets deram uma vacilada na interface, que eu particularmente achava bem melhor quando ainda era o Writely. Mesmo assim, os caras primam por essa qualidade no que diz respeito ao usuário ou cliente, seja do próprio serviço, ou do que eles adquiriram.

Mas bem, todo mundo sabe que o Yahoo! é dono do Flickr, famoso serviço de publicação de fotos baseado em Web 2.0 (blergh). Sabe-se também que a base de usuários do Flickr foi integrada ao Yahoo!. Mas uma coisa nessa integração (?) eu achei um vacilo muito grande e por isso citei o Google, pos eles não vacilaram nesse ponto ao comprar e integrar serviços a sua base, como o Writely, Analytics entre outros, onde a conta do Google é válida para acessar ambos os serviços, aproveitando, os dados e documentos do usuário que por ventura utilizasse os outros serviços antes de serem adquiridos pelo Google.

Exemplo, o Writely. Eu possuía uma conta lá antes mesmo de ser adquirido pelo Google, e logo após a compra do serviço, o Google desenvolveu uma interface para que você unificasse a sua conta com a conta antiga do Writely, importando desta forma os documentos na base antiga para a nova base do Docs & Spreadsheets. Ou seja, houve um total respeito ao usuário (cliente) no que diz respeito a preservação de suas informações.

Mas, parece que isso não está sendo levado em conta no Yahoo!, e mesmo nesse meio tempo em que o Flickr esteve em suas mãos, não desenvolveram uma estratégia para que os usuários do serviço de fotos do site pudesse migrar automaticamente em poucos passos, sem necessidade de backup, suas fotos para a base do Flickr. Preferiram adotar a estratégia de avisar aos usuários sobre a desativação do serviço e pedir para transfiram manualmente seus arquivos para uma nova conta do Flickr.

Agora pense comigo, quantos usuários utilizam o serviço e precisarão migrar antes de o serviço ser desativado? Imagino que milhões. Alguém duvida que essa estratégia não foi das melhores?

Quer saber mais, clique aqui e aqui.

Tags: , , , ,


Apr 26 2007

Desenvolvendo no padrão MVC com Zend Framework

Category: Framework, Php, TecnologiaMarcelo Rodrigues @ 18:54

Quando se fala de desenvolvimento no padrão MVC com o PHP a primeira palavra que se vém a mente é framework. E pesquisando sobre essa palavra, iremos encontrar uma vasta lista de ambientes. Desta lista, já testei o Symfony, Cake, CodeIgniter e QCodo. Até agora, nenhum satisfez minhas necessidades completamente, talvez por serem fechados ou pesados demais, esta é minha a opinião. Mas isso até eu começar a estudar o Zend framework, que não é exatamente um framework, mas sim um conjunto de componentes prontos que oferecem funcionalidades para se montar um framework de desenvolvimento no padrão MVC, como também utilizar os mesmos componentes em aplicações que não usem necessariamente este padrão.

A proposta dele é excelente, o que possibilita digamos, da criação do seu próprio framework, com a estrutura (scaffold) criada a sua maneira. Existem excelentes artigos já em português falando sobre ele, além de um manual completo de utilização. Por isso não vou me estender falando sobre ele.

Uma das dificuldades de alguns desenvolvedores que começaram a utilizá-lo e alvo de constantes questionamentos é a falta do componente que implementa a camada Model. Apesar de já possuir uma bom componente para abstrair o banco de dados e manipular seus dados sem a necessidade de muitos comandos SQL, a camada model ainda faz uma falta, mesmo não sendo um problema grave, já que é possível utilizar qualquer biblioteca que faça o mapeamento objeto relacional como o Lumine, Propel, Doctrine entre outros. Mas ao utilizar qualquer uma dessas bibliotecas, o componente Zend_Db acaba perdendo um pouco a sua utilidade.

Por isso, resolvi escrever e tentar submeter este componente ao core do ZendFramework. Até o momento tenho duas classes escritas parcialmente em testes: Zend_Model e Zend_Model_Import. A primeira classe mapeia o diretório onde estão as entidades e as carrega a medida que forem sendo necessárias, usando um arquivo XML gerado que armazena dados de conexão ao banco ou simplesmente usando uma conexão já feita anteriormente. A segunda classe lista as tabelas do banco e gera as classes das entidades do modelo automaticamente ou importa a partir de um xml contendo todo o esquema do banco.

Nos próximos posts vou mostrar mais ou menos como estou implementando essa camada e coletar sugestões para futuras alterações, antes de submetê-la.

Até a próxima.

Tags: , , , , , , , , , , ,


Next Page »