Categorias
CakePHP Desenvolvimento Web PHP

CakePHP: Plugin Locale

Vamos falar um pouco sobre outro plugin para CakePHP que surgiu no coração da Radig: o Locale.

Meu amigo José Agripino já apresentou o plugin no próprio blog da Radig, mas como reescrevi quase que totalmente o plugin nos últimos dias, acredito ser a hora de falar dele novamente.

Nada melhor para ver a utilidade de algo como imaginar uma situação de uso real, então vamos lá…

Cenário 1: você desenvolve um sistema para brasileiros, e quer permitir a entrada de informações em formato local, isto é, datas com dia/mês/ano e números com vírgula separando decimais. O problema é que estes dados são inválidos em um banco de dados convencional (como MySQL e PostgreSQL). Ao tentar salvar uma data formatada com dia/mês/ano você receberá um erro como resposta. Como resolver isso? Use o behavior Locale no seu modelo.

Basta adicionar o behavior Locale no modelo que ele fará a conversão de datas e números para o formato americano.

public $actsAs = array('Locale.Locale');

É possível converter automaticamente datas, datas acompanhadas de horas e decimais/floats.

Cenário 2: você já tem os dados do seu usuário armazenados no banco (formato padrão/americano) e quer apresenta-los em um formato local na sua View, o que fazer? Use o Helper Locale em sua view. Primeiro ative o helper no seu controller:

public $helpers = array('Locale.Locale');

Agora basta usa-lo na view:

echo $this->Locale->date($this->data['User']['birthday']);

É possível formatar data, data com hora, data literal (quarta-feira 18 de abril de 2012, por exemplo), decimais como 53,42 e valores monetários ( R$ 53,42 ).

Além do Behavior e do Helper, você pode carregar as libs Localize e Unlocalize em qualquer parte de seu sistema para converter entre os dois diferentes formatos. As libs são estáticas e suportam aninhamento de método, assim você pode fazer:

echo Localize::setLocale('pt_BR')->decimal(12.45); // 12,45

A unica configuração necessária é a definição do locale de sua aplicação, que pode ser feito no próprio bootstrap.php do Cake:

setlocale(LC_ALL, 'pt_BR');

Assim como outros plugins da Radig, você pode consultar os testes incluídos para ver melhor o funcionamento deste.

Se for utilizar, nos avise, será uma grande satisfação ver que o plugin é util para outros.

Há uma versão compatível com o CakePHP 1.3 e outra com o CakePHP 2.x, basta usar o branch correspondente.

Categorias
Desenvolvimento Web

CakePHP: Plugin Auditable

Cenário: você desenvolve um sistema para uma empresa e 4 meses depois a gerência da empresa detecta um problema nos dados e solicita uma auditoria pra saber o que causou aquilo e quem é o responsável.

Este cenário é mais comum do que parece, em várias situações talvez não chegue a diretoria, mas algum usuário pede informação de como dada informação chegou ou saiu do sistema. Como você atenderia a solicitação? Se você não tem ainda uma resposta, vou apresentar uma alternativa, um plugin para CakePHP desenvolvido pela equipe da Radig (eu incluso) e disponível no seu github: github.com/radig/auditable

O objetivo do Auditable é muito simples: tornar qualquer sistema em CakePHP auditável.

O plugin é composto de duas peças chaves: uma classe de configuração e um behavior. Para tornar um modelo auditável, basta “plugar” o behavior à ele, a partir daí todas as informações criadas, alteradas ou removidas.

Há ainda um helper para ajudar na formatação das entradas do log e um controller simples que pode ser usado para visualizar o log.

Há casos de teste para todo o behavior e informações sobre sua configuração em seu readme: https://github.com/radig/auditable/blob/master/README.textile

Bom proveito =]

————–

