Curso de CakePHP
1 – Introdução . . . . . . . . . . . . . . . . 2
2 – Configurações . . . . . . . . . . . . . . . 6
3 – Convenções . . . . . . . . . . . . . . . 8
4 – Bake (Gerando aplicativos pela console) . . . . . . . . 12
5 – Model . . . . . . . . . . . . . . . . . 20
6 – Controller . . . . . . . . . . . . . . . . 22
7 – View . . . . . . . . . . . . . . . . . 25
8 – Action . . . . . . . . . . . . . . . . . 29
9 – Scaffold . . . . . . . . . . . . . . . . 33
10 – Validações . . . . . . . . . . . . . . . 37
11 – Menus . . . . . . . . . . . . . . . . 40
12 – CSS . . . . . . . . . . . . . . . . . 41
13 – JavaScript . . . . . . . . . . . . . . . 44
14 – Vendors . . . . . . . . . . . . . . . . 45
15 – Relacionamentos . . . . . . . . . . . . . . 46
16 – Dicas . . . . . . . . . . . . . . . . . 47
17 - Aplicativos de Exemplo
17.1 - Aplicativo Livros . . . . . . . . . . . . 48
17.2 - Aplicativo cake_olamundo . . . . . . . . . . 60
17.3 - Outros Exemplos . . . . . . . . . . . . 66
18 – Referências . . . . . . . . . . . . . . . 67
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 2 /69
1 - Cake - Introdução
O que é CakePHP?
CakePHP é um framework de desenvolvimento rápido para PHP que fornece uma arquitetura
extensível para desenvolvimento,
manutenção e implantação de aplicativos. Usando padrões de projeto conhecidos como MVC e
ORM com o paradigma das convenções sobre
configurações, CakePHP reduz os custos de desenvolvimento e ajuda os desenvolvedores a escrever
menos código.
Framework
Um framework pode ser definido como a planta baixa de onde todos os sistemas serão construídos,
ou como uma forma que bolos, que padroniza
a forma e o volume de todos os bolos criados com ela.
O framework enxerga cada tabela como uma classe, e cada registro da tabela como um objeto
específico da classe
Alguns softwares como os CMS são muito simples de instalar e usar, até mesmo sem nenhuma
documentação, como é o caso dos CMS.
Já os frameworks, a exemplo do CakePHP, requerem que tomemos conhecimento de pelo menos
algumas convenções que ele traz.
Caso não sigamos essas convenções ele não fará muito por nós.
Sem contar que os frameworks são softwares de um tipo que exigem mais conhecimento que os
CMS.
Características do Cake
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 3 /69
Características Principais
Requisitos
Tecnicamente um banco de dados não é obrigatório, mas nós imaginamos que a maioria
das aplicações irão utilizar um. CakePHP suporta uma variedade de banco de dados:
- MySQL (4 ou superior)
- PostgreSQL
- Firebird DB2
- Microsoft SQL Server
- Oracle
- SQLite
- ODBC
- ADOdb
Como pode mudar de versão para versão (a atual é a 1.2.4.8284), confira no diretório:
cake/libs/model/datasources/dbo:
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 4 /69
cake/app
cake/cake
cake/vendors
cake/index.php
cake/index_webroot.txt
cake/README
cake/app/config
cake/app/controllers
cake/app/locale
cake/app/models
cake/app/plugins
cake/app/tests
cake/app/tmp
cake/app/vendors
cake/app/views
cake/app/webroot
cake/app/index.php
A pasta app do CakePHP é onde normalmente você colocará sua aplicação em desenvolvimento.
Vamos dar uma olhada mais de perto dentro desta pasta.
config
Contém os arquivos de configuração. Detalhes das conexões ao banco de dados, bootstrapping,
arquivos de configuração do núcleo e outros devem ser armazenados aqui.
controllers
Contém os controladores da sua aplicação e seus componentes.
locale
Guarda os arquivos com as strings para internacionalização.
models
Contém os modelos, behaviors e datasources da sua aplicação.
plugins
Contém os pacotes de plugins.
tmp
Aqui é onde o CakePHP armazena os arquivos temporários. Os dados atuais são armazenados onde
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 5 /69
vendors
Qualquer classe ou biblioteca de terceiro deve ser armazenada aqui. Para fazer um acesso rápido e
fácil, use a função vendors(). Você pode achar
que esta pasta é redundante, já que existe uma pasta com mesmo nome no nível superior da
estrutura. Nós vamos ver diferenças
entre estas duas pastas quando discutirmos sobre manipulação de múltiplas aplicações e sistemas
mais complexos.
views
Arquivos de apresentação devem vir aqui: elementos, páginas de erro, ajudantes, layouts e arquivos
de visões.
webroot
No modo de produção, esta pasta deve servir como a pasta raiz da sua aplicação. Dentro desta pasta
são guardados os arquivos públicos, como
estilos CSS, imagens e arquivos de JavaScript.
cake - bolo
baker - padeiro
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 6 /69
2 - Cake - Configurações
Mesmo sendo focado em convenções ao invés de configurações, o Cake pode ter seu
comportamento alterado através de alguns arquivos de configuração, que encontram-se na pasta
config:
database
core
router
debug
tradução
testes
etc.
cake
app1
app2
app3
...
E cada um deles deve ter seu arquivo webroot/index.php alterado na linha com
CAKE_CORE_INCLUDE_PATH, mudando para:
define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__))));
Debug
O debug nas fases de desenvolvimento e de testes é muito importante, mas após a conclusão e
entrega para o cliente devemos setar o debug para zero.
Os possíveis são:
0 = Production mode. No output. debug
1 = Show errors and warnings.
2 = Show errors, warnings, and SQL.
3 = Show errors, warnings, SQL, and complete controller dump.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 7 /69
Tradução
Download:
http://souagil.com.br/cake_i18n/pt_br.tar.gz
Download - http://www.simpletest.org/
Descompacte e copie a pasta simpletest para a subpasta vendor do seu aplicativo.
Trocar:
<?php echo $cliente['Cliente']['created'] ?>
por:
<?php echo $time->niceShort($cliente['Cliente']['created']) ?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 8 /69
3 - Cake - Convenções
Apesar de tomar um pouco de tempo para aprender as convenções do CakePHP, você ganha tempo
em um longo processo: seguindo as convenções, você ganha funcionalidades gratuitamente e livra-
se de madrugadas de manutenção de arquivos de configuração. Convenções também fazem com que
o sistema fique uniformemente desenvolvido, permitindo que outros desenvolvedores o ajudem
mais facilmente, já que segue um padrão de trabalho.
Convenções no CakePHP têm sido produzidas por anos de experiência em desenvolvimento web e
boas práticas. Apesar de sugerirmos que você use essas convenções enquanto desenvolve em
CakePHP, devemos mencionar que muitos desses princípios são facilmente sobrescritos - algo que
especialmente acontece quando trabalha-se com sistemas legados.
Em geral, nome dos arquivos são sublinhados, enquanto nome de classes são CamelCased, ou seja,
primeiras letras das palavras em maiúsculo. A classe KissesAndHugsController pode ser encontrada
no arquivo kisses_and_hugs_controller.php, por exemplo.
Porém, o nome da class e seu tipo não são necessariamente encontrados no nome do arquivo. A
classe EmailComponent é encontrada no arquivo chamado email.php e a classe HtmlHelper é
encontrada no arquivo html.php.
Convenções de modelo
Nome das classes de modelo devem ser no singular e CamelCased. Person, BigPerson e
ReallyBigPerson são exemplos de nomes convencionados para modelos. Os nomes das tabelas
correspondentes a modelos do CakePHP devem estar no plural e sublinhados.
As tabelas para os modelos mencioados anteriormente devem ser people, big_people e
really_big_people, respectivamente.
Todas as tabelas com as quais os modelos CakePHP interagem (exceto as tabelas associativas)
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 9 /69
exigem uma única chave primária para identificar unicamente cada linha. Se você deseja modelar
uma tabela que não tem uma chave primária de um único campo, como as linhas de nossa tabela
associativa posts_tags, a convenção do CakePHP é de que uma chave primária de um único campo
deve ser adicionada à tabela.
CakePHP não suporta chaves primárias compostas. No caso de você querer manipular diretamente
os dados das tabelas associativas, isso significa que você precisa usar chamadas a consultas diretas,
ou adicionar um campo como chave primária para ser capaz de atuar nela como em um modelo
normal. Por exemplo:
CREATE TABLE posts_tags (
id INT(10) NOT NULL AUTO_INCREMENT,
post_id INT(10) NOT NULL,
tag_id INT(10) NOT NULL,
PRIMARY KEY(id));
Convenções de controlador
O nome das classes de controladores são no plural, CamelCased e no final 'Controller'.
PeopleController, BigPeopleController e ReallyBigPeopleController são todos os exemplos
convencionais para nome de controladores.
A primeira função que você deve escrever em um controlador deve ser o método index(). Quando
alguém requisita um controlador sem ação, o behavior padrão é renderizar o método index() do
controlador. Por exemplo, a requisição para http://www.exemplo.com.br/apples/ mapeia para a
chamada da função index() do ApplesController, assim como
http://www.exemplo.com.br/apples/view
mapeia para a chamada da função view() no ApplesController.
Você também pode alterar a visibilidade das funções do controlador em CakePHP colocando
sublinhados na frente do nome das funções. Se a função do controlador estiver com sublinhado na
frente, a função não será disponibilizada para acesso da web através do dispatcher, mas estará
disponível para uso interno.Por exemplo:
<?php
class NewsController extends AppController {
function latest() {
$this->_findNewArticles();
}
function _findNewArticles() {
//Logic to find latest news articles
}
}
?>
Apesar da página
http://www.example.com/news/latest/
possa ser acessada pelo usuário normalmente, alguém que tente acessar a página
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 10 /69
http://www.example.com/news/_findNewArticles/
receberá um erro porque a função é precedida de um sublinhado.
Como você acabou de ver, controladores de uma única palavra são mapeados facilmente para uma
URL simples em letras minúsculas. Por exemplo, ApplesController (que seria definida em um
arquivo de nome 'apples_controller.php') é acessada a partir de http://example.com/apples.
Controladores de múltiplas palavras mapeados para URLs em camelBacked mantendo a forma
plural. Por exemplo, RedApplesController (red_apples_controller.php) seria mapeada para
http://example.com/redApples
e OperatingSystemsController
(operating_systems_controller.php)
seria mapeada para
http://example.com/operatingSystems.
Convenções de visão
Os arquivos de template de visões são nomeados depois das funções de controladores que mostram
esses arquivos de template, na forma com sublinhados. A função getReady() da classe
PeopleController irá procurar pelo template da visão em /app/views/people/get_ready.ctp.
O modelo básico é /app/views/controller/underscored_function_name.ctp.
Nomeando os pedaços da aplicação usando as convenções do CakePHP, você ganha
funcionalidades sem luta e sem amarras de configuração. Aqui o exemplo final que vincula as
associações:
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 11 /69
Resumo
O Cake automaticamente adiciona o tempo para campos que são do timo datetime e são nomeados
'created' ou 'modified'.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 12 /69
- Criar o banco
Depois vamos criar um banco chamado estoque (MySQL), no phpMydmin importe este script aqui.
O banco coterá cinco tabelas: clientes, funcionarios, produtos, pedidos e pedido_itens
- Relacionamentos
A tabela pedidos está relacionada com clientes e fun cionarios, portanto tem dois campos: cliente_id
e funcionario_id
A tabela pedido_itens se relaciona com pedidos pelo campo pedido_id.
ou
cd c:\xampplite\htdocs\cake\cake\console
Receberá a tela:
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 13 /69
---------------------------------------------------------------
App : estoque
Path: /home/ribafs/backup/public_html/cake/estoque
---------------------------------------------------------------
Your database configuration was not found. Take a moment to create one.
---------------------------------------------------------------
Database Configuration:
---------------------------------------------------------------
Name:
[default] >
Obs.: As opções entre colchetes como [default] acima são as opções sugeridas e default, basta teclar
Enter se queremos aceitá-la.
2) Selecionar o SGDB
Driver: (db2/firebird/mssql/mysql/mysqli/odbc/oracle/postgres/sqlite/sybase)
[mysql] >
3) Tipo de conexão
Persistent Connection? (y/n)
[n] >
4) Host do Banco
Database Host:
[localhost] >
5) Porta
Port?
[n] >
6) Usuário
User:
[root] >
7) Senha
Password:
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 14 /69
>
8) Nome do banco
Database Name:
[cake] >
---------------------------------------------------------------
The following database configuration will be created:
---------------------------------------------------------------
Name: default
Driver: mysql
Persistent: false
Host: localhost
User: root
Pass: ******
Database: estoque
Encoding: utf8
---------------------------------------------------------------
Look okay? (y/n)
[y] >
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 15 /69
Wrote /home/ribafs/public_html/cake/estoque/config/database.php
Aparecerá o menu:
Vamos criar na seguinte ordem para cada tabela: model, controller e view
Bake Model
Path: /home/ribafs/backup/public_html/cake/estoque/models/
---------------------------------------------------------------
Possible Models based on your current database:
1. Cliente
2. Funcionario
3. PedidoIten
4. Pedido
5. Produto
Enter a number from the list above, type in the name of another model, or 'q' to exit
[q] >
2) Tecle 1 e Enter
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] >
3) Validação
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 16 /69
5) Relacionamentos
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
[y] >
n e Enter
6) Correto?
---------------------------------------------------------------
The following Model will be created:
---------------------------------------------------------------
Name: Cliente
Primary Key: cliente
Associations:
---------------------------------------------------------------
Look okay? (y/n)
[y] >
Enter
1) m e Enter
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 17 /69
5) Relacionamentos - n e Enter
1) m e Enter
5) Relacionamento
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
[y] >
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 18 /69
Relato:
---------------------------------------------------------------
The following Model will be created:
---------------------------------------------------------------
Name: Pedido
Primary Key: pedido
Associations:
Pedido belongsTo Cliente
Pedido belongsTo Funcionario
---------------------------------------------------------------
Look okay? (y/n)
[y] >
1) c e Enter
2) 1 e Enter
5) Would you like to create the methods for admin routing? (y/n)
[y] >
n e Enter
6) Relato:
---------------------------------------------------------------
The following controller will be created:
---------------------------------------------------------------
Controller Name: Clientes
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 19 /69
---------------------------------------------------------------
Look okay? (y/n)
[y] >
1) v e Enter
2) 1 e Enter
y e Enter
Editar a views
cake/estoque/views/clientes/index.ctp
Com isso temos um aplicativo com muitos bons recursos: CRUD, paginação, CSS, etc.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 20 /69
5 - Cake - Models
Os models formam a camada da letra M do MVC, aquele que vai ao banco e conversa com os
controllers atendendo as suas solicitações e devolvendo o resultado recebido do banco de dados.
Modelo simples:
cake/ola/models/cliente.php
<?php
class Cliente extends AppModel {
var $name = 'Cliente';
}
?>
Todos os models em Cake tem a função find() usada para buscar os registros da tabela do model.
Passando parâmetros para essa função nós podemos controlar os registros a buscar.
<?php
class Produto extends AppModel {
}
?>
<?php
class Pedido extends AppModel {
//The Associations below have been created with all possible keys, those that are not needed can be
removed
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 21 /69
}
?>
Uma boa pedida para aprender sobre os Models na prática é criar aplicativos com o Bake na linha
de comando e depois analisar o código gerado.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 22 /69
6 - Cake - Controllers
Em um aplicativo de posts...
Cada ação do controller deve pegar os posts no banco e retornar para a view.
A view deve então exibir todos os posts como lista.
Controllers simples:
cake/ola/controllers/clientes_controller.php
<?php
class ClientesController extends AppController
{
var $name = 'Clientes';
}
?>
Action
Toda função pública dentro da classe controller é chamada de action.
Esta action visualizará todos os clientes com a view index.ctp
<?php
class ClientesController extends AppController
{
var $name = 'Clientes';
function index() {
$this->set('clientes', $this->Cliente->find('all'));
}
}
?>
Controllers e Views
Um controller pode ter muitos actions e cada action tem sua view. Portanto um controller pode ter
muitas views.
Cake guarda todas as views de um controller em um diretório separado (do mesmo nome do
controller).
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 23 /69
<?php
class PedidosController extends AppController {
function index() {
$this->Pedido->recursive = 0;
$this->set('pedidos', $this->paginate());
}
function add() {
if (!empty($this->data)) {
$this->Pedido->create();
if ($this->Pedido->save($this->data)) {
$this->Session->setFlash(__('The Pedido has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Pedido could not be saved. Please, try again.', true));
}
}
$clientes = $this->Pedido->Cliente->find('list');
$funcionarios = $this->Pedido->Funcionario->find('list');
$this->set(compact('clientes', 'funcionarios'));
}
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 24 /69
}
if (empty($this->data)) {
$this->data = $this->Pedido->read(null, $id);
}
$clientes = $this->Pedido->Cliente->find('list');
$funcionarios = $this->Pedido->Funcionario->find('list');
$this->set(compact('clientes','funcionarios'));
}
}
?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 25 /69
7 - Cake - Views
Convenção - Todo action dos controllers e sua correspondente view tem o mesmo nome.
Quando o action finaliza a execução a view é renderizada.
View simples:
cake/ola/views/clientes/index.ctp
<h2>Clientes</h2>
<?php if(empty($clientes)): ?>
Nenum cliente encontrado
<?php else: ?>
<table>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Ações</th>
</tr>
<?php foreach ($clientes as $cliente): ?>
<tr>
<td>
<?php echo $cliente['Cliente']['id'] ?>
</td>
<td>
<?php echo $cliente['Cliente']['nome'] ?>
</td>
<td>
<!-- actions on tasks will be added later -->
</td>
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?>
http://localhost/cake/ola/clientes
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 26 /69
Adicionar Registro
Adicionar view views/clientes/add.ctp correspondente ao action add:
Adicionar a view:
cake/ola/views/clientes/add.ctp
http://localhost/cake/ola/clientes/add
Link para Edição (adicionado logo após o comentário <!-- actions on tasks will be added later -->)
<h2>Clientes</h2>
<?php if(empty($clientes)): ?>
Nenum cliente encontrado
<?php else: ?>
<table>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Ações</th>
</tr>
<?php foreach ($clientes as $cliente): ?>
<tr>
<td>
<?php echo $cliente['Cliente']['id'] ?>
</td>
<td>
<?php echo $cliente['Cliente']['nome'] ?>
</td>
<td>
<!-- actions on tasks will be added later -->
<?php echo $html->link('Editar', array('action'=>'edit', $cliente['Cliente']['id'])); ?>
</td>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 27 /69
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 28 /69
<td>
<?php echo $cliente['Cliente']['credito_liberado']; ?>
</td>
<td>
<?php echo $cliente['Cliente']['data_nasc']; ?>
</td>
<td>
<?php echo $cliente['Cliente']['email']; ?>
</td>
<td class="actions">
<?php echo $html->link(__('View', true), array('action' => 'view', $cliente['Cliente']['cliente'])); ?>
<?php echo $html->link(__('Edit', true), array('action' => 'edit', $cliente['Cliente']['cliente'])); ?>
<?php echo $html->link(__('Delete', true), array('action' => 'delete', $cliente['Cliente']['cliente']),
null, sprintf(__('Are you sure you want to delete # %s?', true), $cliente['Cliente']['cliente'])); ?>
</td>
</tr>
<?php endforeach; ?>
</table>
</div>
<div class="paging">
<?php echo $paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled'));?>
| <?php echo $paginator->numbers();?>
<?php echo $paginator->next(__('next', true).' >>', array(), null, array('class' => 'disabled'));?>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('New Cliente', true), array('action' => 'add')); ?></li>
<li><?php echo $html->link(__('List Pedidos', true), array('controller' => 'pedidos', 'action' =>
'index')); ?> </li>
<li><?php echo $html->link(__('New Pedido', true), array('controller' => 'pedidos', 'action' =>
'add')); ?> </li>
</ul>
</div>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 29 /69
8 - Cake - Actions
Os Actions como o nome sugere, representam ações do usuário, que as emitem pelas views e são
processadas nos controllers.
Cada ação do usuário é representada por uma função no controller e esta função deve ter o mesmo
nome da view.
Exemplo: index.ctp é a view que é atendida pelo action index() no controller.
<?php
class ClientesController extends AppController
{
var $name = 'Clientes';
function index() {
$this->set('clientes', $this->Cliente->find('all'));
}
}
?>
Para isso precisaremos adicionar uma variável (array $helpers) e uma função add() ao controller,
como também adicionar uma view à pasta
clientes, de nome add.ctp.
function add() {
if (!empty($this->data)) {
$this->Cliente->create();
if ($this->Cliente->save($this->data)) {
$this->Session->setFlash('Cliente foi adicionado');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('Cliente não adicionado. Tente novamente.');
}
}
}
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 30 /69
Adicionando Registros
Para isso precisamos adicionar um action (edit) ao controller e uma view para este action
(views/clientes/edit.ctp).
Excluindo Registros
Para isso devemos adicionar um action ao controle chamado delete() correspondente e uma linha na
view index.ctp
<td class="actions">
<?php echo $html->link(__('View', true), array('action' => 'view', $cliente['Cliente']['cliente'])); ?>
<?php echo $html->link(__('Edit', true), array('action' => 'edit', $cliente['Cliente']['cliente'])); ?>
<?php echo $html->link(__('Delete', true), array('action' => 'delete', $cliente['Cliente']['cliente']),
null, sprintf(__('Are you sure you want to delete # %s?', true), $cliente['Cliente']['cliente'])); ?>
</td>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 31 /69
Ou seja, neste caso, não criamos mais uma views, mas apenas uma linha para o action delete().
Veja agora todos os actions comuns para a tabela clientes, no controller clientes.php e classe
Clientes:
<?php
class ClientesController extends AppController {
var $name = 'Clientes';
var $helpers = array('Html', 'Form');
function index() {
$this->Cliente->recursive = 0;
$this->set('clientes', $this->paginate());
}
function add() {
if (!empty($this->data)) {
$this->Cliente->create();
if ($this->Cliente->save($this->data)) {
$this->Session->setFlash(__('The Cliente has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Cliente could not be saved. Please, try again.', true));
}
}
}
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 32 /69
}
if (empty($this->data)) {
$this->data = $this->Cliente->read(null, $id);
}
}
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 33 /69
9 - Cake - Scaffold
As ações do Scaffoldo são nomeadas como: index(), add(), edit(), view(), and delete().
Podemos deixar as ações de CRUD do scaffold quando não desejamos gerar código manualmente.
Criar tabela
create table clientes
(
id int not null auto_increment primary key,
nome char(45) not null
);
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 34 /69
Criar o model:
cake/scaffold/models/cliente.php
<?php
class Cliente extends AppModel
{
var $name = 'Cliente';
}
?>
Criar o controller:
cake/scaffold/controllers/clientes_controller.php
<?php
class ClientesController extends AppController
{
var $scaffold;
}
?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 35 /69
Detalhe: na tabela jogadores devemos ter um campo para relacionar com a equipes, no caso temos
equipe_id.
Este campo segue a convenção do Cake: nometabelasingular_id
Criar os controllers
cake/scaffold/controllers/jogadores_controller.php
<?php
class JogadoresController extends AppController
{
var $scaffold;
}
?>
cake/scaffold/controllers/equipes_controller.php
<?php
class EquipesController extends AppController
{
var $scaffold;
}
?>
Criando os Models
cake/scaffold/models/jogador.php
<?php
class Jogador extends AppModel
{
var $name = 'Jogador';
cake/scaffold/models/equipe.php
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 36 /69
<?php
class Equipe extends AppModel
{
var $name = 'Equipe';
}
?>
Abrir no navagador:
http://localhost/cake/scaffold/equipes
http://localhost/cake/scaffold/jogadores
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 37 /69
10 - Cake - Validações
<?php
class Pedido extends AppModel {
//The Associations below have been created with all possible keys, those that are not needed can be
removed
}
?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 38 /69
Vejamos os vários tipos de validação embutida que o Cake oferece (via Bake):
Você deseja fornecer critérios de validação para os campos de seu model? (y/n)
[y] >
Qual é a primaryKey?
[cliente] >
Field: cliente
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1 - alphaNumeric
2 - between
3 - blank
4 - boolean
5 - cc
6 - comparison
7 - custom
8 - date
9 - decimal
10 - email
11 - equalTo
12 - extension
13 - file
14 - inList
15 - ip
16 - maxLength
17 - minLength
18 - money
19 - multiple
20 - notEmpty
21 - numeric
22 - phone
23 - postal
24 - range
25 - ssn
26 - time
27 - url
28 - userDefined
29 - Do not do any validation on this field.
... or enter in a valid regex validation string.
[21] >
Veja que quando concordamos que queremos validar ele mostra o primeiro campo e já nos sugere
um tipo de validação.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 39 /69
No exemplo acima o campo cliente e integer e o Bake sugere validar como 21, que representa
numeric.
Claro que podemos mudar para outro da lista, mas isso já ajuda quando não sabemos o que fazer.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 40 /69
11 - Cake - Menu
Após criar o código para cada tabela devemos adicionar um menu que integre todo o código.
Uma forma simples e natural de fazer isso é adicionando o arquivo views/pages/home.ctp
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 41 /69
12 - Cake - CSS
CakePHP e CSS
<?php
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php echo $html->charset(); ?>
<title>
<?php __('CakePHP: the rapid development php framework:'); ?>
<?php echo $title_for_layout; ?>
</title>
<?php
echo $html->meta('icon');
echo $html->css('cake.generic');
echo $scripts_for_layout;
?>
</head>
<body>
<div id="container">
<div id="header">
<h1><?php echo $html->link(__('CakePHP: the rapid development php framework', true),
'http://cakephp.org'); ?></h1>
</div>
<div id="content">
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 42 /69
</div>
<div id="footer">
<?php echo $html->link(
$html->image('cake.power.gif', array('alt'=> __("CakePHP: the rapid development php framework",
true), 'border'=>"0")),
'http://www.cakephp.org/',
array('target'=>'_blank'), null, false
);
?>
</div>
</div>
<?php echo $cakeDebug; ?>
</body>
</html>
Personalizando o Template
Caso criemos um arquivo chamado:
cake/app/views/layouts/default.ctp
Observe que adicionando nosso próprio estilo podemos controlar a aparência do site.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 43 /69
Para que o CSS do Cake volte, mas agora um pouco personalizado por nós.
Observe que o layout não é o padrão do Cake, pois tem algumas diferenças.
Referência: http://letthemcodecake.com/learning-cakephp/4/
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 44 /69
13 - Cake - JavaScript
Os arquivos .js (Javascript) caso existam devem ser salvos no diretório webroot/js/
Referências:
http://bakery.cakephp.org/articles/view/toggling-items-with-javascript
http://debuggable.com/posts/passing-controller-variables-to-your-javascript:48b4f0c6-c718-47b2-
bca1-05794834cda3
http://netunno.com/2009/08/incluir-arquivos-javascript-e-css-pela-view-de-um-conteudo-no-
cakephp/
http://ryan.ifupdown.com/2009/08/22/how-to-use-javascript-codeblock-in-cakephp/
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 45 /69
14 - Cake - Verdors
São os scripts de terceiros, que não fazem parte do core do Cake, que ficam no diretório verdors.
Tem um pequeno problema aqui: só funciona se o nome do arquivo tiver todas as letras em
minúsculas.
Caso o arquivo tenha a inicial maiúsculas ao invés use:
App::import('Vendor', 'exemplo', array('file' => 'Exemplo.php'));
Referências:
http://lemoncake.wordpress.com/2007/08/08/vendors-in-cakephp/
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 46 /69
15 - Cake - Relacionamentos
O cake detecta relacionamentos entre as tabelas, mas para isso precisamos atender a algumas das
suas convenções.
Para isso a chave primária deve ser id ou criar com o Bake e indicar a chave primária.
O campo foreign key da tabela relacionada deve chamar-se obrigatoriamente
nometabelasingular_id
Exemplo:
cliente_id
Agora o Cake irá detectar os relacionamentos e adicionar uma combo nos campos foreign key das
tabelas relacionadas que será preenchida com dados da outra tabela.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 47 /69
16 - Cake - Dicas
Como eu estou sempre fazendo isso, fica mais prático já efetuar todas essas alterações na pasta
"app" do cake para que quando eu a copie já leve todas as minhas alterações.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 48 /69
Aplicativo gerado pelo Bake com a finalidade de mostrar um relacionamento entre as tabelas
autores e livros e também mostrar o comportamento das validações.
Banco - livro
tabelas
insert into livros values ('978-0-470-03899-4', 'O Conde de Monte Cristo', 'Nova Data', 1);
insert into livros values ('978-0-470-03899-5', 'Os Três Mosqueteiros', 'Nova Data', 1);
insert into livros values ('978-0-470-03899-6', 'Os Lusíadas', 'Saraiva', 2);
insert into livros values ('978-0-470-03899-7', 'A Divina Comédia', 'Moderna', 3);
insert into livros values ('978-0-470-03899-8', 'O Estrangeiro', 'Moderna', 4);
insert into livros values ('979-0-470-03899-4', 'A Idade da Razão', 'Novatec', 5);
insert into livros values ('976-0-470-03899-4', 'Pais Brilhantes, Professores Fascinantes', 'Eldorado',
6);
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 49 /69
Agora usemos o bake para criar o aplicativo, com validação dos campos e relacionamento.
cd /var/www/cake/cake/console
Use diretamente
<h1>Aplicativo Livros</h1>
<p>Tarefas</p>
<ul>
<li><?php echo $html->link('Lista de todos os Autores', array('controller' => 'autores',
'action'=>'index')); ?></li>
<li><?php echo $html->link('Adicionar novo Autor', array('controller' => 'autores', 'action'=>'add'));
?></li>
<li><?php echo $html->link('Lista de todos os Livros', array('controller' => 'livros',
'action'=>'index')); ?></li>
<li><?php echo $html->link('Adicionar novo Livro', array('controller' => 'livros', 'action'=>'add')); ?
></li>
<li>Editar e Excluir Autores</li>
<li>Editar e Excluir Livros</li>
</ul>
Após implementar o suporte a pt-BR as mensagens de erro serão traduzidas, os nomes das ações
dentre outros.
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 50 /69
models/autore.php
<?php
class Autore extends AppModel {
}
?>
models/livro.php
<?php
class Livro extends AppModel {
//The Associations below have been created with all possible keys, those that are not needed can
be removed
var $belongsTo = array(
'Autore' => array(
'className' => 'Autore',
'foreignKey' => 'autore_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
}
?>
controllers/autores_controller.php
<?php
class AutoresController extends AppController {
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 51 /69
function index() {
$this->Autore->recursive = 0;
$this->set('autores', $this->paginate());
}
function add() {
if (!empty($this->data)) {
$this->Autore->create();
if ($this->Autore->save($this->data)) {
$this->Session->setFlash(__('The Autore has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Autore could not be saved. Please, try again.',
true));
}
}
}
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 52 /69
}
?>
controllers/livros_controller.php
<?php
class LivrosController extends AppController {
function index() {
$this->Livro->recursive = 0;
$this->set('livros', $this->paginate());
}
function add() {
if (!empty($this->data)) {
$this->Livro->create();
if ($this->Livro->save($this->data)) {
$this->Session->setFlash(__('The Livro has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Livro could not be saved. Please, try again.',
true));
}
}
$autores = $this->Livro->Autore->find('list');
$this->set(compact('autores'));
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 53 /69
}
?>
views/autores/autores/add.ctp
<div class="autores form">
<?php echo $form->create('Autore');?>
<fieldset>
<legend><?php __('Add Autore');?></legend>
<?php
echo $form->input('nome');
echo $form->input('email');
?>
</fieldset>
<?php echo $form->end('Submit');?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 54 /69
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('List Autores', true), array('action' => 'index'));?></li>
</ul>
</div>
views/autores/autores/edit.ctp
<div class="autores form">
<?php echo $form->create('Autore');?>
<fieldset>
<legend><?php __('Edit Autore');?></legend>
<?php
echo $form->input('autor');
echo $form->input('nome');
echo $form->input('email');
?>
</fieldset>
<?php echo $form->end('Submit');?>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('Delete', true), array('action' => 'delete', $form-
>value('Autore.autor')), null, sprintf(__('Are you sure you want to delete # %s?', true), $form-
>value('Autore.autor'))); ?></li>
<li><?php echo $html->link(__('List Autores', true), array('action' => 'index'));?></li>
</ul>
</div>
views/autores/autores/index.ctp
<div class="autores index">
<h2><?php __('Autores');?></h2>
<p>
<?php
echo $paginator->counter(array(
'format' => __('Page %page% of %pages%, showing %current% records out of %count% total,
starting on record %start%, ending on %end%', true)
));
?></p>
<table cellpadding="0" cellspacing="0">
<tr>
<th><?php echo $paginator->sort('autor');?></th>
<th><?php echo $paginator->sort('nome');?></th>
<th><?php echo $paginator->sort('email');?></th>
<th class="actions"><?php __('Actions');?></th>
</tr>
<?php
$i = 0;
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 55 /69
views/autores/autores/view.ctp
<div class="autores view">
<h2><?php __('Autore');?></h2>
<dl><?php $i = 0; $class = ' class="altrow"';?>
<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Autor'); ?></dt>
<dd<?php if ($i++ % 2 == 0) echo $class;?>>
<?php echo $autore['Autore']['autor']; ?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 56 /69
</dd>
<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Nome'); ?></dt>
<dd<?php if ($i++ % 2 == 0) echo $class;?>>
<?php echo $autore['Autore']['nome']; ?>
</dd>
<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Email'); ?></dt>
<dd<?php if ($i++ % 2 == 0) echo $class;?>>
<?php echo $autore['Autore']['email']; ?>
</dd>
</dl>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('Edit Autore', true), array('action' => 'edit', $autore['Autore']
['autor'])); ?> </li>
<li><?php echo $html->link(__('Delete Autore', true), array('action' => 'delete',
$autore['Autore']['autor']), null, sprintf(__('Are you sure you want to delete # %s?', true),
$autore['Autore']['autor'])); ?> </li>
<li><?php echo $html->link(__('List Autores', true), array('action' => 'index')); ?> </li>
<li><?php echo $html->link(__('New Autore', true), array('action' => 'add')); ?> </li>
</ul>
</div>
livro/views/livros/add.ctp
<div class="livros form">
<?php echo $form->create('Livro');?>
<fieldset>
<legend><?php __('Add Livro');?></legend>
<?php
echo $form->input('titulo');
echo $form->input('editora');
echo $form->input('autore_id');
?>
</fieldset>
<?php echo $form->end('Submit');?>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('List Livros', true), array('action' => 'index'));?></li>
<li><?php echo $html->link(__('List Autores', true), array('controller' => 'autores', 'action'
=> 'index')); ?> </li>
<li><?php echo $html->link(__('New Autore', true), array('controller' => 'autores', 'action'
=> 'add')); ?> </li>
</ul>
</div>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 57 /69
livro/views/livros/edit.ctp
<div class="livros form">
<?php echo $form->create('Livro');?>
<fieldset>
<legend><?php __('Edit Livro');?></legend>
<?php
echo $form->input('isbn');
echo $form->input('titulo');
echo $form->input('editora');
echo $form->input('autore_id');
?>
</fieldset>
<?php echo $form->end('Submit');?>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('Delete', true), array('action' => 'delete', $form-
>value('Livro.isbn')), null, sprintf(__('Are you sure you want to delete # %s?', true), $form-
>value('Livro.isbn'))); ?></li>
<li><?php echo $html->link(__('List Livros', true), array('action' => 'index'));?></li>
<li><?php echo $html->link(__('List Autores', true), array('controller' => 'autores', 'action'
=> 'index')); ?> </li>
<li><?php echo $html->link(__('New Autore', true), array('controller' => 'autores', 'action'
=> 'add')); ?> </li>
</ul>
</div>
livro/views/livros/index.ctp
<div class="livros index">
<h2><?php __('Livros');?></h2>
<p>
<?php
echo $paginator->counter(array(
'format' => __('Page %page% of %pages%, showing %current% records out of %count% total,
starting on record %start%, ending on %end%', true)
));
?></p>
<table cellpadding="0" cellspacing="0">
<tr>
<th><?php echo $paginator->sort('isbn');?></th>
<th><?php echo $paginator->sort('titulo');?></th>
<th><?php echo $paginator->sort('editora');?></th>
<th><?php echo $paginator->sort('autore_id');?></th>
<th class="actions"><?php __('Actions');?></th>
</tr>
<?php
$i = 0;
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 58 /69
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 59 /69
livro/views/livros/view.ctp
<div class="livros view">
<h2><?php __('Livro');?></h2>
<dl><?php $i = 0; $class = ' class="altrow"';?>
<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Isbn'); ?></dt>
<dd<?php if ($i++ % 2 == 0) echo $class;?>>
<?php echo $livro['Livro']['isbn']; ?>
</dd>
<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Titulo'); ?></dt>
<dd<?php if ($i++ % 2 == 0) echo $class;?>>
<?php echo $livro['Livro']['titulo']; ?>
</dd>
<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Editora'); ?></dt>
<dd<?php if ($i++ % 2 == 0) echo $class;?>>
<?php echo $livro['Livro']['editora']; ?>
</dd>
<dt<?php if ($i % 2 == 0) echo $class;?>><?php __('Autore'); ?></dt>
<dd<?php if ($i++ % 2 == 0) echo $class;?>>
<?php echo $html->link($livro['Autore']['autor'], array('controller' => 'autores', 'action'
=> 'view', $livro['Autore']['autor'])); ?>
</dd>
</dl>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('Edit Livro', true), array('action' => 'edit', $livro['Livro']
['isbn'])); ?> </li>
<li><?php echo $html->link(__('Delete Livro', true), array('action' => 'delete', $livro['Livro']
['isbn']), null, sprintf(__('Are you sure you want to delete # %s?', true), $livro['Livro']['isbn'])); ?>
</li>
<li><?php echo $html->link(__('List Livros', true), array('action' => 'index')); ?> </li>
<li><?php echo $html->link(__('New Livro', true), array('action' => 'add')); ?> </li>
<li><?php echo $html->link(__('List Autores', true), array('controller' => 'autores', 'action'
=> 'index')); ?> </li>
<li><?php echo $html->link(__('New Autore', true), array('controller' => 'autores', 'action'
=> 'add')); ?> </li>
</ul>
</div>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 60 /69
Configurar ola_cake/config/database.php
Criar tabela
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 61 /69
- Criar o controller
- Adicionar o action index para o controller
- Criar a view index.ctp
Model:
cake/ola_cake/models/cliente.php
<?php
class Cliente extends AppModel {
var $name = 'Cliente';
}
?>
Controller:
cake/ola_cake/controllers/clientes_controller.php
<?php
class ClientesController extends AppController
{
var $name = 'Clientes';
}
?>
<?php
class ClientesController extends AppController
{
var $name = 'Clientes';
View:
cake/ola_cake/views/clientes/index.ctp
<h2>Clientes</h2>
<?php if(empty($clientes)): ?>
Nenum cliente encontrado
<?php else: ?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 62 /69
<table>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Ações</th>
</tr>
<?php foreach ($clientes as $cliente): ?>
<tr>
<td>
<?php echo $cliente['Cliente']['id'] ?>
</td>
<td>
<?php echo $cliente['Cliente']['nome'] ?>
</td>
<td>
<!-- actions on tasks will be added later -->
</td>
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?>
http://localhost/cake/ola_cake/clientes
Aí temos a listagem dos registros da tabela praticamente sem programação, apenas algumas poucas
linhas.
Adicionar Registros
Para isso precisaremos adicionar uma variável (array $helpers) e uma função add() ao controller,
como também adicionar uma view à pasta
clientes, de nome add.ctp.
function add() {
if (!empty($this->data)) {
$this->Cliente->create();
if ($this->Cliente->save($this->data)) {
$this->Session->setFlash('Cliente foi adicionado');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('Cliente não adicionado. Tente novamente.');
}
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 63 /69
}
}
<?php
class ClientesController extends AppController
{
var $name = 'Clientes';
var $helpers = array('Html', 'Form');
function index() {
$this->set('clientes', $this->Cliente->find('all'));
}
function add() {
if (!empty($this->data)) {
$this->Cliente->create();
if ($this->Cliente->save($this->data)) {
$this->Session->setFlash('Cliente foi adicionado');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('Cliente não adicionado. Tente novamente.');
}
}
}
}
?>
Adicionar a view:
cake/ola_cake/views/clientes/add.ctp
http://localhost/cake/ola_cake/clientes/add
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 64 /69
Adicionar um link do form Add para a nossa view index.ctp (adicionar ao final):
Editar Registros
Para isso precisamos adicionar um action (edit) ao controller e uma view para este action
(views/clientes/edit.ctp).
cake/ola_cake/controllers/clientes_controller.php
<?php
class ClientesController extends AppController
{
var $name = 'Clientes';
function add() {
if (!empty($this->data)) {
$this->Cliente->create();
if ($this->Cliente->save($this->data)) {
$this->Session->setFlash('Cliente foi adicionado');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('Cliente não adicionado. Tente novamente.');
}
}
}
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 65 /69
<h2>Clientes</h2>
<?php if(empty($clientes)): ?>
Nenum cliente encontrado
<?php else: ?>
<table>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Ações</th>
</tr>
<?php foreach ($clientes as $cliente): ?>
<tr>
<td>
<?php echo $cliente['Cliente']['id'] ?>
</td>
<td>
<?php echo $cliente['Cliente']['nome'] ?>
</td>
<td>
<!-- actions on tasks will be added later -->
<?php echo $html->link('Editar', array('action'=>'edit', $cliente['Cliente']['id'])); ?>
</td>
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?>
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 66 /69
– bake
– blog
– estoque
– foreign
– forum
– ola_cake
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 67 /69
18 - Cake - Referências
Site oficial
http://cakephp.org
Manuais
Manual do Cake - CookBook
http://book.cakephp.org/pt/complete/3/The-Manual
Blog Tutorial
http://book.cakephp.org/view/219/the-cakephp-blog-tutorial
Screencasts
http://cakephp.org/screencasts
CheatSheets
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf
Listas
FAQs da Lista internacional
http://groups.google.com/group/cake-php/web/faq?pli=1
Lista portuguesa
http://groups.google.com/group/cake-php-pt
Tutoriais
Tutorial da IBM em 5 partes somando mais de 130 páginas - Cook up Web sites fast with CakePHP
https://www.ibm.com/developerworks/opensource/tutorials/os-php-cake1/
* Part 1 focuses on getting CakePHP up and running, and the basics of how to put together a simple
application
allowing users to register for an account and log in to the application.
http://www.ibm.com/developerworks/opensource/tutorials/os-php-cake1/os-php-cake1-pdf.pdf
Código fonte - http://www.ibm.com/developerworks/apps/download/index.jsp?
contentid=390462&filename=os-php-cake1.source.zip&method=http&locale=worldwide
* Part 2 demonstrates how to use scaffolding and Bake to get a jump-start on your application, and
using CakePHP's access control lists (ACLs).
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 68 /69
http://www.ibm.com/developerworks/opensource/tutorials/os-php-cake2/os-php-cake2-pdf.pdf
Código fonte - http://www.ibm.com/developerworks/apps/download/index.jsp?
contentid=390704&filename=os-php-cake2.source.zip&method=http&locale=worldwide
* Part 3 shows how to use Sanitize, a handy CakePHP class, which helps secure an application by
cleaning up user-submitted data.
It also covers the CakePHP security component, handling invalid requests, and other advanced
request authentication.
http://www.ibm.com/developerworks/opensource/library/os-php-cake3/
Código fonte - http://www.ibm.com/developerworks/apps/download/index.jsp?
contentid=184377&filename=os-php-cake3.source.zip&method=http&locale=worldwide
* Part 4 focuses primarily on the Session component of CakePHP, demonstrating three ways to save
session data, as well as the Request
Handler component to help you manage multiple types of requests (mobile browsers, requests
containing XML or HTML, etc.).
http://www.ibm.com/developerworks/opensource/tutorials/os-php-cake4/os-php-cake4-pdf.pdf
Código fonte - http://www.ibm.com/developerworks/apps/download/index.jsp?
contentid=390856&filename=os-php-cake4.source.zip&method=http&locale=worldwide
* Part 5 deals with caching, specifically view and layout caching, which can help reduce server
resource consumption and speed up your application.
http://www.ibm.com/developerworks/opensource/library/os-php-cake5/?
S_TACT=105AGX44&S_CMP=TUT
https://www6.software.ibm.com/developerworks/education/os-php-wiki1/os-php-wiki1-pdf.pdf
Código fonte - https://www6.software.ibm.com/developerworks/education/os-php-
wiki1/downloads.html
Livros
Livros impressos sobre CakePHP
http://astore.amazon.com/cakesoftwaref-20
Outros livros:
Ribamar FS – http://cursos.ribafs.org
Curso de CakePHP Página 69 /69
Ribamar FS – http://cursos.ribafs.org