Cauan Cabral – Geek Geek, nerd e apaixonado por tecnologia

25fev/091

CakePHP – Dúvidas Comuns #2

Dúvida: Como usar habilitar a internacionalização - o famoso I18N - nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views?

Habilitar a internacionalização e ter a localização em uma aplicação com CakePHP desde a versão 1.2  é relativamente simples: basta uma lida no nosso Cookbook e pronto.

Outra coisa que é relativamente simples de se fazer é validar os dados, basta termos um atributo em nosso modelo chamado "validate" e seguir as dicas do livro de receitas.

Mas pelo Cookbook somos induzidos a fornecer a mensagem de erro na hora de criar a View, algo que eu particularmente não gosto. É até comum termos um modelo que é usado por Controllers diferentes e consequêntemente por Views diferentes.

Uma maneira de evitar isso, é definir as mensagens de erro já na definição das regras de validação, dentro do atributo "validate" do seu modelo. O grande problema é que para traduzir uma determinada expressão utilizamos um método, e a chamada de método na definição estática de um atributo não é permitida no PHP (dúvida? tente fazer o código abaixo)

class Modelo extends AppModel {
var $validate = _('ola mundo');
}
//esse código não devera ser executado

A solução para isso é a atribuição das regras de validação no momento da instanciação da classe, ou seja, no seu método construtor, da seguinte maneira

 class Modelo extends AppModel {
var $validate;
function __construct(){
parent::__construct();
$this->validate = array( /* aqui você pode definir as regras e mensagens,mesmo chamando um método */ );
}
}

Qualquer dúvida não deixem de utilizar os comentários ;]

--------
Atualizado: havia esquecido da chamada ao construtor da superclasse AppModels ( através do parent::__construct() ) no último código mostrado.

23fev/091

CakePHP – dúvidas comuns #1

Como já comentei algumas vezes, estou desenvolvendo com um framework MVC em PHP chamado CakePHP. Ele foi construído com intuíto de provar o potencial do PHP (na época em comparação ao Ruby e o Ruby on Rails). Se precisar de mais informações sobre o framework sugiro leitura do seu Cookbook e de outros blogs a respeito.

Desde que descobri o CakePHP faço parte do grupo CakePHP Tuga e ocasionalmente no canal de IRC do grupo #cakephp-pt na rede Freenode.org, e já tive a oportunidade de aprender e ajudar diversas vezes.

Vamos as dúvidas:

  1. Como salvar dados de um formulário que envolva um relacionamenteo de "muitos para muitos"/many-to- many ou ainda de HasAndBelongToMany (HABTM) ?

Nesta dúvida temos que ter em mente que o CakePHP faz todas as ligações entre nossos modelos desde que sigamos suas convenções, caso façamos isso, não haverá dificuldades.
Mas quais são essas convenções? Veja você mesmo.

Um detalhe que não podemos esquecer é que por padrão o CakePHP está preparado para tratar suas convenções em inglês, então, se não quisermos ter de modificar as configurações padrões, temos de desenvolver em inglês. Ok?

Seguindo todas as conveções o que fica faltando? É preciso saber como um relacionamento HABTM se manifesta em um formulário, ou seja, como ele é apresentado. No CookBook temos um texto sobre o caso. Resumindo, o que temos de ter é:

  • Um formulário com o nome de um dos modelos envolvidos no relacionamento. Por exemplo, em um blog temos um modelo Post e outro Tags, os dois estão ligados por um HABTM, então no formulário para inserir um Post, o nome de formulário seria Post.
  • Um ou mais campos identificados com o outro modelo parte do relacionamento e sua chave. No nosso exemplo seriam um ou mais campos com o nome 'Tag.Tag'.

No item anterior que surge a principal dúvida: como definir o nome do meu campo? que tipo de campo usar?

Primeiro definimos o tipo de campo a se utilizar: normalmente utilizamos um Select box para multiplas seleções OU um conjunto de Checkbox. Qualquer que seja a escolha o restante é bem simples:

/*
$tag é o retorno de um find('list') com os campos id e name selecionados
$tags = array( array('id' => 1, 'name' => 'tag 1'), array('id' => 2, 'name' => 'tag 2') );
 
o índice 'multiple' só deve ser utilizado quando quiser um conjunto de checkbox
*/
echo $form->input('Tag.Tag', array(
	'type' => 'select',
	'multiple' => 'checkbox',
	'options' => $tags,
	'labels' => 'Selecione as tags'
	));

Com isso seu formulário já retornará o que é esperado pelo CakePHP e tudo que será necessário para salvar os dados do relacionamento é utilizar o método 'saveAll' ao invés de 'save'.

Ainda esta semana comentarei das dúvidas sobre validação.

15fev/090

