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: