CakePHP
CakePHP – Use o containable e seja feliz
2Conversando com um amigo do trabalho(@lindenberg), recebi uma dica que talvez você que já trabalha com CakePHP até saiba, mas eu não sabia.
Para consultar dados no banco e usar condições eu fazia assim:
$options = array(‘conditions’=>array(‘Alunos.semestre’=>’2010.1′),’limit’=>50);
$findALunos = $this->Alunos->find(‘all’,$options);
Na versão 1.2 do cake foi adicionado o Containable, é bem mais simples do que o usado anteriormente.
Portanto, use o containable e não como codificado acima.
Consulte na documentação: http://book.cakephp.org/view/474/Containable
Desativando validação no controller
0Imagine que você tenha uma validação em seu modelo e deseja desativar a validação em determinado controle que esteja usando este modelo. Para desativar é muito simples, veja na instução abaixo:
$this->Modelo->validate = array();
Cakephp – Trabalhando Upload com a classe Verot
31Na verdade a classe se chama somente class.upload.php ou Class Upload, é um nome meio genérico e por isso os desenvolvedores adotaram esta classe como Classe Verot. Isso porque Verot é o sobrenome do criador da class, seu nome é Colin VEROT.
Até hoje eu não encontrei uma class tão completa para trabalhar com imagens como esta, uso já faz alguns anos e hoje trabalhando com cakephp não foi diferente. Vou explicar aqui um pouco de como trabalhar com esta class dentro do Cakephp.
Primeiramente devemos transformar a class em um component. É muito simples, um component nada mais é do que uma class, então só devemos colocá-la dentro de uma class e estender para o objeto.
Baixe a class normal neste link: http://www.verot.net/php_class_upload_download.htm
Abra a class com seu editor e insira no inicio:
[sourcecode language='php']
class UploadComponent extends Object {
[/sourcecode]
Obs: Não se esquece de fechar a class no final.
Coloque dentro da pasta de components do seu projeto.
Pulando a parte de formulários e html, vamos ver como fica o controller.
No controller, habilite o component com public $components = array('Upload');
O script para fazer upload é bem simples, você pode até criar uma função no controller e depois chamar a função pelo método, veja como eu crio a função:
[sourcecode language='php']
private function uploadImg($imagem){
$this->Upload->upload($imagem);
$imgName = date(‘dmY_His’);
$this->Upload->file_new_name_body = $imgName;
$this->Upload->image_resize = true;
$this->Upload->image_x = 400;
$this->Upload->image_ratio_y = true;
$this->Upload->jpeg_quality = 70;
$this->Upload->allowed = array(‘image/jpeg’,'image/jpg’,'image/gif’);
$this->Upload->process(“img/usuarios/”);
if ($this->Upload->processed) {
$this->Upload->clean();
} else {
$this->erro = $this->Upload->error;
}
return $imgName.”.”.$this->Upload->file_src_name_ext;
}
[/sourcecode]
Linha 01: Iniciamos a função, eu criei como private, mas caso você precise usá-la em outros controllers, substitua private por public.
Linha 02: Iniciamos o componente nesta linha e o atribuímos a imagem. A variavel $imagem deve receber o array completo de um arquivo.
Linha 03: Definimos um nome padrão para o arquivo, eu costumo criar o arquivo como dia, mes, ano, hora, minuto e segundo.
Linha 04: Atribuímos o nome padrão que criamos para a variável do component file_new_name_body. O componente vai copiar o arquivo e dar o nome que atribuímos e não o mesmo nome do arquivo original.
Linha 05: image_resize serve para habilitar o redimensionamento da imagem. Caso ele esteja como false, a linhas 06 e 07 não irão funcionar.
Linha 06: Em image_x definimos o tamanho do redimensionamento da imagem.
Linha 07: image_ratio_y é muito importante, se a imagem estiver com o redimensionamento habilitado, esta variável faz que a altura da imagem seja redimencionada na proporção da largura, assim a imagem não fica distorcida.
Linha 08: A jpeg_quality copia o arquivo na qualidade escolhida, neste caso com a qualidade 70.
Linha 09: Allowed configura os tipos de arquivos que serão aceitos. Para aceitar todos os tipos de de imagens, é só colocar image/*.
Linha 10: Process é comando que executa o upload. Dentro de Process é o diretório que o arquivo será gravado.
Linha 11: Verifica se o upload foi um sucesso.
Linha 12: Se o upload for um sucesso, a função clean() vai executar uma limpeza do component.
Linha 14: Se o upload falhar, a função irá retornar o erro na variável $this->erro.
Linha 16: file_src_name_ext pega a extensão do arquivo, então eu aproveito para montar o nome do arquivo completo e retornar na função.
Dentro do método é só chamar a função, veja um exemplo:
[sourcecode language='php']
$this->data['Model']['imagem'] = $this->uploadImg($this->data['Model']['imagem']);
[/sourcecode]
Para trabalhar com o erro que a função gerou, basta imprimir a variável $this->erro.
A Class Verot é muito bem documentada, seu autor teve um cuidado nesse processo, tem uma explicação completa sobre todos os recursos da class. Você pode acompanhar a documentação completa neste link: http://www.verot.net/res/sources/class.upload.html.
Vou listar alguns dos recursos que a classe tem:
- Aplicar marcas d’agua na imagem
- Escrever na imagem
- Alterar contraste
- Aplicar efeito negative
- Cortar imagem
- Redimensionar de forma inteligente
- Alterar qualidade
- É possível detectar a largura e altura da imagem e validar
- Converter em outros formatos: jpg, gif, png, bmp e etc
- Dar zoom na imagem
Há muito mais recursos, vale a pena conferir sua documentação.
Atualização [02-11-09]
Como algumas pessoas tiveram dúvidas quanto o component para cekaphp da class verot, disponibilizei para download neste link: http://www.renanlima.com/downloads/uploadVerot.zip
Cakephp – Trabalhando com themas (Themed)
0Estou trabalhando no desenvolvimento de um pequeno CMS com o Cakephp e estava em busca de uma solução para customização de temas, foi em meio de pesquisas que descobri que o Cakephp tem o tal Themed. Então, ele é, digamos assim, mágico.
Na prática
No seu controller, declare as seguintes variáveis:
[sourcecode language='php']var $view = ‘Theme’
var $theme = ‘seuTema’[/sourcecode]
Linha 01: Diz ao sistema que este controller vai usar o Themed e não o sistema de layouts padrão.
Linha 02: Define o nome do template(themed) que será usado. SeuTema é o nome do tema a ser usado.
Obs: Você pode definir o tema($theme) em cada Método: $this->theme = ‘segundoTema’
Agora é preciso colocar os arquivos do tema no diretório certo, veja um exemplo:
[sourcecode language='php']/app/views/themed/seuTema
/app/views/themed/seuTema/layouts/
/app/views/themed/seuTema/layouts/default.ctp
/app/views/themed/seuTema/controller/
/app/views/themed/seuTema/controller/action/
/app/views/themed/seuTema/controller/action/index.ctp[/sourcecode]
Onde ‘seuTema’ é o nome do tema que será usado, o mesmo declarado na variável theme (var $theme = 'example').
Observe que o controller fica dentro do template, assim dá para trabalharmos com mais liberdade em cada template.
Para os arquivos que ficam no webroot, trata-os como o exemplo abaixo:
[sourcecode language='php']/app/webroot/themed/seuTema/js/
/app/webroot/themed/seuTema/js/jquery.js
/app/webroot/themed/seuTema/css/
/app/webroot/themed/seuTema/css/style.css
/app/webroot/themed/seuTema/img/
/app/webroot/themed/seuTema/img/logo.jpg[/sourcecode]
Simples não?
Bom, as coisas ficam mais interessantes quando estamos usando mais de um template. Experimente e estude, é um ótimo recurso.
Cakephp – Inserindo mais de um registro no banco de dados
10Hoje me deparei com um probleminha ao precisar inserir mais de um registro no banco de uma vez.
A solução que eu procurava era para ter o seguinte efeito:
[sourcecode language='sql']INSERT INTO tabela (titulo,created) VALUES (’11111′, ’2009-09-28 17:05:03′);
INSERT INTO tabela (titulo,created) VALUES (’22222′, ’2009-09-28 17:05:03′);
INSERT INTO tabela (titulo,created) VALUES (’33333′, ’2009-09-28 17:05:03′);
INSERT INTO tabela (titulo,created) VALUES (’44444′, ’2009-09-28 17:05:03′);
INSERT INTO tabela (titulo,created) VALUES (’55555′, ’2009-09-28 17:05:03′);
[/sourcecode]
Ou seja, eu precisava inserir uma série de registros de uma vez, sendo que no cakephp, se você escrever $this->Model->save($this->data) para um array com todos os campos, ele salva somente o ultimo registro, resultando em uma única inserção.
Para se ter sucesso nesta situação, seu array deve estar configurado conforme abaixo:
Não precisa estar configurado necessariamente assim, mas a meu ver, é a mais adequada.
[sourcecode language='HTML']array(
[Model] => array(
[0] => array(
[titulo] => ’111111′
[texto] => ‘xxxxxxx’
)
[2] => array(
[titulo] => ’222222′
[texto] => ‘xxxxxxx’
)
[3] => array(
[titulo] => ’333333′
[texto] => ‘xxxxxxx’
)
)
)[/sourcecode]
Em seu controller, você vai seguir a seguinte lógica:
[sourcecode language='php']foreach($this->data['Model'] as $item){
$this->Model->save($item);
$this->Model->id = null;
}[/sourcecode]
Explicando:
Linha 1: Passamos um foreach no array $this->data['Model']. Usamos este array para cair direto no array útil para este recurso que é o array Model.
Linha 2: Executamos o SAVE no model, normalmente. A diferença é que estaremos pegando o resultado do foreach, ou seja, estaremos pegando um bloco por vez do array e salvando.
Linha 3: É aqui que resolvemos o problema. Ao fim de cada inserção, devemos anular o ID. Se você não anular este ID, o Cakephp irá salvar somente o último insert, isso porque ele vai atribuindo o ID constantemente e no final, ele pega somente o id que está na variavel que é o último.
Essa dica não é daquelas que se acha facilmente na documentação do Cakephp, tão pouco no google, então, está aí a dica. Qualquer dúvida ou outras soluções, pode postar aqui.
Atualização: 29/09/09
Segue a dica do Richard, que é usar o mesmo array mostrado nest post e no save, colocar $this->Model->saveAll($data). Isso já resolve o problema e dispensa o uso do foreach.
Consulte o manual: http://book.cakephp.org/pt/view/75/Saving-Your-Data
CakePHP – Inserindo arquivos JS e Css no template
3Vou dar uma dica bem simples e básica, que vai te ajudar muito caso esteja iniciando em cakephp, pelo menos vai economizar uns 5 ou 10 minutos de busca já que ainda não se acostumou com o CookBook. Vamos ver como adicionar arquivos Javascript e Css no template.
Primeiramente, habilite o helper necessário.
Vá no controller que você vai trabalhar e defina:
var $helpers = array('html','Javascript');
Iremos trabalhar com ambos. Feito isso no controller, agora no template que corresponde a este controller, você fará da seguinte forma para incorporar os arquivos:
echo $javascript->link('nome_arquivo'); echo $html->css('nome_arquivo');
Simples, não?
Links úteis
- Helpers HTML: http://book.cakephp.org/view/206/Inserting-Well-Formatted-elements
- Core Helpers: http://book.cakephp.org/view/181/Core-Helpers
CakePHP dentro de grandes empresas
4Embora o CakePHP tenha lá seus 3 aninhos de vida, somente agora ele estourou entre os profissionais.
CakePHP ganhou forças e mostra-se presente em grandes empresas.
Em uma pesquisas que fiz no site www.cakephp.com.br e no titio Google.com. Pude perceber que as empresas estão procurando se informar quanto o CakePHP, algumas até pedem experiência com CakePHP em seu currículo.
Em uma enquete do site cakephp.com.br(04/2008), mostra que em segundo lugar, as pessoas usam o cakephp no trabalho. Em primeiro lugar ficou quem usa o cakephp para estudo.
Então isso quer dizer algo ao mercado, afinal, os frameworks estão aí, tem muitos bons e cabe a sua empresa(e você) escolher um que realmente cumprem com suas necessidades.
Aqui na universidade onde trabalho estamos fazendo tudo que é novo em CakePHP, não dá para passar o que é antigo para cake, mas o que é novo estamos usando esta nova e amigável ferramenta. O ganho de tempo que estamos ganhando é grande e isso eu não queremos perder.
É fato que framework nos faz trabalhar mais rápido, além de ter uma organização excelente e seguir os padrões atuais. Uma coisa interessante e animadora é que o CakePHP está cada vez mais semelhante ao Ruby, isso de fato está fazendo uma grande diferença em comparação as outras ferramentas. Isso porque o Ruby está sendo muito elogiado, principalmente nos vídeos que compara o JAVA com RUBY, e nessa, quem leva a melhor é o Ruby pela sua rapidez, organização, flexibilidade, economia.. bem.. é melhor parar por aqui.
Quanto a comunidade CakePHP, esta não para de crescer, conquistando novos seguidores e ajudando uns aos outros.
Ainda tem muita coisa pela frente, vamos ver o que vem por aí.
Enviando multiplos emails com o PHPmailer
0Neste artigo vou mostrar como enviar multiplos emails com o PHPmailer adaptado ao CakePHP.
Senti a necessidade em usar este tipo de envio, pois o component do cake que trabalha como PHPmailer não tem este recurso, por tanto, teremos que fazer pequenas mudanças no component.
Se você não viu o artigo que fala como usar o PHPmailer no CakePHP, clique aqui.
Vamos lá!
No component Email, basta substituir a linha que contem $mail->AddAddress($this->to, $this->toName ); por este conjunto de código abaixo:
if(is_array($this->to))
{
foreach($this->to as $item)
{
$mail->AddAddress($item['Email']['to'],$item['Email']['name']);
}
}
else
{
$mail->AddAddress($this->to, $this->toName );
}
No código acima está a mágica em enviar multiplos emails com o PHPmailer.
Este script faz o seguinte:
Ele verifica se a variavel $this->to é um array, se for, ela ler todo o array atravez do foreach e alimenta a função AddAddress, caso a variavel $this->to não seja um array, o script age normalmente, como antes. Ou seja, esta mudança no código não vai fazer a diferença alguma em outras aplicações suas que não utilizam envio de multiplos emails com o PHPmailer.
Feito!
Agora vamos trabalhar no controller.
Onde seria $this->Email->to, será um array, veja o exemplo abaixo:
$email['Email']['to'] = ‘webrenanlima@gmail.com’;
$email['Email']['name'] = “Renan Lima”;
Para gerar diversos emails dentro de um loop, basta seguir o exemplo abaixo:
$result = $this->Usuario->findAll();
$i=0;
foreach($result['CoorporativoUsuario'] as $item)
{
$email[]['Email']['to'] = ‘webrenanlima@gmail.com’;
$email[]['Email']['name'] = “Renan Lima”;
$i++;
}
Se você quiser enviar um email para uma única pessoa, basta usar o método tradicional: $this->Email->to.
Para você que não viu o tutorial que explica como usar o PHPmailer com o cakephp, veja aqui na matéria anterior: PHPmailer com CakePHP.
Comentários recentes