Conforme o assunto se desenrolou nos comentários, implementamos os modelos Logger e LogDetail para uso junto ao CakeMongoDb para armazenar os logs no banco de dados MongoDB. Você pode conferir no plugin AuditableMongoLogger

Qualquer dúvida ou sugestão pode usar os comentários ou o Github ;]

Categorias
CakePHP Desenvolvimento Web PHP

[CakePHP] Acl: Problema com Acos “duplicados”

Quando falamos em Acl e CakePHP muitos tem a lembrança de horas lutando contra um monte de código para tentar fazer funcionar a autenticação e permissionamento. Bastam algumas dezenas de projetos e você fica craque em configura-lo.

Porém vez ou outra aparece uma dúvida que te faz perder várias horas debugando e as vezes termina isso sem uma solução razoável.

Trabalhamos muito com Plugins na Radig e um problema que enfrentávamos de vez em quando era o de ter um plugin com o mesmo nome de uma ação de controller. Nestes, quando você verifica a permissão para a ação usando uma sintaxe de caminho parcial, isto é, algo como:

$this->Acl->check('acao', 'Fulano');
$this->Acl->check('Controller/acao', 'Fulano');
$this->Acl->check('Plugin/Controller/acao', 'Fulano');

Um erro é retornado, dizendo que o Aco não pode ser verificado (lembrando que para o exemplo, Plugin teria o mesmo nome de acao).

Isso foi até assunto de um bug reportado para o CakePHP, afirmando que a falha estava no fato das comparações no banco de dados serem, na maioria das vezes, case-insensitive. De fato, como respondeu o Mark Story, uma forma de resolver este “problema” é utilizar no banco de dados um COLLATION que seja de fato case-sensitive. O problema nisso é que a maioria dos conjuntos de caracteres, ao menos no MySQL, são case-insensitive, então você teria de mudar todos os seus banco de dados para corrigir isso.

Porém o usuário nlcO postou uma dica interessante: basta usar o caminho completo do Aco que não haverá conflito, mesmo quando controllers, plugins ou actions tiverem os mesmos nomes. Mas como usar o caminho completo? Basta ver qual é seu Aco raiz (que possuí o parent_id = NULL) e ir incluindo após ele todos os subsequêntes – plugins, controllers e actions, até formar o caminho completo.

No meu exemplo ficaria:

$this->Acl->check('aplicacao/Plugin/Controller/acao', 'Fulano');
Categorias
CakePHP Desenvolvimento Web PHP

HTML5: Problemas com Input type=”number”

Opa, esse é mais um aviso.

Recentemente estava trabalhando em um sistema com CakePHP 2.1 e ao tentar editar um registro onde um dos campos era do tipo float, o valor que estava no banco não era apresentado no formulário, embora a tag input estivesse com o atributo value preenchido corretamente. Isso aconteceu comigo no Chrome 17, no Firefox 10 não houve problema porque ele utiliza input text normal.

Um detalhe importante é que eu utilizo o Helper Locale para formatar os números decimais para meus usuários, assim o que vem do banco como “12.58” vira “12,58” formato que usamos no Brasil. Talvez se usasse ponto como separador de decimais não teria problema – o que não é possível pra mim.

Ao pesquisar um pouco descobri um bug no Chromium relacionado a isso reportado no link http://code.google.com/p/chromium/issues/detail?id=44116 . Não consegui entender o motivo mas foi marcado como Wontfix.

A saída foi sobrescrever o FormHelper para utilizar input do tipo text quando o número vindo é um ponto flutuante/decimal. Se você não trabalha com CakePHP, mas trabalha com números decimais separados por vírgula, a dica continua valendo: utilize input com o tipo text ao invés de number.

Aqui tem um commit onde implementamos a “correção” em um FormHelper que estende o do CakePHP.

Categorias
Desenvolvimento Web eventos

Aplicações heterogêneas e a busca por conhecimento

Estive muito tempo sem escrever neste espaço por dois motivos: falta de tempo hábil e de um tema “supimpa”, que não fosse o mesmo abordado milhões de vezes por milhões de outros blogs.

Felizmente a falta de tempo ainda é um problema, graças aos trabalhos na Radig. Digo felizmente por que é muito bom trabalhar no que você gosta, com grandes amigos e possibilidades infinitas. Mas agora os assuntos estão fervilhando na minha cabeça.

Hoje quero falar um pouco de aplicações heterogêneas. Não sei nem se o termo é utilizado, busquei  no oráculo e não encontrei referências, tentei por sistemas heterogêneos mas o que vem são informações sobre química e soluções heterogêneas.

Mas se o termo não existe, o que quero dizer com aplicações heterogêneas? São aplicações que mesclam tecnologias diferentes com um mesmo propósito, por exemplo: uso de dois modelos de SGDB’s ou duas linguagens de programação server-side, mas que compartilham informações de modo altamente acoplado.

Venho trabalhando em alguns produtos (um deles é o Juris, conhece?) e um dos recursos que implementamos são notificações em tempo real sobre ações dentro do sistema para os usuários de interesse.

No projeto do sistema de notificações nós tínhamos os requisitos:

  • Baixo tempo de resposta entre a ação e o disparo de notificação
  • Escalabilidade – suportar, sem sobrecarregar o servidor, mais de 1000 conexões simultâneas
  • Fácil manutenção
  • Independência do sistema – acoplamento baixo em código, mas alto em relação aos dados

Nossos principais sistemas foram desenvolvidos em PHP, portanto parecia natural escolher a triad PHP+APACHE+(MySQL/PostgreSQL) para o sistema de notificação. Parecia.

Em abril deste ano tive a felicidade de participar do evento BrazilJS, onde pude ver feras como Mike Taylor, Richard Worth e seu irmão* Guilherme Chapiewski, o lendário Maujor, os gaúchos Jaydson e Felipe Nascimento que organizaram um evento do outro lado do país, o Ricardo Coelho – segundo maranhense mais conhecido e influente do país (perde só para nosso querido² Sarney) além do velho conhecido PorKaria.

Duas coisas realmente me chamaram atenção durante o evento: o extensivo uso que tem sido feito da linguagem JavaScript para rodar aplicações no servidor, através do Node.js, e a possibilidade de criação de aplicações com resposta em tempo real com baixo custo computacional através de bibliotecas como Socket.io e PubSub.io ou mesmo protocolos adicionados aos browsers recentes como o websocket.

Estes dois ingredientes (JavaScript no servidor + Websocket) atenderiam perfeitamente os requisitos de minhas aplicações. E a escolha foi feita. Desenvolvi, com poucas linhas de código, toda a aplicação, porém uma parte ficou nebulosa: como compartilhar as notificações geradas em um sistema com outra aplicação? E como saber se a pessoa que está conectada ao servidor de notificações é realmente o usuário autorizado a acessar o sistema? A resposta que encontrei foi compartilhar as sessões.

Como fiz isso? Armazenando a sessão do sistema principal em um banco de dados (escolhi para isso o MongoDB, pela velocidade e escalabilidade), enquanto no servidor de notificação só acesso as sessões disponíveis no banco e verifico se o usuário que tenta acessar notificações está realmente autenticado.

Para implementar isso foi preciso um pouco de pesquisa e adaptação tanto no servidor de notificações quanto no sistema principal, mas os detalhes deixarei para uma próxima oportunidade.

Quero deixar registrado aqui meu tardio parabéns a organização e aos palestrantes do BrazilJS, o evento foi sensacional.
E que o texto sirva de inspiração para aqueles que acreditam na “bala de prata” (ela não existe).
Não deixe de participar de eventos, comunidades ou fóruns. Nunca pare de estudar, algo que era uma boa solução à 1 ano hoje pode ser uma péssima alternativa perto das demais.

* Piada interna do evento.
² – [/sarcasm]

Categorias
CakePHP Desenvolvimento Web Programação Projetos

Mantendo uma base de código organizada e documentada

Uma problemática comum de quem desenvolve sistemas é como manter a documentação em dia, se que isso comprometa os prazos de desenvolvimento.

Digamos que isso é um problema de otimização:

  1. um código bem documentado facilita e muito a sua manutenção;
  2. documentar código leva tempo;
  3. tempo é um recurso escasso em desenvolvimento de software;

Olha o problema… sem tempo, não há documentação e sem documentação você precisará de mais tempo para dar manutenção – oras, mas você já não tinha tempo para documentar, como vai ter mais tempo agora para dar manutenção?

Tentando equacionar esse problema surgiram várias ferramentas que visam facilitar todas as atividades relacionadas ao desenvolvimento.

Como a maior parte do meu tempo dedico ao PHP e CakePHP, tomarei estes como base para as ferramentas, porém várias delas podem ser utilizadas com outras linguagens/frameworks sem grandes problemas ou então possuem similares em outras linguagens.

Padrão de código

A primeira etapa, e talvez a mais importante, seja definir e disponibilizar um conjunto de regras explicando como o código foi escrito.

Este padrão envolve nome de classes, atributos, métodos, comentários, tabelas e colunas do banco de dados, organização de diretórios dentre outras coisas. Até coisas simples como a indentação deve ser padronizada.

Veja alguns guias de codificação para ter um exemplo do que quero dizer:

Versionamento de código

Um dos recursos mais importantes durante o desenvolvimento é a capacidade de se desfazer determinada alteração e manter um registro de todas as alterações feitas durante o desenvolvimento.

Atualmente, minha ferramenta favorita para versionamento é o Git um sistema distribuído de controle de versão. Porém existem vários outros que podem agradar, como o centralizador SVN e os também distribuídos Mercurial e Bazaar.

É muito fácil trabalhar com qualquer um destes sistemas e após conhecer as facilidades que o versionamento de código lhe proporcionam, você terá dificuldade em trabalhar com código sem controle de versão, pode apostar.

Caso você opte por um sistema distribuído, dê uma olhada neste modelo de organização para seu código: A successful Git branch model

Versionamento do Banco de Dados

Por melhor que seja o projeto do seu sistema uma coisa sempre ocorrerá: mudança. E isso envolve mais do que código, muitas vezes alterações na estrutura do banco são necessárias.

Como controlar essas alterações? A resposta é “Migrations”

No CakePHP precisamos de plugins para dar essa capacidade a aplicação, há dois largamente utilizados:

Outros frameworks fornecem suporte “nativo” ao recurso, como o Ruby on Rails e Doctrine para PHP em geral.

Testes unitários

Acredito que todos os frameworks modernos fornecem suporte a criação de testes unitários em seus projetos. Os testes são uma fase importante do design do software e fundamental para documentação de qualidade.

O CakePHP até sua versão 1.3 utiliza o framework de testes SimpleTest, porém passará a utilizar o PHPUnit em sua versão 2.0 (atualmente em desenvolvimento).

Não sabe o que são testes unitários? Bom, segue alguns links sobre o assunto:

Testes são como controle de versão… depois que você usa, não vive sem.

Documentação

Como comentado anteriormente, um passo importante para documentação são os testes unitários. Porém não devem ser o único.

Uma forma muito eficiente de documentação são os blocos de comentários, no PHP, o padrão PHPDoc é o mais utilizado.

Existem várias ferramentas que varrem o código de sua aplicação e identificam esses blocos para gerar a documentação, alguns deles são:

Quando sua documentação é concisa e completa, entender o funcionamento da aplicação passa a ser fácil, independente de quando ela foi criada. Quando isso é aliado aos testes unitários, fazer manutenção passa a ser uma atividade mais fácil e gratificante.

