Tópicos em CakePHP

Dica: salvando vários registros de um mesmo model de uma só vez (dentro de um loop)

Olá pessoal,

esta dica é bem valiosa e foi mais um problema enfrentado durante a programação do meu projeto para a faculdade. No meu projeto o usuário pode enviar N imagens para o sistema de uma só vez. N imagens porque o campo file de envio é criado com JS de acordo com a necessidade e vontade do usuário.

A primeira coisa que pensamos é fazer o seguinte:

PHP:
  1. foreach($imagens as $imagem){
  2. $img["Imagem"]["nome"] = $imagem;
  3. $this->Imagem->save($img);
  4.  
  5. }

Legal, logicamente parece estar correto. Mas o que o Cake faz? Isso mesmo, ele cria um registro e os outros ele altera esse primeiro. Por quê? Porque a chave primária está preenchida.

A solução é bem simples, basta fazer isso:

PHP:
  1. foreach($imagens as $imagem){
  2. $img["Imagem"]["nome"] = $imagem;
  3.  
  4. $this->Imagem->id = null;
  5. $this->Imagem->save($img);
  6.  
  7. }

Setar o id da imagem (ou do model) como null. Este id após alguma inserção fica preenchido com o código autoincremento do último save. Sendo que o Cake dá um insert quando o mesmo é null e um update caso contrário.

Bom é isso...

Qualquer dúvida, comentem!

Abraços e até a próxima...

Comentários (16)

Dica: salvando automaticamente a data de criação e de última atualização quando a tabela não segue o padrão do CakePHP

Olá pessoal,

hoje passei por mais um problema no meu projeto por ele não usar a padronização do Cake no banco.

Como vocês devem saber o Cake popula automaticamente campos nomeados com CREATED, MODIFIED e UPDATED, sendo data de criação no primeiro e alteração nos dois últimos.

Pois bem, no meu projeto, que não segue o padrão do Cake tive que usar o callback do model, o beforeSave. O qual é executado antes do save do model e após a validação dos dados.
O código ficou assim dentro do meu model:

PHP:
  1. function beforeSave(){
  2. if (!isset($this->data["Model"]["CampoChavePrimária"])){
  3. $this->data["Model"]["CampoCriadoEm"] = date('Y-m-d H:i:s');
  4. }
  5. $this->data["Model"]["CampoModificadoEm"] = date('Y-m-d H:i:s');
  6. return true;
  7. }

Onde:

  • Model - seu model
  • CampoChavePrimaria - o campo chave primária da sua tabela que persiste o model
  • CampoCriadoEm - o campo que armazena a data de criação do registro
  • CampoModificadoEm - o campo que armazena a data de alteração do registro

Observe que o beforeSave retorna true, somente quando isso ocorre que é efetuado o save no banco.

Isso pode ser usado em outras situações, daí vai da criatividade, como criptografar a senha para guardar no banco e por aí vai...

Qualquer dúvida, comentem!

Até a próxima!

Comentários (5)

Dica: compartilhando models, controllers e views entre aplicações no CakePHP

Olá pessoal,

estou desenvolvendo meu projeto deste ano da faculdade em CakePHP e uma coisa que ainda não havia pensado em fazer era o compartilhamento dos arquivos MVC's.

No meu projeto, estou compartilhando os models entre as 4 aplicações que fazem parte do mesmo sistema. Então, como fazer?

A primeira coisa que fiz para acelerar as coisas foi mapear o banco, mas nisso já se foram aproximadamente 40 classes models :) , se eu copiasse e colasse nas outras partes do projeto, resultaria em 160 classes e com certeza em muita dor de cabeça para mantê-las sincronizadas.

A solução: bootstrap.php!

O arquivo bootstrap é carregado automaticamente depois que o arquivo app/webroot/index.php e depois que o bootstrap.php (nível núcleo do Cake) é carregado. É usado para adicionar qualquer função que não for usada numa classe, pode ser usado também para dar um include/require em qualquer arquivo da sua aplicação.
No meu caso que queria adicionar um diretório para os models, então usei, nas minhas demais aplicações (tal como app2, app3 e etc):

PHP:
  1. $modelPaths = array(ROOT.DS."app".DS."models".DS);

Assim, sempre será buscado (também) os models em: /app/models/. Lembrando que DS é o directory separator, que no windows é \ e no linux é / e ROOT representa o caminho físico da instalação do Cake.

Para usar com views e controllers é a mesma configuração, mas usando:

PHP:
  1. $controllerPaths = array(ROOT.DS."app".DS."controllers".DS);
  2.  
  3. $viewPaths = array(ROOT.DS."app".DS."views".DS);

Qualquer dúvida, comentem!

Até a  próxima pessoal!

Comentários (10)

JAX - jQuery Ajax Helper for CakePHP

Olá pessoal,

intediado com o helper do cake que trabalha com prototype? Eu também...

Então resolvi criar (inicialmente para uso próprio) o JAX - jQuery Ajax Helper. Que funciona de forma bem semelhante ao helper nativo do cake, mas com algumas melhorias...

O código pode ser visto abaixo: (e baixado aqui)

PHP:
  1. /*
  2. JAXHelper - CakePHP Helper for Ajax with jQuery
  3. Author: Tulio Faria (www.tuliofaria.net)
  4. Requeriments:
  5. - jquery: http://docs.jquery.com/Downloading_jQuery
  6. - jform (for some features like observeForm): http://jquery.com/plugins/project/form
  7. Using:
  8. - include jquery.js and jquery.form.js in your view (yes, using plain html or html helper :) )
  9. - include the helper Jax in your controller
  10. - call any of methods available: link, observeField and observeForm
  11. */
  12.  
  13. class JaxHelper extends Helper {
  14.  
  15. var $helpers = array("Html");
  16.  
  17. function link($text, $url, $target, $options = null, $loading = null){
  18. $aId = 'link' . intval(rand());
  19. $url = $this->Html->url($url);
  20. $att = " ";
  21.  
  22. if (is_array($options)){
  23.  
  24. foreach($options as $k=>$v){
  25. $att.=$k.'="'.$v.'" ';
  26. }
  27.  
  28. }
  29.  
  30. echo "<a id="\" href="http://www.tuliofaria.net/%5C%22$url%5C%22">$text</a>";
  31. echo $this->_jsBlock("\$(\"#$aId\").click( function(){  \$.post(\"$url\", function(data){
  32. \$(\"$target\").html(data); }); return false; }); ");
  33. }
  34. function observeField($element, $options){
  35. $event = $options["event"];
  36. $update = $options["update"];
  37. $url = $this->Html->url($options["url"]);
  38.  
  39. $code = $options["loading"].'
  40. $.ajax({
  41. type: "POST",
  42. url: "'.$url.'",
  43. data: $("'.$element.'").serialize(),
  44. success: function(data){
  45. $("'.$update.'").html(data);
  46. '.$options["complete"].'
  47. }
  48. });
  49. ';
  50.  
  51. return $this->_jsBlock($this->_addReady("\$(\"$element\").$event(function(){ $code })"));
  52. }
  53.  
  54. function observeForm($element, $options){
  55. $event = $options["event"];
  56. $update = $options["update"];
  57. $url = $this->Html->url($options["url"]);
  58.  
  59. $code = '$("'.$element.'").ajaxSubmit({
  60. target:        \''.$update.'\',
  61. beforeSubmit:  function(){'.$options["loading"].'},
  62. success:       function(){'.$options["complete"].'}
  63. }
  64. );';
  65.  
  66. return $this->_jsBlock($this->_addReady("\$(\"$element\").$event(function(){ $code return false; })"));
  67. }
  68.  
  69. function _jsBlock($content){
  70. return "<script type="\">$content</script>";
  71. }
  72. function _addReady($content){
  73. return "\$(function(){ $content } );";
  74. }
  75.  
  76. function test(){
  77. echo $this->_jsBlock($this->_addReady("alert(\"Jax Helper has been installed and ready to use!\");"));
  78. }
  79. }
  80. ?>

Exemplos:

Link:

PHP:
  1. link("Click Here!", "/contatos/info/1/", "teste", "teste"); ?>

Observe field:

PHP:
  1. $options["event"] = "change";
  2. $options["update"] = "#teste";
  3. $options["url"] = "/contatos/info/1/";
  4. $options["loading"] = "$('#loading').fadeIn('slow');$('#teste').hide();";
  5. $options["complete"] = "$('#teste').fadeIn('slow');$('#loading').fadeOut();";
  6. echo $jax->observeField("#texto", $options); ?>

ObserveForm:

PHP:
  1. $options["event"] = "submit";
  2. $options["update"] = "#teste";
  3. $options["url"] = "/contatos/info/1/";
  4. $options["loading"] = "$('#loading').fadeIn('slow');$('#teste').hide();";
  5. $options["complete"] = "$('#teste').fadeIn('slow');$('#loading').fadeOut();";
  6.  
  7. echo $jax->observeForm("#testando", $options); ?>

Em breve publicarei exemplos mais decentes de uso.

Qualquer sugestão ou dúvida, comente!

Abraços,

Comentários (16)

Evento: Primeiro Encontro InfoSoft de Software Livre

[update 24/09/2007]

Olá pessoal,

