CakePHP

CakePHP – Use o containable e seja feliz

Conversando 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

Popularity: 9%

Desativando validação no controller

Imagine 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();

Popularity: 8%

Cakephp – Trabalhando Upload com a classe Verot

Na 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:

class UploadComponent extends Object {

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:


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;
}

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:

$this->data['Model']['imagem'] = $this->uploadImg($this->data['Model']['imagem']);

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

Popularity: 23%

Cakephp – Trabalhando com themas (Themed)

Estou 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:

var $view = 'Theme'
var $theme = 'seuTema'

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:

/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

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:

/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

Simples não?
Bom, as coisas ficam mais interessantes quando estamos usando mais de um template. Experimente e estude, é um ótimo recurso.

Fonte: http://book.cakephp.org/pt/view/488/Themes

Popularity: 13%

Cakephp – Inserindo mais de um registro no banco de dados

Hoje 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:

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');

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.

array(
     [Model] => array(
          [0] => array(
               [titulo] => '111111'
               [texto] => 'xxxxxxx'
          )
          [2] => array(
               [titulo] => '222222'
               [texto] => 'xxxxxxx'
          )
          [3] => array(
               [titulo] => '333333'
               [texto] => 'xxxxxxx'
         )
     )
)

Em seu controller, você vai seguir a seguinte lógica:

foreach($this->data['Model'] as $item){
          $this->Model->save($item);
          $this->Model->id = null;
}

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

Popularity: 20%

CakePHP – Inserindo arquivos JS e Css no template

Vou 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

Popularity: 16%

CakePHP dentro de grandes empresas

Embora 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í.

Popularity: 11%

Enviando multiplos emails com o PHPmailer

Neste 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.

Popularity: 11%