Posts Tagged ‘CakePHP’
Neste post veremos como usar o já consagrado PHPmailer com o outro consagrado(rs) chamado CakePHP.
1. Baixe o PHPmailer neste link: PHPmailer
2. No CakePHP, crie uma pasta chamada ‘phpmailer’ dentro de ‘app/vendors’, ficando desta forma: app/vendors/phpmailer. Agora coloque dentro desta pasta os arquivos ‘class.phpmailer.php’ e ‘class.smtp.php’.
3. Crie um component chamado ‘Email’, ficando neste caminho: app/controllers/components/email.php.
4. Dentro do arquivo email.php, coloque o código que está dentro deste arquivo: Ver código de email.php
OBS: No arquivo email.php, eu fiz umas modificações e isso fica a critério seu.
Eu comentei as seguintes linhas:
//var $smtpUserName = ”; // SMTP username
//var $smtpPassword = ”; // SMTP password
OBS 2: A porta a ser usada normalmente é 25 mesmo.
5. No controller você deve invocar o component criado no passo anterior da seguinte forma: var $components = array(‘Email’);
Script de envio para ser usado no controller e dentro de um método é claro:
$this->Email->template = ‘email/confirm’; // Template a ser usado no envio
$this->set(‘data’, $data); // Conteúdo dinamico a ser passado para o template (opcional)
$this->Email->to = ‘webrenanlima@gmail.com’; // Destinatário
$this->Email->subject = ‘Seu assunto’; // Assunto do email
$this->Email->attach($fully_qualified_filename, optionally $new_name_when_attached);
// Para enviar arquivos em anexo (opcional)
$result = $this->Email->send(); // necessário para enviar os emails
Na prática
Vou explicar aqui como funciona o PHPmailer com CakePHP na prática.
Você deverá criar dois arquivos(template) para o email, um com o conteúdo em HTML e outro somente com texto.
Como no script acima você informou que o template a ser usado será “email/confirm”, isso quer dizer que existirá dois arquivos dentro neste caminho: ‘view/email/’, um chamado ‘confirm_html.thtml’ e outro como ‘confirm_text.thtml’.
A lógica é simples, o valor do template é email(pasta)/nome_do_arquivo, não é preciso informar o nome completo( ex: confirm_html.thtml). Ok?
Não é obrigatório você criar os templates dentro da pasta ‘email’, eu mesmo coloco os templates dentro da pasta da view de seu controller.
Mas simples que usar o PHPmailer sem o cakePHP. rs
Além de ficar mais organizado (como tudo no cakePHP).
Artigo baseado em http://bakery.cakephp.org/articles/view/sending-email-with-phpmailer
Dica do Fábio
Na linha 73, troque aquele metodo “vendor” que foi descontiuado na versão 1.2 por:
App::import(‘Vendor’, ‘phpmailer’, array(‘file’ => ‘phpmailer’.DS.’class.phpmailer.php’));
Veja também como enviar multiplos emails com o PHPmailer.
Hoje vou passar para você alguns truques de como rodar o FCKeditor no CakePHP.
FCKeditor para quem não sabe, é um editor multplataforma que com seus diversos recursos, nos ajuda a resolver os problemas que ocorrem no dia-a-dia. Dentre seus recursos, ele faz: upload,coloca cores, forms, negrito,fonte html, imagem,link… e muuuito mais.
Tudo bem que eu acho que ele tem coisas de mais, por isso é bom dar uma filtrada antes de subir para o servidor, mas isso vamos ver aqui neste post.
Ingredientes:
Estudando por um artigo do Bakery, tive alguns erros, talvez pelo fato do artigo tratar de uma versão anterior ao 2.6, por isso resolvi escrever com ousa-lo e ajuda-los com alguns truques.
Vamos ao bolo. : )
1. Como estamos usando o cakePHP, não vamos precisar de nenhuma outra linguagem, portanto, na pasta editor/filemanager/connectors devemos excluir todas as pastas com o nome diferente de php.
2. No FCKeditor, copie a pasta editor e os arquivos fckeditor.js, fckconfig.js, fckstyles.xml e fcktemplates.xml para a pasta app/webroot/js do Cake.
3. No Cake, edite o arquivo app/webroot/.htaccess e adicione as seguintes linhas:
AddType application/x-javascript .js
AddType text/css .css
Caso você não consiga abrir o arquivo, mude a extensão do mesmo para txt e faz as alterações, depois disso volte-o para a extensão inicial.
O conteúdo deste arquivo deverá ficar semelhante a isso:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
AddType application/x-javascript .js
AddType text/css .css
</IfModule>
4. Configure o arquivo app/views/helpers/fck.php ao seu gosto.
Você pode criar outros ToolbarSets ou mesmo modificar os que existem. Não esqueça de fazer backup heim!
5. Agora precisaremos criar um helper. Crie o seguinte arquivo: app/views/helpers/fck.php
Seu conteúdo deverá conter o código abaixo:
<?php
class FckHelper extends Helper
{
function load($id, $toolbar = ‘Email’) {
foreach (explode(‘/’, $id) as $v) {
$did .= ucfirst($v);
}
return <<<FCK_CODE
<script type=”text/javascript”>
fckLoader_$did = function () {
var bFCKeditor_$did = new FCKeditor(‘$did’);
bFCKeditor_$did.BasePath = ‘js/’;
bFCKeditor_$did.ToolbarSet = ‘$toolbar’;
bFCKeditor_$did.Width = ’500′;
bFCKeditor_$did.Height = ’500′;
bFCKeditor_$did.ReplaceTextarea();
}
fckLoader_$did();
</script>
FCK_CODE;
}
}
?>
Algo que julgo importante é colocar o BasePath como ‘js/’ e não como ‘/js/’.
DICA: Certa vez tive que colocar o BasePath como ‘../js/‘ para funcionar no servidor remoto. Portanto, caso dê algum problema tente este valor.
6. Coloque o código <?php echo $javascript->link('fckeditor'); ?> em todas as páginas que você irá usar o fck. Eu particularmente prefiro por no Layout.
7. Coloque o código var $helpers = array(‘Html’, ‘Form’, ‘Javascript’, ‘Fck’); em seu controller.
8. Crie ua view para este controller e coloque o seguinte código dentro:
<div class=”required”>
<?php echo $form->labelTag( ‘Comment/body’, ‘Body’ );?>
<?php echo $html->textarea(‘Comment/body’, array(‘cols’ => ’60′, ‘rows’ => ’10′));?>
<?php echo $fck->load(‘Comment/body’); ?>
<?php echo $html->tagErrorMsg(‘Comment/body’, ‘Please enter the Body.’);?>
</div>
9. Para finalizar, abra o arquivo app/webroot/ js/editor/filemanager/ browser/default/ connectors/php/ config.php e procure pela linha $Config['Enabled'] e $Config['UserFilesPath'], coloque seus valores da seguinte forma:
$Config['Enabled'] = true;
$Config['UserFilesPath'] = ‘/app/webroot/files/’;
UFFA! Enfim chegamos.
Vou beber uma água e volto mais tarde.
Lembra do pog que usei para resolver uma situação no cake? Se não lembra veja aqui:
Bem galera, descobri a solução!
Não contente em usar o POG resolvi pesquisar e encontrei um recurso que o cake disponibiliza chamado beforeSave.
O beforeSave faz nada mais que executar uma instrução antes de salvar um dado no banco. Assim como ele, tem o afterSave, beforeFind e afterFind. O after tem o efeito oposto do before.
É muito simples de usar, veja os códigos abaixo:
Sem o before:
$conditions = array(‘mes’=>$mes,’ano’=>$ano);
$this->CoorporativoLigacoes->find($conditions);
…
…
$this->CoorporativoLigacoes->save($this->data());
Isso resultava em um erro, pois o resultado da consulta sempre será o mesmo, o ultimo dado cadastrado. Isso porque o cake salva no banco antes de fazer a consulta, ou melhor, ele executa as duas instruções ao mesmo tempo, mas o save é mais rápido.
Agora veja a solução usando o beforeSave
function beforeSave()
{
$conditions = array(‘mes’=>$mes,’ano’=>$ano);
$result = $this->CoorporativoLigacoes->find($conditions);
return $result;
}
function index()
{
$result = $this->beforeSave(); // este será executado primeiro
$this->CoorporativoLigacoes->save($this->data()); // Este só será executado depois do beforeSave
}
O mesmo uso deste você pode aplicar no afterSave, beforeFind, afterFind, etc.
Qualquer dúvida, só postar aqui.
PS: Nada de POG.
Está disponível o manual do Cake em português, pode espalhar, a notícia vai agradar a todos que utilizam o framework.
Segue o link: http://www.manual.cakephp.com.br/doku.php
Bom estudo/consulta.
Embora não faça muito sentido usar um Controller sem Model, um dia você vai precisar usar.
É muito simples, basta declarar a variável $uses da seguinte forma no controller:
Var $uses = array('');
Post atualizado: 09/07/2009
Encontrei a solução deste problema e postei no blog, veja aqui.
Cakephp e seus acúmulos de cache. Algo a ser melhorado.
A partir de hoje vou começar a falar da minha experiência com o CakePHP, para os íntimos somente Cake. Tentarei passar a você o máximo de dicas.
Hoje perdi algumas horas tentando resolver uma questão no Cake. Tá rindo? Foi sinistro.
Estava precisando realizar as seguintes instruções dentro de um loop:
- Verificar se o dado existe no banco
- Se não existir, grava o dado no banco
Bem, é uma coisa bem simples dentro de uma aplicação meio complexa, mas enfim, acontece que o cake armazena os dados buscados no banco em cache, isso melhora a performance do processo mas as vezes atrapalha.
Com o cash abastecido, mesmo que tivesse dado preenchido no banco, o cake não o encontrava, pois usava o cache do Find anterior e não me retornava nada.
Tentei usar o $cacheSources=false, getInsertId, execute, mas por incrível que pareça não funcionou.
Depois de algumas horas de tentativas resolvi usar uma espécie de POG. Eu não queria, mas pog sempre resolve.:)
Então eu coloquei a query – como diz um amigo aqui do trabalho – na mão. E lá fui eu “mysql_query(select ……….);”.
Ual! Foi impressionante, mas funcionou. Isso mesmo, com o POG.
Depois ainda fiquei pesquisando o porque disso, será que é um bug do cake, eu não acredito, eu é que não devo estar sabendo usar isso adequadamente.
Bem, até agora eu não sei, se você souber, gostaria de saber.
Perdi algumas horas mas adquiri conhecimento, isso vale mais.
Uma vez um amigo aqui do trabalho consegui resolver o mesmo problema simplesmente com o cacheSources, mas hoje, não foi o caso.
Até a próxima!
Encontrei a solução deste problema e postei no blog, veja aqui.