Ainda não tem hospedagem? Aproveite

Acredito que a maior parte dos visitantes deste blog trabalhem com internet. E neste trabalho, não ter um serviço de hospedagem para colocar seus serviços em produção ou mesmo durante o desenvolvimento é tão complicado quanto um médico clínico-geral não ter um estetoscópio.

As vezes nos esbarramos em alguns problemas para ter nosso espaço na web: se quiser ter um servidor em casa/escritório este terá de ter um IP fixo ou algum serviço de DNS como o NO-IP.com; se quiser ter um servidor dedicado fora de casa terá de pagar uma boa quantia; caso não disponha de muito dinheiro, terá de se satisfazer com várias limitações de recursos, certo? Não neste caso.

Infelizmente aqui no Brasil ainda é muito caro ter um servidor de hospedagem com bons recursos e preço baixo, mas lá fora isso já é realidade, então o que fazer para aproveitar isso? Primeira coisa é ter um cartão de crédito internacional (já que temos de pagar em moeda estrangeira) e se possível uma conta no PayPal (para aumentar a segurança de nossas "comprinhas"), depois disso é só escolher o host.

Atualmente trabalho com a Bluehost[en], mas ontem me inscrevi e outro grande serviço: a Dreamhost[en].

Ambos possuem ótimas características, dentre elas:

  • Espaço em disco ilimitado;
  • Trafego de dados ilimitado;
  • Domínios e subdomínios ilimitados;
  • Acesso SSH;

Além de vários outros. A diferença de preço entre elas não é muito grande, normalmente. Mas de vez em quando aparece uma grande promoção. Hoje é um desses dias.

Na Dreamhost, se você utilizar o código promocional 777 você paga somente $9,24 por um ano de hospedagem e ganha o registro de um domínio internacional na faixa. Mas só pode ser aproveitado até hoje, 15 de fevereiro de 2009. Então se tiver com uma conta PayPal ou um cartão internacional em mãos, não perca tempo.

Na Bluehost você pagará a bagatela de $6,95 por mês no plano de hospedagem (para pagamento anual). Isso dá menos de R$15,00/mês por um plano ilimitado, não é uma pechincha? Então se hoje não é 15 de fevereiro, utilize o banner abaixo e se inscreva na Bluehost para ter um ótimo serviço por um preço absurdamente baixo.

-- Atualizado --

Caso tenha perdido a promoção do dia 15/02/2009, não perca as esperanças, utilize o código promocional CAUANCABRAL para registrar sua conta na Dreamhost e ganhe um bom desconto: são $50.00 para assinatura mensal (custo normal $60.90), $75.00(de $119.40) para assinatura anual e $79.00(de $214.80) para assinatura bienal. Aproveite ;P

6fev/090

Novidades de janeiro

Como todo bom começo de ano, tivemos alguns laçamentos legais em Janeiro/2009. Primeiro a Microsoft liberou geral o download do Windows 7 Beta[en]. Depois o pessoal do KDE liberou a versão 4.2 do seu desktop.

Atualmente estou rodando o Win7 em uma máquina para trabalhar com gráficos (as vezes tenho de me arriscar) e o OpenSuSE 11.1 com KDE4.2 no meu note para trabalho e lazer. Ambos os sistemas possuem melhorias significantes tanto o desempenho quanto o a iteração com o usuário.

Como grande novidade do Win7 (além da performance realmente superior em relação ao Vista) eu citaria a barra de tarefas. Não sou usuário Mac mas já vi alguns argumentando que ela é realmente mais promissora que o Dock. De fato ela melhora e muito a forma que utilizamos o desktop, extremamente fácil e ágil para executar ações, organiza-se muito bem além de ter um visual bacana. Quem tiver a oportunidade de experimentar, faça-o. Só não esqueça que é uma versão de testes, não recomendado para uso no dia-a-dia.

Para o KDE 4.2  temos um visual novo para a barra de tarefas, uma nova área de notificações do sistema (funcionando muito bem), melhorias em vários aplicativos do desktop (kwrite, controle de energia, plasmas, sistema de indexação de arquivos, dolphin e vários outros). Algo que realmente melhorou foi o Plasma. Parece que estão conseguindo chegar ao planejado inicialmente. Outra coisa que pode levar bastante gente a finalmente querer testar o KDE 4 é a opção de utilizar um desktop clássico (sim, com atalhos na área de trabalho).

Além dos sistemas operacionais, também tivemos o laçamento da versão 1.3 da biblioteca JQuery. Também trazendo como sua grande novidade uma perfomance realmente superior a versão anterior (e a de seus concorrentes direto). Vale a pena atualizar sua biblioteca =]

Pois é, essas foram algumas coisas que andei "experimentando" neste último mês.