Archive for the ‘CakePHP’ Category

CakePHP – Use o containable e seja feliz

Posted on the janeiro 12th, 2010 under CakePHP by Renan Lima

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

Desativando validação no controller

Posted on the dezembro 21st, 2009 under CakePHP by Renan Lima

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

Cakephp – Trabalhando Upload com a classe Verot

Posted on the outubro 1st, 2009 under CakePHP by Renan Lima

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

Cakephp – Trabalhando com themas (Themed)

Posted on the setembro 29th, 2009 under CakePHP by Renan Lima

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

Cakephp – Inserindo mais de um registro no banco de dados

Posted on the setembro 28th, 2009 under CakePHP by Renan Lima

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

CakePHP – Inserindo arquivos JS e Css no template

Posted on the julho 9th, 2009 under CakePHP by Renan Lima

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

CakePHP dentro de grandes empresas

Posted on the abril 29th, 2008 under CakePHP,Internet by Renan Lima

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

Enviando multiplos emails com o PHPmailer

Posted on the abril 25th, 2008 under CakePHP by Renan Lima

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.