Por fim, é preciso saber o que/quando está errado e como/quando foi corrigido, ajudando na manutenção do histórico e acompanhamento da evolução do software. Para isso temos o tópico a seguir.

Controle de Bugs/Atividades

Como controlar o que, quando e por quem uma determinada atividade deve ser feita? E como verificar por quem e quando determinada funcionalidade foi implementada? O controle de versão pode fornecer parte destas respostas, mas ficar analisando logs normalmente não é muito comodo. A melhor maneira é utilizar uma ferramenta de controle de bugs/atividades.

Utilizo no meu dia-a-dia o excelente Redmine, um sistema simples porém poderoso para controle de tarefas. Suporta diferentes projetos, sub-projetos, integra-se com vários sistemas de versionamento de código, permite criação de wikis para documentação além de vários outros recursos.

Além deste, existem vários outros sistemas como o Bugzilla, Trac, Mantis e PHProjekt.

Conclusão?

Não, não tem conclusão. O texto visa apenas apresentar algumas atividades que juntas ao planejamento e desenvolvimento de software tendem a tornar a vida dos desenvolvedores melhor, seja diminuindo o stress causado por alterações dos requisitos ou manutenção de código mal projetado/escrito, seja tornando o desenvolvimento mais ágil, permitindo mais horas de lazer e descanso e menos fios de cabelo branco.

A intenção nunca foi cobrir todos os tópicos a exaustão, mas sim apresentar alguns exemplos e motivos para adoção de tais ferramentas/ideias. Caso tenha surgido dúvida a respeito de qualquer item, deixe um comentário =]

Sentiu a falta de algum item? Utiliza algo de forma diferente? Deixe um comentário também.

————-
Postado originalmente no blog da Radig

Categorias
Desenvolvimento Web jQuery

Dica Rápida – Evitando problemas com uso de jQuery e imagens

Algumas vezes precisamos recuperar, em tempo de execução, o tamanho de uma determinada imagem para aplica-la corretamente ao layout da página, porém essa verificação pode acontecer antes da hora, o que geraria erros inesperados.

Todo mundo que trabalha com a biblioteca jQuery conhece a chamada:

$(document).ready({
//seu código javascript
});

Ela diz ao browser para executar o bloco interno somente quando o DOM do seu documento tiver sido totalmente carregado, isso permite que ele faça o parser de seu documento utilizando os seletores sem esquecer de nenhum item. Porém quando carregamos estruturas externas ao DOM, como uma imagem, não temos garantia de que o código dentro do bloco anterior será executado quando a imagem já tiver sido carregada.
Dessa maneira, caso você precise de informações sobre a imagem, seu script falhará.

Para contornar isso, podemos utilizar uma outra chamada, que é disparada somente quando TODO o documento tiver sido carregado:

$(window).load({
//seu código javascript
});

As duas diferenças, além do comportamento são:

  1. Saí o ‘seletor’ document para a entrada do window;
  2. Saí o evento ready para a entrada do load;

A primeira alteração ocorre por conta da segunda, já que o evento load não pode ser associado a um document.

Com essa pequena alteração você garante que seu script rodará apenas quando todo o documento tiver sido carregado – o que é essencial em algumas situações, como a citada anteriormente, porém dispensável na maioria das vezes.

Fonte: http://api.jquery.com/load-event/

Categorias
Desenvolvimento Web Joomla! PHP

Joomla! 1.6 – O que está para chegar…

Em 21 de Janeiro de 2008 foi lançado a versão 1.5 deste excelente CMS, e desde então foram lançados 15 subversões (atualizações), envolvendo pequenas melhorias e correções de segurança.

Desde meados de 2009 quem utiliza o Joomla! só pensa na próxima grande atualização do CMS, a versão 1.6. Ela deve incluir alguns dos itens mais requisitados pela comunidade como:

  • Sistema de permissões, com possibilidade de se criar novos grupos e definir o que cada grupo pode fazer;
  • União das Seções e Categorias, ao mesmo tempo que agora pode-se ter infinitas subcategorias;
  • Suporte a outros sistemas de banco de dados;
  • Assistente para adicionar link para um artigo enquanto estamos escrevendo outro artigo;
Categorias
CakePHP Desenvolvimento Web eventos PHP

Latinoware 2009 – COLAPHP – Evento fantástico

Eae pessoal, tudo tranquilo?

Tenho andado bem corrido ultimamente e não tenho conseguido dar a atenção que queria ao blog. De agora em diante as coisas não devem melhorar muito, mas farei o possível para trazer coisas interessantes pra cá.

Desde o dia 21/10/2009 estou em Foz do Iguaçu – PR, para participar do Latinoware 2009, um dos maiores eventos de software livre das Américas.
Estou tendo a oportunidade de ministrar um minicurso e apresentar uma palestra no “subevento” COLAPHP – Congresso Latinoamericano de PHP, que possui uma trilha dedicada a linguagem dentro do  Latinoware.

A experiência não poderia estar sendo melhor. Pude conhecer excelentes profissionais e fazer muitas amizades.

—————– fim do rascunho 1 ——————-

Nos dias 23 e 24 de outubro tive a oportunidade de ministrar um minicurso e uma palestra dentro da trilha COLAPHP do Latinoware.

Ambos tratavam do CakePHP, no caso do minicurso fizemos uma introdução no framework, falando um pouco de seu funcionamento, suas convenções e criamos rapidamente uma aplicação simples utilizando o terminal com o Bake.

O slides utilizado no minicurso foi este:

No caso da palestra, falei novamente sobre a integração de aplicações escritas em CakePHP e Flex, dando uma revisada na apresentação. Ela ficou assim:

Aproveito o espaço (e a disponibilidade de tempo) para agradecer todos que participaram do evento como um todo, seja na organização, apoio ou assistindo, perguntando, corrigindo e ajudando a gente durante as apresentações. Obrigado a todos.

—————- fim do rascunho 2 ——————-

O texto do rascunho 1 foi escrito em 23/10/2009, o do rascunho 2 logo após o evento, hoje é 16/01/2010 e o textos ainda estevam como rascunho para ser publicado no blog. Pois é, esse final de ano foi realmente muito corrido, mas valeu a pena.

Agora é hora de se organizar para poder ter um 2010 ainda mais proveitoso (de começo ele já está sendo muito melhor).

Até breve.

Categorias
Desenvolvimento Web eventos PHP

Workshop PHP Extremo

Como havia comentado no post anterior, o PHPMS realizará seu primeiro worksop: Workshop PHP Extremo.

Citando a página do evento:

O que é o Workshop PHP Extremo?

Trata-se de um evento voltado a profissionais, em especial os que trabalham com PHP.  O Workshop visa a capacitar os desenvolvedores PHP do estado e permitir a troca de experiências e networking,  elevando o nível dos atuais desenvolvedores PHP e profissionais da área.

Como é possível ver pela breve introdução, é um evento voltado para desenvolvedores, como diria Steve Ballmer: “developers! developers! developers!”

Se você tem interesse em participar do evento corra, pois as vagas são bem limitadas (30 pessoas) e o valor está muito baixo – apenas R$ 15,00 antes de evento – e de quebra você leva uma camiseta. Visite a página do Workshop PHP Extremo e siga os passos para fazer sua inscrição.

Caso além de querer participar você queira um espaço para compartilhar seu conhecimento, um lugar apresentar algo e discutir com profissionais da área, então é sua chance de apresentar um trabalho no Workshop. Serão 3 apresentações durante o workshop, uma pode ser a sua, basta submeter sua proposta de trabalho neste formulário. Mas corra, as submissões tem de ser feitas até o dia 20 de Junho.

Vamos participar para que possamos realizar outros destes no futuro.