o evento foi cancelado por tempo indeterminado. Não sei ao certo o que ocorreu... Sei que estava bastante animado, bom, de qualquer maneira, outras oportunidades irão aparecer... Long live CakePHP!
[/update] 

Olá pessoal,

dia 26 de Setembro irá acontecer em São José do Rio Preto - SP o Primeiro Encontro InfoSoft de Software Livre. No evento, os congressistas terão a oportunidade de assistir palestras de vários assuntos, dentre eles Ruby on Rails e CakePHP, que por sinal será realizada por mim.
Quem quiser mais informações, acesse: InfoSoft

Logo

Abraços pessoal,

Comentários (7)

Evento sobre Frameworks de desenvolvimento com PHP

Olá pessoal,

no último sábado (04/08/2007), inclusive meu aniversário :) , aconteceu o evento sobre frameworks PHP.

Eu conferi as palestras sobre CakePHP com o Elton Minetto e a de Symfony com o Jhony.

Sobre a palestra de CakePHP o Elton deu um show, e creio que muita gente que assistiu sua palestra, senão já desenvolvia com Cake, vai começar. Muito bem fundamentada, explicou alguns conceitos básicos que o pessoal confunde ao começar, como MVC.

Já a palestra de Symfony, faltou um pouco mais de experiência no framework por parte do Jhony. Eu senti ele meio perdido. Creio que o pessoal poderia ter escolhido alguém da comunidade Symfony brasileira... Bom, mas isso é apenas uma crítica construtiva...

Infelizmente não pude ficar até o fim, mas gostei do evento. Lá pude conhecer pessoalmente o Bill do CakePHP.com.br e o Silici0, ambos gente boa demais.

Seguem algumas fotos (fotos tiradas pelo Bill):

Bill (CakePHP.com.br) e Eu Pessoal na palestra do Elton sobre CakePHP Elton Minetto - Palestra de CakePHP
Abraços pessoal,

quem quiser comentar com o que achou sobre o evento, sinta-se a vontade...

Comentários (15)

Mambo V5 será desenvolvido em CakePHP

No momento de escolher um framework, todo mundo sente aquele friozinho na barriga. Bom, creio que está notícia vai diminuir e muito essa sensação.

O Mambo CMS um dos mais conhecidos gerenciadores de conteúdo open source atualmente, recentemente anunciou que sua versão 5 será desenvolvida em CakePHP. Isso trará muitos benefícios na hora de integrar soluções ao Mambo, deixando-o mais flexível.

Veja o anúncio completo: Baking Mambo .

Abraços e Long Live CakePHP!

Comentários (6)

Evento sobre Frameworks de desenvolvimento com PHP chegando

E aí pessoal!

O evento sobre Frameworks de desenvolvimento com PHP está chegando, e você já fez sua inscrição?

Senão fez não perca essa oportunidade de conhecer os três frameworks mais usados atualmente (Cake, Zend e Symfony) além de bater um papo com quem já desenvolve usando-os.

Eu estarei por lá, quem quiser bater um papo é só me procurar (tente me achar pelo crachá de identificação), que será um prazer fazer novas amizades. Aliás, será bem interessante conhecer os leitores do meu blog lá...

Para saber mais sobre o evento:

Tempo Real Eventos

ou Aqui!

Abraços pessoal e até lá!

Comentários (4)

CakePHP: HtmlExt helper - helper para ajudar na construção de checkboxes

Olá pessoal,

no último vídeo tutorial, vimos como fazer para salvar relacionamentos hasAndBelongsToMany usando a tag select multiple.

Este helper faz a mesma coisa, mas gerando uma lista de checkboxes.

Baixe o código fonte.

USO:

Supondo o nosso caso do blog:

PHP:
  1. <? echo $htmlExt->checkboxes("Categoria/Categoria", $categorias, "
  2. <ul>", "</ul>
  3. ", "
  4.     <li>", "</li>
  5. "); ?>

Lembrando que deve-se adicionar o HtmlExt no atributo $helpers do controller e salvar o arquivo html_ext.php (sem o s no final) em /app/views/helpers/

Qualquer dúvida ou melhoria, comentem!

Abraços e até a próxima.

Comentários (6)

Vídeo Tutorial: CakePHP - salvando relacionamentos hasAndBelongsToMany

Olá pessoal,

neste vídeo tutorial iremos continuar o projeto do blog com o salvamento do relacionamento entre Posts e Categorias que é do tipo hasAndBelongsToMany. Lembrando que o relacionamento hasAndBelongsToMany é equivalente ao muitos para muitos em banco de dados.

Assista agora!

Qualquer dúvida ou segestão comentem!

Abraços pessoal e até a próxima...

Comentários (15)

« Mais Antigos Mais Novos