24/11/2007
Olá pessoal,
dia 8 de Dezembro na FIAP em São Paulo Elton Minetto irá ministrar o curso “Mão na Massa Cake” .
Quem estava aguardando uma oportunidade de iniciar ou aprender mais sobre o framework não pode perder.
Até a próxima!
Link Permanente:
19/11/2007
Olá pessoal,
desculpem a demora na postagem de algum material sobre a CONISLI, mas que fim de ano sempre é muito “brabo” no quesito correria
.

Quem quiser baixar os slides, aqui estão eles.
Sobre os vídeos, ainda estou apanhando para compactá-los. Mas creio que logo conseguirei
Abraços e até mais…
Link Permanente:
03/11/2007
Olá pessoal,
entre os dias 9 e 11 de Novembro acontecerá em São Paulo (na UNICID) o CONISLI – Congresso Internacional de Software Livre. Eu irei participar através da palestra: CakePHP – desenvolvimento web ágil com PHP.
A minha palestra acontecerá no dia 10/11 as 9:00 da manhã.
Conto com a presença de vocês, não só para a minha palestra mas também para o congresso.
Abraços,
Link Permanente:
18/10/2007
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:
-
foreach($imagens as $imagem){
-
$img["Imagem"]["nome"] = $imagem;
-
$this->Imagem->save($img);
-
-
}
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:
-
foreach($imagens as $imagem){
-
$img["Imagem"]["nome"] = $imagem;
-
-
$this->Imagem->id = null;
-
$this->Imagem->save($img);
-
-
}
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...
Link Permanente:
15/10/2007
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:
-
function beforeSave(){
-
if (!
isset($this->
data["Model"]["CampoChavePrimária"])){
-
$this->
data["Model"]["CampoCriadoEm"] =
date('Y-m-d H:i:s');
-
}
-
$this->
data["Model"]["CampoModificadoEm"] =
date('Y-m-d H:i:s');
-
return true;
-
}
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!
Link Permanente:
12/10/2007
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:
-
$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:
-
$controllerPaths =
array(ROOT.DS.
"app".DS.
"controllers".DS
);
-
-
$viewPaths =
array(ROOT.DS.
"app".DS.
"views".DS
);
Qualquer dúvida, comentem!
Até a próxima pessoal!
Link Permanente:
28/09/2007
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:
-
/*
-
JAXHelper - CakePHP Helper for Ajax with jQuery
-
Author: Tulio Faria (www.tuliofaria.net)
-
Requeriments:
-
- jquery: http://docs.jquery.com/Downloading_jQuery
-
- jform (for some features like observeForm): http://jquery.com/plugins/project/form
-
Using:
-
- include jquery.js and jquery.form.js in your view (yes, using plain html or html helper
)
-
- include the helper Jax in your controller
-
- call any of methods available: link, observeField and observeForm
-
*/
-
-
class JaxHelper extends Helper {
-
-
var $helpers =
array("Html");
-
-
function link($text,
$url,
$target,
$options =
null,
$loading =
null){
-
-
$url = $this->Html->url($url);
-
$att = " ";
-
-
-
-
foreach($options as $k=>$v){
-
$att.=$k.'="'.$v.'" ';
-
}
-
-
}
-
-
echo "<a id="\
" href="http:
//www.tuliofaria.net/%5C%22$url%5C%22">$text</a>";
-
echo $this->_jsBlock
("\$(\"#$aId\").click( function(){ \$.post(\"$url\", function(data){
-
\$(\"$target\").html(data); }); return false; }); ");
-
}
-
function observeField($element, $options){
-
$event = $options["event"];
-
$update = $options["update"];
-
$url = $this->Html->url($options["url"]);
-
-
$code = $options["loading"].'
-
$.ajax({
-
type: "POST",
-
url: "'.$url.'",
-
data: $("'.$element.'").serialize(),
-
success: function(data){
-
$("'.$update.'").html(data);
-
'.$options["complete"].'
-
}
-
});
-
';
-
-
return $this->_jsBlock($this->_addReady("\$(\"$element\").$event(function(){ $code })"));
-
}
-
-
function observeForm($element, $options){
-
$event = $options["event"];
-
$update = $options["update"];
-
$url = $this->Html->url($options["url"]);
-
-
$code = '$("'.$element.'").ajaxSubmit({
-
target: \''.$update.'\',
-
beforeSubmit: function(){'.$options["loading"].'},
-
success: function(){'.$options["complete"].'}
-
}
-
);';
-
-
return $this->_jsBlock($this->_addReady("\$(\"$element\").$event(function(){ $code return false; })"));
-
}
-
-
function _jsBlock($content){
-
return "<script type="\">$content</script>";
-
}
-
function _addReady($content){
-
return "\$(function(){ $content } );";
-
}
-
-
function test(){
-
echo $this->_jsBlock
($this->_addReady
("alert(\"Jax Helper has been installed and ready to use!\");"));
-
}
-
}
-
?>
Exemplos:
Link:
PHP:
-
link("Click Here!",
"/contatos/info/1/",
"teste",
"teste");
?>
Observe field:
PHP:
-
$options["event"] = "change";
-
$options["update"] = "#teste";
-
$options["url"] = "/contatos/info/1/";
-
$options["loading"] = "$('#loading').fadeIn('slow');$('#teste').hide();";
-
$options["complete"] = "$('#teste').fadeIn('slow');$('#loading').fadeOut();";
-
echo $jax->
observeField("#texto",
$options);
?>
ObserveForm:
PHP:
-
$options["event"] = "submit";
-
$options["update"] = "#teste";
-
$options["url"] = "/contatos/info/1/";
-
$options["loading"] = "$('#loading').fadeIn('slow');$('#teste').hide();";
-
$options["complete"] = "$('#teste').fadeIn('slow');$('#loading').fadeOut();";
-
-
echo $jax->
observeForm("#testando",
$options);
?>
Em breve publicarei exemplos mais decentes de uso.
Qualquer sugestão ou dúvida, comente!
Abraços,
Link Permanente:
28/08/2007
[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

Abraços pessoal,
Link Permanente:
07/08/2007
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):

Abraços pessoal,
quem quiser comentar com o que achou sobre o evento, sinta-se a vontade...
Link Permanente:
26/07/2007
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!
Link Permanente: