Vous êtes sur la page 1sur 90

Curso de CakePHP

Pgina 1 /90

Curso de CakePHP
1 Introduo . . . . . . . . 2 Configuraes . . . . . . . 3 Convenes . . . . . . . 4 Bake (Gerando aplicativos pela console) 5 Model . . . . . . . . . 6 Controller . . . . . . . . 7 View . . . . . . . . . 8 Action . . . . . . . . . 9 Scaffold . . . . . . . . 10 Validaes . . . . . . . 11 MVC . . . . . . . . . 12 Menus . . . . . . . . 13 CSS . . . . . . . . . 14 JavaScript . . . . . . . 15 Helpers . . . . . . . . 16 Componentes . . . . . . . 17 Routes . . . . . . . . 18 Vendors . . . . . . . . 19 Plugins . . . . . . . . 20 Relacionamentos . . . . . . 21 Dicas . . . . . . . . . 22 - Aplicativos de Exemplo 22.1 - Aplicativo Livros . . . . 22.2 - Aplicativo cake_olamundo . . 22.3 - Outros Exemplos . . . . 22 Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 6 8 12 20 22 25 29 33 37 40 43 44 47 48 51 53 61 62 67 68 69 81 87 88

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Introduo O que CakePHP?

Pgina 2 /90

CakePHP um framework de desenvolvimento rpido para PHP que fornece uma arquitetura extensvel para desenvolvimento, manuteno e implantao de aplicativos. Usando padres de projeto conhecidos como MVC e ORM com o paradigma das convenes sobre configuraes, CakePHP reduz os custos de desenvolvimento e ajuda os desenvolvedores a escrever menos cdigo. Site oficial - http://cakephp.org Desde que Ruby on Rails se tornou um popular framework, equipes de desenvolvedores tem criado clones do framework Rails ou Rails em vrias linguagens: TurboGears para Python; Zend, Symfony, e muitos outros para PHP; Catalyst para Perl; e assim por diante. Com tantas opes, por que escolher CakePHP para seu projeto web? Framework Um framework pode ser definido como a planta baixa de onde todos os sistemas sero construdos, 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 especfico da classe Alguns softwares como os CMS so muito simples de instalar e usar, at mesmo sem nenhuma documentao, como o caso dos CMS. J os frameworks, a exemplo do CakePHP, requerem que tomemos conhecimento de pelo menos algumas convenes que ele traz. Caso no sigamos essas convenes ele no far muito por ns. Sem contar que os frameworks so softwares de um tipo que exigem mais conhecimento que os CMS. Caractersticas do Cake Cake tem como objetivo simplificar o processo de desenvolvimento para a construo de aplicaes web provendo um mtodo geral para organizar o banco de dados e outros recursos que reduzem a codificao. Embora esta abordagem geral da programao web seja em si uma caracterstica importante do Cake, o seu repositrio de outros recursos poderosos como validao embutida, listas de controle de acesso (ACLs), sanitizao de dados, segurana e componentes de manipulao de sesso e cache de View fazem o Cake vale a pena para qualquer desenvolvedor srio.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Caractersticas Principais

Pgina 3 /90

- Sem Configurao (com convenes) Configure o banco e deixe a mgica iniciar - Extremamente Simples Apenas veja o nome...Ele chama-se Cake/Bolo - Ativa e Amigvel Comunidade Junte-se a ns no #cakephp (IRC). Adoraramos ajudar voc a comear - Licena Flexvel Distribudo sob a licena MIT - Clean IP Toda linha de cdigo foi escrita pela equipe de desenvolvimento do CakePHP - Melhores Prticas cobrindo segurana, autenticao e manipulao de session, alm de muitas outras caractersticas - OO Caso seja um programador OO experiente ou novato se sentir confortvel - Compatvel com as verses 4 e 5 do PHP - CRUD Integrado para interao com o banco de dados - Aplicao scaffolding - Gerao de cdigo - Arquitetura MVC - Requisio de dispatcher com URL limpa, personalizada e rotas/routes - Validao embutida - Rpidos e flexveis templates (Sintaxe PHP, com helpers) - View Helpers para AJAX, JavaScript, Forms HTML e mais - Email, Cookie, Security, Session e Request Handling Components - Flexvel ACL - Sanitizao de Dados - Flexvel Caching - Localizao - Trabalha a partir de qualquer diretrio do site, com pouca ou nenhuma configurao do Apache envolvidas Requisitos PHP 4.3.2 ou superior Servidor Web Apache com o mod_rewrite Tecnicamente um banco de dados no obrigatrio, mas ns imaginamos que a maioria das aplicaes iro 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 verso para verso (a atual a 1.2.4.8284), confira no diretrio: cake/libs/model/datasources/dbo: Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 4 /90

dbo_db2.php, dbo_firebird.php, dbo_mssql.php, dbo_mysql.php, dbo_mysqli.php, dbo_odbc.php, dbo_oracle.php, dbo_postgres.php, dbo_sqlite.php, dbo_sybase.php. Estrutura original do diretrio do cake: cake/app cake/cake cake/vendors cake/index.php cake/index_webroot.txt cake/README Estrutura original do diretrio app: 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 aplicao em desenvolvimento. Vamos dar uma olhada mais de perto dentro desta pasta. config Contm os arquivos de configurao. Detalhes das conexes ao banco de dados, bootstrapping, arquivos de configurao do ncleo e outros devem ser armazenados aqui. controllers Contm os controladores da sua aplicao e seus componentes. locale Guarda os arquivos com as strings para internacionalizao. models Contm os modelos, behaviors e datasources da sua aplicao. plugins Contm os pacotes de plugins. tmp Aqui onde o CakePHP armazena os arquivos temporrios. Os dados atuais so armazenados onde Ribamar FS http://cursos.ribafs.org

Curso de CakePHP voc tenha configurado o CakePHP, mas esta

Pgina 5 /90

pasta normalmente usada para guardar a descrio dos modelos, logs e outras informaes, como as das sesses. vendors Qualquer classe ou biblioteca de terceiro deve ser armazenada aqui. Para fazer um acesso rpido e fcil, use a funo vendors(). Voc pode achar que esta pasta redundante, j que existe uma pasta com mesmo nome no nvel superior da estrutura. Ns vamos ver diferenas entre estas duas pastas quando discutirmos sobre manipulao de mltiplas aplicaes e sistemas mais complexos. views Arquivos de apresentao devem vir aqui: elementos, pginas de erro, ajudantes, layouts e arquivos de vises. webroot No modo de produo, esta pasta deve servir como a pasta raiz da sua aplicao. Dentro desta pasta so guardados os arquivos pblicos, como estilos CSS, imagens e arquivos de JavaScript. cake - bolo baker - padeiro

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Configuraes

Pgina 6 /90

Mesmo sendo focado em convenes ao invs de configuraes, o Cake pode ter seu comportamento alterado atravs de alguns arquivos de configurao, que encontram-se na pasta config: database core router debug traduo testes etc. Vrios Aplicativos num nico Core Podemos configurar para que vrias aplicaes usem um nico core do Cake. - Todos os aplicativos devem ficar assim: 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 aps a concluso e entrega para o cliente devemos setar o debug para zero. O Debug pode ser alterado manualmente no script config/core.php, na linha: Configure::write('debug', 0); O default 2. Zero sem debug (sem exibir as mensagens de erro ou alerta). ou via cdigo da nossa aplicao com: Configure::write('debug', '0'); Os possveis so: 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

Pgina 7 /90

Traduo Tambm podemos traduzir algumas coisas do CakePHP, como as mensagens de erro Download: http://souagil.com.br/cake_i18n/pt_br.tar.gz Adicionar linha ao final de config/core.php: Configure::write('Config.language', 'pt-br'); Adicionar Testes com SimpleTest Download - http://www.simpletest.org/ Descompacte e copie a pasta simpletest para a subpasta vendor do seu aplicativo. Formatar Data e Hora Trocar: <?php echo $cliente['Cliente']['created'] ?> por: <?php echo $time->niceShort($cliente['Cliente']['created']) ?>

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Convenes

Pgina 8 /90

O Cake previlegia convenes ao invs de configuraes. O que significa que seguindo as convenes estabelecidas o cake far muito por ns. No somos obrigados a seguir as convenes, mas perderemos muito com isso, pois teremos que fazer muito. Apesar de tomar um pouco de tempo para aprender as convenes do CakePHP, voc ganha tempo em um longo processo: seguindo as convenes, voc ganha funcionalidades gratuitamente e livrase de madrugadas de manuteno de arquivos de configurao. Convenes tambm fazem com que o sistema fique uniformemente desenvolvido, permitindo que outros desenvolvedores o ajudem mais facilmente, j que segue um padro de trabalho. Convenes no CakePHP tm sido produzidas por anos de experincia em desenvolvimento web e boas prticas. Apesar de sugerirmos que voc use essas convenes enquanto desenvolve em CakePHP, devemos mencionar que muitos desses princpios so facilmente sobrescritos - algo que especialmente acontece quando trabalha-se com sistemas legados. Convenes de arquivos e nome de classes Em geral, nome dos arquivos so sublinhados, enquanto nome de classes so CamelCased, ou seja, primeiras letras das palavras em maisculo. A classe KissesAndHugsController pode ser encontrada no arquivo kisses_and_hugs_controller.php, por exemplo. Porm, o nome da class e seu tipo no so necessariamente encontrados no nome do arquivo. A classe EmailComponent encontrada no arquivo chamado email.php e a classe HtmlHelper encontrada no arquivo html.php. Convenes de modelo Nome das classes de modelo devem ser no singular e CamelCased. Person, BigPerson e ReallyBigPerson so 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. Chaves estrangeiras em relacionamentos do tipo temMuitos (hasMany), pertenceA (belongsTo) ou temUm (hasOne) so reconhecidos por padro como o nome (no singular) do modelo relacionado, seguido por _id. Assim, se um padeiro temMuitos bolos, a tabela bolos referenciar a um padeiro na tabela padeiros atravs da chave estrangeira padeiro_id. Tabelas associativas, usadas em relaes temEPertenceAMuitos (hasAndBelongsToMany) entre modelos, devem ser nomeadas depois dos modelos das tabelas que a compem, em ordem alfabtica (apples_zebras em vez de zebras_apples). Todas as tabelas com as quais os modelos CakePHP interagem (exceto as tabelas associativas) exigem uma nica chave primria para identificar unicamente cada linha. Se voc deseja modelar Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 9 /90

uma tabela que no tem uma chave primria de um nico campo, como as linhas de nossa tabela associativa posts_tags, a conveno do CakePHP de que uma chave primria de um nico campo deve ser adicionada tabela. CakePHP no suporta chaves primrias 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 primria 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)); Convenes de controlador O nome das classes de controladores so no plural, CamelCased e no final 'Controller'. PeopleController, BigPeopleController e ReallyBigPeopleController so todos os exemplos convencionais para nome de controladores. A primeira funo que voc deve escrever em um controlador deve ser o mtodo index(). Quando algum requisita um controlador sem ao, o behavior padro renderizar o mtodo index() do controlador. Por exemplo, a requisio para http://www.exemplo.com.br/apples/ mapeia para a chamada da funo index() do ApplesController, assim como http://www.exemplo.com.br/apples/view mapeia para a chamada da funo view() no ApplesController. Voc tambm pode alterar a visibilidade das funes do controlador em CakePHP colocando sublinhados na frente do nome das funes. Se a funo do controlador estiver com sublinhado na frente, a funo no ser disponibilizada para acesso da web atravs do dispatcher, mas estar disponvel para uso interno.Por exemplo: <?php class NewsController extends AppController { function latest() { $this->_findNewArticles(); } function _findNewArticles() { //Logic to find latest news articles } } ?> Apesar da pgina http://www.example.com/news/latest/ possa ser acessada pelo usurio normalmente, algum que tente acessar a pgina http://www.example.com/news/_findNewArticles/ Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 10 /90

receber um erro porque a funo precedida de um sublinhado. Consideraes sobre URLs para Nomes de Controladores Como voc acabou de ver, controladores de uma nica palavra so mapeados facilmente para uma URL simples em letras minsculas. Por exemplo, ApplesController (que seria definida em um arquivo de nome 'apples_controller.php') acessada a partir de http://example.com/apples. Controladores de mltiplas 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. Convenes de viso Os arquivos de template de vises so nomeados depois das funes de controladores que mostram esses arquivos de template, na forma com sublinhados. A funo getReady() da classe PeopleController ir procurar pelo template da viso em /app/views/people/get_ready.ctp. O modelo bsico /app/views/controller/underscored_function_name.ctp. Nomeando os pedaos da aplicao usando as convenes do CakePHP, voc ganha funcionalidades sem luta e sem amarras de configurao. Aqui o exemplo final que vincula as associaes: Tabela no banco de dados: 'people' Classe do Modelo: 'Person', encontrada em /app/models/person.php Classe do Controlador: 'PeopleController', encontrado em /app/controllers/people_controller.php Template da Viso: encontrado em /app/views/people/index.ctp Usando estas convenes, CakePHP sabe que a requisio para http://www.exemplo.com.br/people/ mapeia para a chamada da funo index() do PeopleController, onde o modelo Person automaticamente disponibilizado (e automaticamente associado tabela 'people' no banco de dados), e renderiza isso para o arquivo. Nenhuma destas relaes foram configuradas por qualquer meio que no seja atravs da criao de classes e arquivos que voc precise criar em algum lugar. Agora que voc leu os fundamentos do CakePHP, voc pode tentar seguir o tutorial de como fazer um Blog em CakePHP, para ver como as coisas so feitas juntas. Resumo - bancos de dados minsculas e singular - tabelas minsculas e plural Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 11 /90

- chave primria de todas as tabelas deve ser chamada de id (opcionalmente) - chaves estrangeiras devem ser chamadas de tabelanome_id, exemplo blog_id (nome tabela no singular) - nomes de modelos CamelCase e arquivos em minsculas e singular e sublinhado para separar palavras compostas: meu_post.php e MeuPost - controladores arquivo: minsculas e plural. Classe CamelCase com Controller anexado, como: PostsController. Nomes de arquivos com sublinhado em palavras compostas: posts_controller.php Associaes entre Tabelas (relacionamentos) hasOne: possui um hasMany: possui muitos belongsTo: pertence a hasAndBelongsToMany: tem e pertence a muitos O Cake automaticamente adiciona o tempo para campos que so do timo datetime e so nomeados 'created' ou 'modified'.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 12 /90

Criar Aplicativos em Cake com o Bake Operaes de CRUD com o script bake. Aps a utilizao do bake temos um "esqueleto" de aplicao. Agora podemos customizar os cdigos gerados para criarmos a aplicao final. - Copiar a pasta app Primeiro vamos copiar a pasta app para estoque - 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. - Criar aplicativo com Bake Vamos usar o bake para criar o aplicativo atravs da console. - Configurar para usar vrios aplicativos com um nico core Configurar estoque/webroot/index.php mudar a linha com define('CAKE_CORE_INCLUDE_PATH' para: define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__)))); - Acessar a pasta console cd /home/ribafs/public_html/cake/cake/console ou cd c:\xampplite\htdocs\cake\cake\console 1) Criar uma Configurao de banco ./cake bake -app estoque Receber a tela: Welcome to CakePHP v1.2.4.8284 Console Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 13 /90

--------------------------------------------------------------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 opes entre colchetes como [default] acima so as opes sugeridas e default, basta teclar Enter se queremos aceit-la. Tecle Enter para aceitar default como o nome da configurao do banco. 2) Selecionar o SGDB Driver: (db2/firebird/mssql/mysql/mysqli/odbc/oracle/postgres/sqlite/sybase) [mysql] > Apenas tecle Enter para aceitar o mysql 3) Tipo de conexo Persistent Connection? (y/n) [n] > Enter para aceitar no persistente 4) Host do Banco Database Host: [localhost] > Enter para aceitar localhost ou digite o nome do seu host 5) Porta Port? [n] > Enter para aceitar a porta default 6) Usurio User: [root] > Enter para aceitar 7) Senha Password: Ribamar FS http://cursos.ribafs.org

Curso de CakePHP > Enter para aceitar sem senha ou digite a senha 8) Nome do banco Database Name: [cake] > Digite estoque e tecle Enter 9) Prefixo das tabelas Table Prefix? [n] > Enter para aceitar sem prefixo ou digite o prefixo

Pgina 14 /90

10) Codificao das tabelas Table encoding? [n] > Enter para aceitar a default ou entre com a codificao (exemplo: utf8) Ento aparece o relatrio: --------------------------------------------------------------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] > Tecle enter para aceitar. 11) Outra configurao de banco? Do you wish to add another database configuration? [n] > Enter para encerrar. Ento ele criar o arquivo: Creating file /home/ribafs/public_html/cake/estoque/config/database.php Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 15 /90

Wrote /home/ribafs/public_html/cake/estoque/config/database.php Ao executar novamente o comando: ./cake bake -app estoque Aparecer o menu: Welcome to CakePHP v1.2.4.8284 Console --------------------------------------------------------------App : estoque Path: /home/ribafs/backup/public_html/cake/estoque --------------------------------------------------------------Interactive Bake Shell --------------------------------------------------------------[D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [Q]uit What would you like to Bake? (D/M/V/C/P/Q) > Vamos criar na seguinte ordem para cada tabela: model, controller e view Criar o Model para a tabela Clientes 1) Tecle m e Enter (Model) 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) Validao Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Tecle n e Enter (no vamos validar agora) 4) Nome do campo chave What is the primaryKey? [cliente] > No nosso caso est correto, apenas tecle Enter

Pgina 16 /90

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 7) Baking model class for Cliente... Creating file /home/ribafs/backup/public_html/cake/estoque/models/cliente.php Wrote /home/ribafs/backup/public_html/cake/estoque/models/cliente.php Baking test fixture for Cliente... Creating file /home/ribafs/backup/public_html/cake/estoque/tests/fixtures/cliente_fixture.php Wrote /home/ribafs/backup/public_html/cake/estoque/tests/fixtures/cliente_fixture.php Baking unit test for Cliente... Creating file /home/ribafs/backup/public_html/cake/estoque/tests/cases/models/cliente.test.php Wrote /home/ribafs/backup/public_html/cake/estoque/tests/cases/models/cliente.test.php

Criando o Model para Funcionarios Agora de forma mais resumida 1) m e Enter Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 17 /90

2) 2 para funcionarios e Enter 3) n e Enter (sem validao) 4) Chave primria - Enter para funcionario 5) Relacionamentos - n e Enter 6) Tudo OK? - Enter Criar o Model para Produtos De forma semelhante crie o model para produtos. Criar o Model para Pedidos Esse diferente, pois tem relacionamentos com cliente e funcionrios 1) m e Enter 2) 4 e Enter para pedido 3) n e Enter para validao 4) pedido como chave 5) Relacionamento Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n) [y] > Enter para sim. One moment while the associations are detected. --------------------------------------------------------------Please confirm the following associations: --------------------------------------------------------------Pedido belongsTo Cliente? (y/n) [y] > Enter para aceitar a relao com Cliente Pedido belongsTo Funcionario? (y/n) [y] > Enter para aceitar a relao com funcionario. n para PedidoIten nas duas sugestes. Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Enter para no adicionais relaes. Relato: --------------------------------------------------------------The following Model will be created: --------------------------------------------------------------Name: Pedido Primary Key: pedido Associations: Pedido belongsTo Cliente Pedido belongsTo Funcionario --------------------------------------------------------------Look okay? (y/n) [y] > Enter para aceitar. Criar o modelo da tabela pedido_itens Que se relaciona apenas com pedidos. Criar o Controller para Clientes 1) c e Enter 2) 1 e Enter Would you like to build your controller interactively? (y/n) [y] > n 3) n para controller interativo

Pgina 18 /90

4) Incluir mtodos bsicos Would you like to include some basic class methods (index(), add(), view(), edit())? (y/n) [y] > Enter para aceitar 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 --------------------------------------------------------------Look okay? (y/n) [y] > Enter para aceitar

Pgina 19 /90

Criar os Controllers Funcionarios, PedidoItens, Pedidos e Produtos de forma semelhante Criar a view para a tabela Clientes 1) v e Enter 2) 1 e Enter 3) Criar scaffolds para a view: Would you like to create some scaffolded views (index, add, view, edit) for this controller? NOTE: Before doing so, you'll need to create your controller and model classes (including associated models). (y/n) [n] > y e Enter n para no criar admin De forma semenlhante criar as demais. Procurando ID e sobrescrevendo pelas respectivas chaves primrias nas views. Editar a views cake/estoque/views/clientes/index.ctp Procurar por id e sobrescrever com cliente. Assim com as demais views. Com isso temos um aplicativo com muitos bons recursos: CRUD, paginao, CSS, etc. Para criar um novo projeto com bake use: ./cake bake -p nomeprojeto Para ir direto para model, controller ou view: ./cake bake -app nomeapp model ./cake bake -app nomeapp controller Ribamar FS http://cursos.ribafs.org

Curso de CakePHP ./cake bake -app nomeapp view Cake - Models

Pgina 20 /90

Os models formam a camada da letra M do MVC, aquele que vai ao banco e conversa com os controllers atendendo as suas solicitaes 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 funo find() usada para buscar os registros da tabela do model. Passando parmetros para essa funo ns podemos controlar os registros a buscar. Um Model com validao dos campos (gerado pelo Bake): <?php class Produto extends AppModel { var $name = 'Produto'; var $primaryKey = 'produto'; var $validate = array( 'produto' => array('numeric'), 'descricao' => array('notempty'), 'unidade' => array('notempty'), 'data_cadastro' => array('date') ); } ?> Model com relacionamento com clientes e funcionarios: <?php class Pedido extends AppModel { var $name = 'Pedido'; var $primaryKey = 'pedido'; //The Associations below have been created with all possible keys, those that are not needed can be Ribamar FS http://cursos.ribafs.org

Curso de CakePHP removed var $belongsTo = array( 'Cliente' => array( 'className' => 'Cliente', 'foreignKey' => 'cliente_id', 'conditions' => '', 'fields' => '', 'order' => '' ), 'Funcionario' => array( 'className' => 'Funcionario', 'foreignKey' => 'funcionario_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); } ?>

Pgina 21 /90

Uma boa pedida para aprender sobre os Models na prtica criar aplicativos com o Bake na linha de comando e depois analisar o cdigo gerado.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Controllers

Pgina 22 /90

O controller representa a letra C do VMC e a camada de processamento em PHP, onde existem os for, if, while, etc. Ele recebe as requisies de uma View e manda para o respectivo Model. Ao receber o resultado do Model ele devolve para a Views que pediu. Em um aplicativo de posts... Cada ao do controller deve pegar os posts no banco e retornar para a view. A view deve ento exibir todos os posts como lista. Controllers simples: cake/ola/controllers/clientes_controller.php <?php class ClientesController extends AppController { var $name = 'Clientes'; } ?> Action Toda funo pblica 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 diretrio separado (do mesmo nome do controller). Agora um controller mais sofisticado: <?php Ribamar FS http://cursos.ribafs.org

Curso de CakePHP class PedidosController extends AppController { var $name = 'Pedidos'; var $helpers = array('Html', 'Form'); function index() { $this->Pedido->recursive = 0; $this->set('pedidos', $this->paginate()); } function view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid Pedido.', true)); $this->redirect(array('action'=>'index')); } $this->set('pedido', $this->Pedido->read(null, $id)); }

Pgina 23 /90

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')); } function edit($id = null) { if (!$id && empty($this->data)) { $this->Session->setFlash(__('Invalid Pedido', true)); $this->redirect(array('action'=>'index')); } if (!empty($this->data)) { 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)); } } if (empty($this->data)) { $this->data = $this->Pedido->read(null, $id); Ribamar FS http://cursos.ribafs.org

Curso de CakePHP } $clientes = $this->Pedido->Cliente->find('list'); $funcionarios = $this->Pedido->Funcionario->find('list'); $this->set(compact('clientes','funcionarios')); } function delete($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid id for Pedido', true)); $this->redirect(array('action'=>'index')); } if ($this->Pedido->del($id)) { $this->Session->setFlash(__('Pedido deleted', true)); $this->redirect(array('action'=>'index')); } } } ?>

Pgina 24 /90

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Views View representa a letra V do MVC.

Pgina 25 /90

As views so responsveis por receber as requisies do cliente e mandar para o controller. O controller manda para o model que devolve ao controller. Ento o controller devolve para a view, que renderiza o resultado para o cliente. Lembrando que a view no deve ter nenhum contato direto com o model mas sempre passar pelo controller. Conveno - Todo action dos controllers e sua correspondente view tem o mesmo nome. Quando o action finaliza a execuo 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>Aes</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; ?> Agora chamar no navegador assim: http://localhost/cake/ola/clientes

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Adicionar Registro

Pgina 26 /90

Adicionar view views/clientes/add.ctp correspondente ao action add: Adicionar a view: cake/ola/views/clientes/add.ctp <?php echo $form->create('Cliente');?> <fieldset> <legend>Adicionar novo Cliente</legend> <?php echo $form->input('ID'); echo $form->input('Nome'); ?> </fieldset> <?php echo $form->end('Adicionar');?> Agora chame com o navegador: http://localhost/cake/ola/clientes/add As views sempre tem a extenso ctp (Cake Template Pages). Link para Edio (adicionado logo aps o comentrio <!-- 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>Aes</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 </tr> <?php endforeach; ?> </table> <?php endif; ?>

Pgina 27 /90

<?php echo $html->link('Adicionar Cliente', array('action'=>'add')); ?> Uma view mais sofisticada (gerada pelo Bake): <div class="clientes index"> <h2><?php __('Clientes');?></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('cliente');?></th> <th><?php echo $paginator->sort('cpf');?></th> <th><?php echo $paginator->sort('nome');?></th> <th><?php echo $paginator->sort('credito_liberado');?></th> <th><?php echo $paginator->sort('data_nasc');?></th> <th><?php echo $paginator->sort('email');?></th> <th class="actions"><?php __('Actions');?></th> </tr> <?php $i = 0; foreach ($clientes as $cliente): $class = null; if ($i++ % 2 == 0) { $class = ' class="altrow"'; } ?> <tr<?php echo $class;?>> <td> <?php echo $cliente['Cliente']['cliente']; ?> </td> <td> <?php echo $cliente['Cliente']['cpf']; ?> </td> <td> <?php echo $cliente['Cliente']['nome']; ?> </td> Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 28 /90

<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 Cake - Actions

Pgina 29 /90

Os Actions como o nome sugere, representam aes do usurio, que as emitem pelas views e so processadas nos controllers. Cada ao do usurio representada por uma funo no controller e esta funo deve ter o mesmo nome da view. Exemplo: index.ctp a view que atendida pelo action index() no controller. Actions so funes pblicas nas classes dos Controllers. Exemplo da action index() que corresponde view de nome semelhante (index.ctp): <?php class ClientesController extends AppController { var $name = 'Clientes'; function index() { $this->set('clientes', $this->Cliente->find('all')); } } ?> Action para adicionar registros Para isso precisaremos adicionar uma varivel (array $helpers) e uma funo add() ao controller, como tambm adicionar uma view pasta clientes, de nome add.ctp. var $helpers = array('Html', 'Form'); 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 no adicionado. Tente novamente.'); } } } Adicionando Registros Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 30 /90

Para isso precisamos adicionar um action (edit) ao controller e uma view para este action (views/clientes/edit.ctp). function edit($id = null) { if (!$id) { $this->Session->setFlash('Cliente Invlido'); $this->redirect(array('action'=>'index'), null, true); } if (empty($this->data)) { $this->data = $this->Cliente->find(array('id' => $id)); } else { if ($this->Cliente->save($this->data)) { $this->Session->setFlash('O Cliente foi salvo!'); $this->redirect(array('action'=>'index'), null, true); } else { $this->Session->setFlash('O Cliente no pde ser salvo. Favor tentar novamente.'); } } } Excluindo Registros Para isso devemos adicionar um action ao controle chamado delete() correspondente e uma linha na view index.ctp function delete($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid id for Cliente', true)); $this->redirect(array('action'=>'index')); } if ($this->Cliente->del($id)) { $this->Session->setFlash(__('Cliente deleted', true)); $this->redirect(array('action'=>'index')); } } Editar a view index.ctp e adicionar a linha com o delete: <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> Ou seja, neste caso, no criamos mais uma views, mas apenas uma linha para o action delete(). Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 31 /90

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 view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid Cliente.', true)); $this->redirect(array('action'=>'index')); } $this->set('cliente', $this->Cliente->read(null, $id)); } 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)); } } } function edit($id = null) { if (!$id && empty($this->data)) { $this->Session->setFlash(__('Invalid Cliente', true)); $this->redirect(array('action'=>'index')); } if (!empty($this->data)) { 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 if (empty($this->data)) { $this->data = $this->Cliente->read(null, $id); } } function delete($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid id for Cliente', true)); $this->redirect(array('action'=>'index')); } if ($this->Cliente->del($id)) { $this->Session->setFlash(__('Cliente deleted', true)); $this->redirect(array('action'=>'index')); } } ?>

Pgina 32 /90

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Scaffold Usando Scaffold no CakePHP

Pgina 33 /90

O scaffold no cake cria um CRUD rapidamente para manipulao de uma tabela. As aes do Scaffoldo so nomeadas como: index(), add(), edit(), view(), and delete(). Podemos deixar as aes de CRUD do scaffold quando no desejamos gerar cdigo manualmente. Copiar a pasta app Vamos copiar a pasta app do cake para scaffold Configurar o banco de dados Configurar scaffold/config/database.php Configurar para vrios aplicativos usarem o mesmo core do Cake Configurar scaffold/webroot/index.php na linha com define('CAKE_CORE_INCLUDE_PATH' para: define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__)))); Criar tabela create table clientes ( id int not null auto_increment primary key, nome char(45) not null ); INSERT INTO clientes (id, nome) VALUES (1,'Joao Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (2,'Roberto Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (3,'Antnio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (4,'Carlos Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (5,'Otoniel Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (6,'Helena Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (7,'Flvio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (8,'Joana Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (9,'Francisco Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (10,'Jorge Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (11,'Pedro Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (12,'Ribamar Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (13,'Tiago Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (14,'Elias Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (15,'Marcos Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (16,'Ricardo Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (17,'Rmulo Pereira Brito'); Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 34 /90

INSERT INTO clientes (id, nome) VALUES (18,'Henrique Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (19,'Francis Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (20,'Otvio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (21,'Rogrio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (22,'Jurandir Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (23,'Raqul Pereira Brito'); 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; } ?> Apontar o Firefox para o controller: http://localhost/cake/scaffold/clientes Pronto, temos um CRUD, com estilo e paginao. Scaffold com tabelas relacionadas Tabelas jogadores e equipes create table equipes ( id int not null auto_increment primary key, nome char(45) not null ); create table jogadores ( id int not null auto_increment primary key, nome char(45) not null, Ribamar FS http://cursos.ribafs.org

Curso de CakePHP posicao char(25) not null, equipe_id int );

Pgina 35 /90

Detalhe: na tabela jogadores devemos ter um campo para relacionar com a equipes, no caso temos equipe_id. Este campo segue a conveno 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'; var $belongTo = array('Equipe' => array('className' => 'Equipe', 'conditions' => '', 'order' => '', 'foreignKey' => 'equipe_id' ) ); } ?> cake/scaffold/models/equipe.php Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 36 /90

<?php class Equipe extends AppModel { var $name = 'Equipe'; } ?> Abrir no navagador: http://localhost/cake/scaffold/equipes e http://localhost/cake/scaffold/jogadores Original de W.Jason Gilmore - http://www.wjgilmore.com

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Validaes Validar como No Vazio Vamos validar o campo nome para no aceitar vazio. Editar o model e adicionar: var $validate = array( 'nome' => array( 'rule' => VALID_NOT_EMPTY ) );

Pgina 37 /90

A validao por campo. Uma boa idia gerar um aplicativo com o bake e ver como ele gera o cdigo da validao no model. Agora uma validao que inclui relacionamento: <?php class Pedido extends AppModel { var $name = 'Pedido'; var $primaryKey = 'pedido'; //The Associations below have been created with all possible keys, those that are not needed can be removed var $belongsTo = array( 'Cliente' => array( 'className' => 'Cliente', 'foreignKey' => 'cliente_id', 'conditions' => '', 'fields' => '', 'order' => '' ), 'Funcionario' => array( 'className' => 'Funcionario', 'foreignKey' => 'funcionario_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); } ?> Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 38 /90

Vejamos os vrios tipos de validao embutida que o Cake oferece (via Bake): Voc deseja fornecer critrios de validao 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 validao. Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 39 /90

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 no sabemos o que fazer.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - MVC

Pgina 40 /90

CakePHP e MVC O tpico fluxo de um script em PHP (figura abaixo): 1. O cliente envia uma requisio para um script PHP digitando uma URL ou clicando em um link de algum tipo. 2. O script processa os dados e ento envia a requisio do banco de dados diretamente para o banco de dadps. 3. O script recebe qualquer sada do banco de dados e processa os dados. 4. O script gera a sada e envia esta para o navegador do cliente.

Tpico fluxo com MVC MVC pode variar, dependendo do framework com que voc est trabalhando, mas geralmente ele trabalha da seguinte maneira (veja figura abaixo): 1. O cliente envia uma requisio de pgina para o aplicativo, digitando a URL ou clicando em um link de algum tipo. Por conveno uma URL tpica estruturada assim: http://{Domain}.com/{Application}/{Controller}/{Action}/{Parameter 1, etc.} 2. O script expedidor/dispatcher analisa a estrutura da URL e determina qual controller executar. Ele tambm passa todas as aes e parmetros para o controlador. 3. A funo no controlador pode precisar lidar com mais dados do que apenas os parmetros transmitida pelo expedidor/dispatcher. Ele vai enviar solicitaes de dados para o script Model. 4. O script Model determina como interagir com o banco de dados usando as requisies submetidas pelo controller. Ele pode executar consultas ao banco de dados e enviar todo tipo de instruo ao banco de dados. 5. Uma vez que o Model tem puxado quaisquer dados ou enviado dados para o banco de dados, ele retorna a sua sada para o Controller. Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 41 /90

6. O Controller processa os dados e sadas para o arquivo da View. 7. A View adiciona alguma formatao ou exibe os dados vindos do Controller e envia essa sada para o navegador do cliente.

MVC no Cake (diagrama)

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Requisio Tpica do CakePHP

Pgina 42 /90

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Menu

Pgina 43 /90

Aps criar o cdigo para cada tabela devemos adicionar um menu que integre todo o cdigo. Uma forma simples e natural de fazer isso adicionando o arquivo views/pages/home.ctp Criando a Home Page do Projeto: Criar appname/views/pages/home.ctp com o contedo: <h1>Bem vindo ao Bake</h1> <p>Aqui podmeos fazer:</p> <ul> <li><?php echo $html->link('Lista de todos os clientes', array('controller' => 'clientes', 'action'=>'index')); ?></li> <li><?php echo $html->link('Adicionar novo Cliente', array('controller' => 'clientes', 'action'=>'add')); ?></li> <li>Editar Clientes</li> <li>Excluir Clientes</li> </ul> Agora ento podemos navegar no aplicativo como um todo assim: http://localhost/appname/ Caso exista outros itens os adicione ao arquivo home.ctp.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - CSS CakePHP e CSS Criando o CSS para o layout

Pgina 44 /90

Para mudar o template default do Cake precisamos alterar o arquivo: cake/cake/libs/view/layouts/default.ctp Template padro do Cake Veja seu contedo, inclusive nele onde se encontra aquela frase "CakePHP: the rapid development php framework:" caso queiramos remover, assim como a pequena imgem do rodap. Observe que a frase est no title e no body. <?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"> <?php $session->flash(); ?> <?php echo $content_for_layout; ?>

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 45 /90

</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> Mudando este arquivo podemos transformar automaticamente todas as aplicaes geradas. Personalizando o Template Caso criemos um arquivo chamado: cake/app/views/layouts/default.ctp O Cake o usar e ignorar o anterior. O arquivo CSS default usado no aplicativo este: /app/webroot/css/cake.generic.css E chamado nas views assim: <link rel="stylesheet" type="text/css" href="/ProjectPath/css/cake.generic.css" /> Personalizando o CSS existente, entrando com um novo script CSS: Editar o script app/webroot/css/cake.generic.css e cole o cdigo abaixo ao final: * { font-family: "Lucida Grande",Lucida,sans-serif; } th { font-size: 14px; font-weight: bold; background-color: #e1e1e1; border-bottom: 1px solid #ccc; padding: 10px; } div.actions ul { list-style-type: none; } Observe que adicionando nosso prprio estilo podemos controlar a aparncia do site. Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 46 /90

Editar ento o script app/views/layouts/default.ctp e alterar a linha 4 para: <?php print $html->css('cake.generic');?> Para que o CSS do Cake volte, mas agora um pouco personalizado por ns. Observe que o layout no o padro do Cake, pois tem algumas diferenas. Referncia: http://letthemcodecake.com/learning-cakephp/4/

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - JavaScript

Pgina 47 /90

Os arquivos .js (Javascript) caso existam devem ser salvos no diretrio webroot/js/ Referncias: http://bakery.cakephp.org/articles/view/toggling-items-with-javascript http://debuggable.com/posts/passing-controller-variables-to-your-javascript:48b4f0c6-c718-47b2bca1-05794834cda3 http://netunno.com/2009/08/incluir-arquivos-javascript-e-css-pela-view-de-um-conteudo-nocakephp/ http://ryan.ifupdown.com/2009/08/22/how-to-use-javascript-codeblock-in-cakephp/

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Helpers

Pgina 48 /90

Helpers so classes do tipo component para a camada de apresentao da sua aplicao. Eles contm lgica de aprensentao que compartilhada entre muitas views, elements ou layouts. Cada helper estende AppHelper (opcionalmente definido em /app/app_helper.php), uma classe que guarda qualquer lgica necessria para todos os helpers. O propsito desse captulo mostrar a voc como criar seus prprios helpers, destacar algumas tarefas bsicas que os helpers do CakePHP podem ajud-lo a realizar. Voc usa helpers em CakePHP tornando os controllers conscientes deles. Cada controller tem uma varivel de classe especial chamada $helpers que mantm uma lista dos helpers disponveis para todas as views que esse controller renderiza. Para disponibilizar um helper em sua view do controller, adicione o nome do helper no array $helpers desse controller.
<?php class PadeirosController extends AppController { var $helpers = array('Form', 'Html', 'Javascript', 'Time'); } ?> Referncia - http://manual.cakephp.com.br/doku.php?id=helpers

Helpers do CakePHP
O CakePHP tem alguns helpers muito teis na criao de views. Eles ajudam na criao de marcao bem formatada (incluindo formulrios), ajudam na formatao de texto, datas e nmeros, e pode at acelerar uma funcionalidade Ajax. Aqui est uma lista rpida dos helpers com um resumo das suas habilidades. Para mais informao sobre um helper particular, d uma olhada em sua respectiva sesso no captulo Helpers Internos. Helper CakePHP Ajax Cache Form Html Javascript Number Paginator Rss Descrio Usado tambm com a biblioteca JavaScript Prototype para criar funcionalidade Ajax nas views. Contm mtodos de atalho para arrastar/soltar, formulrios ajax & links, observers, e mais. Usado internamente para para criar cache do contedo das views . Cria formulrios HTML e elementos de formulrios com habilidade de auto-popular e manipulam problemas de validao. Mtodos de convenincia para criao de marcao bem formatada. Imagens, links, tabelas, tags de cabealho e mais. Usado para escapar valores para uso em JavaScripts, escrever dados para objetos JSON, e formatar blocos de cdigo. Formatao de nmeros e moedas Paginao de dados do model e organizao. Mtodos de convenincia para exportar dados XML RSS Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Session Text Time Xml

Pgina 49 /90

Acesso para escrita de valores de sesso nas views Links automticos, destaques, e truncamento automtico de palavras. Deteco de proximidade ( o ano quem vem?), formatao de strings (Hoje, 10:30 am) e converso de zona de tempo. Mtodos de convenincia para criar cabealhos e elementos XML.

Criando Helpers
Se um helper interno (ou um mostrado em Cakeforge ou em Bakery) no se adapta a suas necessidades, helpers so fceis de fazer. Vamos dizer que ns queremos criar um helper que pode ser usado para imprimir um tipo especfico de link CSS que voc precisa em muitos lugares diferentes em sua aplicao. Para colocar sua lgica na estrutura de helpers dos CakePHP, voc deve criar uma nova classe em /app/views/helpers. Vamos chamar nosso helper de LinkHelper. O arquivo de classe PHP atual vai se parecer com isso:
<?php /* /app/views/helpers/link.php */ class LinkHelper extends AppHelper { function editar($titulo, $caminho) { // Lgica para criar links especialmente formatados vai aqui... } } ?>

Existem alguns poucos mtodos includos na classe Helper do CakePHP dos quais voc pode tirar vantagem: output(string $string) Use essa funo para enviar qualquer dado de volta para sua view.
function editar($titulo, $caminho) { // Use essa funo para enviar qualquer dado formatado // de volta para sua view: return $this->output( "<div class=\"editarContainer\"> <a href=\"$caminho\" class=\"editar\">$titulo</a> </div>" );

Inclundo outros Helpers


Voc pode querer usar alguma funcionalidade j existente em outro helper. Para tanto, voc pode especificar os helpers que voc deseja usar com o array $helper, formatado exatamente como voc faria no controller.
// /app/views/helpers/link.php (usando outros helpers)

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP
class LinkHelper extends Helper { var $helpers = array('Html'); function editar($titulo, $caminho) { // Usando o helper HTML para criar // dados formatados:

Pgina 50 /90

$link = $this->Html->link($titulo, $caminho, array('class' => 'editar')); } } return $this->output("<div class=\"editarContainer\">$link</div>");

Usando um Helper personalizado


Uma vez que voc criou seu helper e o colocou em /app/views/helpers/, voc estar habilitado a us-lo em seus controllers usando a varivel especial $helpers. Assim que seu controller estiver consciente de sua nova classe, voc pode us-la em suas views acessando uma varivel com o nome do helper:
<!-- faz um link usando o novo helper --> <?php $link->editar('Mudar esta receita', '/receitas/editar/5') ?>

Nota: lembre-se de incluir o HtmlHelper e/ou FormHelper em seu array $helpers se voc planeja us-los em qualquer lugar. Cake vem com HTML padro, AJAX, JavaScript e helpers/ajudantes que criam as Views mais facilmente. Sua sada HTML ser muito facilitada por strings intuitivas do helper que auxiliam a renderizar o HTML para voc. Todos os helpers ficam no diretrio app/views/helpers

Incluir o nome da classe do Helper na varivel array $helpers.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Components

Pgina 51 /90

Introduo
Componentes so pacotes com funes lgicas que so usadas para serem compartilhadas entre os controladores. Se voc est querendo copiar e colar coisas entre os controladores, voc pode criar funcionalidades em componentes para isso. O CakePHP j vem com um conjunto de componentes para os mais diversos usos, por exemplo: Segurana Sesses Lista de controle de acessos (ACL) E-mails Cookies Autenticao Manipulao de requisies

Cada um dos componentes ser explicado em outros captulos. Por enquanto, mostraremos apenas como criar seus prprios componentes. Criando componentes ajuda a manter o cdigo do controlador limpo e permite que voc reuse o cdigo entre os projetos ou controladores.

Construindo componentes personalizados


Suponha que sua aplicao online precisa utilizar funes complexas de matemtica em diversas partes da aplicao. Poderamos, ento, criar um componente para que esta lgica seja compartilhada entre diversos controladores. O primeiro passo criar um arquivo para o componente e uma classe. Crie o arquivo em /app/controllers/components/math.php. A estrutura bsica do arquivo do componente similar a apresentada abaixo.
<?php class MathComponent extends Object { function doComplexOperation($amount1, $amount2) { return $amount1 + $amount2; } } ?>

Quando seu componente estiver criado, ns podemos utiliz-lo nos controladores da aplicao colocando o nome do componente no vetor da varivel $components:
// Isso faz com que o novo componente possa ser acessado usando $this->Math var $components = ('Math', 'Session');

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 52 /90

Acessando classes do MVC de dentro dos componentes


Para ter acesso a instncia do controlador dentro do seu novo componente, voc precisa implementar o mtodo startup(). Este um mtodo especial que trs a referncia do controlador como primeiro parmetro e esta funo chamada automaticamente depois da funo beforeFilter() do controlador. Se por alguma razo voc no quer que o mtodo startup() seja executado quando o controlador instanciado, defina o valor da varivel $disableStartup para true. Se voc deseja inserir uma lgica antes que o controlador seja chamado, use o mtodo initialize() no seu componente.
<?php class MathComponent extends Object { //chamado antes de Controller:beforeFilter() function initialize() { } //chamado depois de Controller::beforeFilter() function startup(&$controller) { } function doComplexOperation($amount1, $amount2) { return $amount1 + $amount2; } } ?>

Voc pode tambm querer utilizar outros componentes dentro de um componente personalizado. Para isso, basta criar a varivel $components na classe (assim como voc faria em um controlador) como um array que contenha os nomes dos componentes que voc deseja utilizar.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Routes So as rotas (URLs)

Pgina 53 /90

No diretrio config vemos o arquivo de configurao routes.php onde a rota default : Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Exemplo: Router::connect('/articles/*', array('controller'=>'posts','action'=>'index')); http://localhost/blog/posts/index/page:2/sort:id/direction:asc Como o CakePHP resolve URLs http://localhost/{Application}/{Controller}/{Action}/{Parameter 1}/ {Parameter 2, etc.} As URLs no Cake tem este formato: http://nome_dominio/nome_pastacake/nome_controller/nome_action Quando uma requisio feita para para o action index, a seguinte linha ser executada: $this->set('clientes', $this->Cliente->find('all')); Do manual do Cake em: http://book.cakephp.org/pt/complete/3/The-Manual

Configurao de rotas (routes)

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Rotas so funcionalidades que mapeiam URLs em aes do controller. Foi adicionado ao CakePHP para tornar URLs amigveis, mais configurveis e flexveis. No obrigatrio o uso do mod_rewrite para usar rotas, mas usando-o far sua barra de endereos muito mais limpa e arrumada. Rotas no CakePHP 1.2 foi ampliada e pode ser muito mais poderosa. Ver comentrios desta seo
Rota Padro

Editar Visualizar apenas esta seo Comentrios (0) Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Histrico Compare com o contedo original

Pgina 54 /90

Antes de voc aprender sobre como configurar suas prprias rotas, voc deveria saber que o CakePHP vem configurado com um conjunto de rotas padro. A configurao padro de rotas do CakePHP deixar as URLs mais bonitas para qualquer aplicao. Voc pode acessar diretamente uma ao via URL colocando seu nome na requisio. Voc pode tambm passar paramtros para suas aes no controller usando a prpria URL.
URL para a rota padro: http://example.com/controller/action/param1/param2/param3

1. URL para a rota padro: 2. http://example.com/controller/action/param1/param2/param3 A URL /noticias/ler mapeia para a ao ler() do controller Noticias (NoticiasController), e /produtos/ver_informacoes mapeia para a ao verInformacoes() do controller Produto (ProdutosController). Se nenhuma ao especificada na URL, a ao index() ser chamada. A rota padro tambm permite passar parmetros para as aes usando a URL. Uma requisio /noticias/ler/12 seria equivalente a chamar o mtodo ler(12) no controller Noticias (NoticiasController), por exemplo. Ver comentrios desta seo
Parmetros nomeados

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Uma novidade no CakePHP 1.2 a possibilidade de usar parmetros nomeados. Voc pode nomear parmetros e enviar seus valores usando a URL. Uma requisio /noticias/ler/titulo:primeira+noticia/categoria:esportes teria como resultado uma chamada a ao ler() do controller Noticias (NoticiasController). Nesta ao, voc encontraria os valores dos parmetros ttulo e categoria dentro de $this->passedArgs['titulo'] e $this->passedArgs['categoria'] respectivamente. Alguns exemplos para a rota padro:
URL mapeadas para as aes dos controladores, usando rotas padro: URL: /monkeys/jump Mapeado para: MonkeysController->jump(); URL: /products Mapeado para: ProductsController->index(); URL: /tasks/view/45 Mapeado para: TasksController->view(45); URL: /donations/view/recent/2001 Mapeado para: DonationsController->view('recent', '2001');

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 55 /90

URL: /contents/view/chapter:models/section:associations Mapeado para: ContentsController->view(); $this->passedArgs['chapter'] = 'models'; $this->passedArgs['section'] = 'associations';

URL mapeadas para as aes dos controladores, usando rotas padro: Definindo Rotas

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Definindo suas prprias rotas permite voc definir como sua aplicao ir responder a uma dada URL. Defina suas prprias rotas no arquivo /app/config/routes.php usando o mtodo Router::connect(). O mtodo connect() recebe trs parmetros: a URL que voc deseja casar, o valor padro para os elementos de rota, e regras de expresses regulares para ajudar a encontrar elementos na URL. O formato bsico para uma definio de rota :
Router::connect( 'URL', array('paramName' => 'defaultValue'), array('paramName' => 'matchingRegex') )

1. 2. 3. 4. 5.

Router::connect( 'URL', array('paramName' => 'defaultValue'), array('paramName' => 'matchingRegex') )

O primeiro parmetro usado para informar o router sobre que tipo de URL voc est tentando controlar. A URL uma string normal delimitada por barras, as que tambm pode conter um caracter curinga (*) ou elementos de rota (nomes de variveis iniciados por dois-pontos). Usar um curinga indica para o roteador que tipo de URLs voc quer casar, e especificar elementos de rota permite a voc obter parmetros para as aes de seu controller. Once you've specified a URL, you use the last two parameters of connect() to tell CakePHP what to do with a request once it has been matched. The second parameter is an associative array. The keys of the array should be named after the route elements in the URL, or the default elements: :controller, :action, and :plugin. The values in the array are the default values for those keys. Let's look at some basic examples before we start using the third parameter of connect().
Router::connect( '/pages/*', array('controller' => 'pages', 'action' => 'display') );

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 56 /90

This route is found in the routes.php file distributed with CakePHP (line 40). This route matches any URL starting with /pages/ and hands it to the display() method of the PagesController();; The request /pages/products would be mapped to PagesController->display('products'), for example.
Router::connect( '/government', array('controller' => 'products', 'action' => 'display', 5) );

This second example shows how you can use the second parameter of connect() to define default parameters. If you built a site that features products for different categories of customers, you might consider creating a route. This allows you link to /government rather than /products/display/5. Another common use for the Router is to define an "alias" for a controller. Let's say that instead of accessing our regular URL at /users/someAction/5, we'd like to be able to access it by /cooks/someAction/5. The following route easily takes care of that:
Router::connect(r /> '/cooks/:action/*', array('controller' => 'users', 'action' => 'index') );

This is telling the Router that any url beginning with /cooks/ should be sent to the users controller. When generating urls, routes are used too. Using array('controller' => 'users', 'action' => 'someAction', 5) as a url will output /cooks/someAction/5 if the above route is the first match found If you are planning to use custom named arguments with your route, you have to make the router aware of it using the Router::connectNamed function. So if you want the above route to match urls like /cooks/someAction/type:chef we do:
Router::connectNamed(array('type')); />Router::connect( '/cooks/:action/*', array('controller' => 'users', 'action' =&gt; 'index') );

You can specify your own route elements, doing so gives you the power to define places in the URL where parameters for controller actions should lie. When a request is made, the values for these route elements are found in $this->params of the controller. This is different than named parameters are handled, so note the difference: named parameters (/controller/action/name:value) are found in $this->passedArgs, whereas custom route element data is found in $this->params. When you define a custom route element, you also need to specify a regular expression - this tells CakePHP how to know if the URL is correctly formed or not.
Router::connect(

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP
'/:controller/:id', array('action' => 'view'), array('id' => '[0-9]+')

Pgina 57 /90

);

This simple example illustrates how to create a quick way to view models from any controller by crafting a URL that looks like /controllername/id. The URL provided to connect() specifies two route elements: :controller and :id. The :controller element is a CakePHP default route element, so the router knows how to match and identify controller names in URLs. The :id element is a custom route element, and must be further clarified by specifying a matching regular expression in the third parameter of connect(). This tells CakePHP how to recognize the ID in the URL as opposed to something else, such as an action name. Once this route has been defined, requesting /apples/5 is the same as requesting /apples/view/5. Both would call the view() method of the ApplesController. Inside the view() method, you would need to access the passed ID at $this->params['id']. One more example, and you'll be a routing pro.
Router::connect( '/:controller/:year/:month/:day', array('action' => 'index', 'day' => null), array( 'year' => '[12][0-9]{3}', 'month' => '(0[1-9]|1[012])', 'day' => '(0[1-9]|[12][0-9]|3[01])' ) );

This is rather involved, but shows how powerful routes can really become. The URL supplied has four route elements. The first is familiar to us: its a default route element that tells CakePHP to expect a controller name. Next, we specify some default values. Regardless of the controller, we want the index() action to be called. We set the day parameter (the fourth element in the URL) to null to flag it as being optional. Finally, we specify some regular expressions that will match years, months and days in numerical form. Once defined, this route will match /articles/2007/02/01, /posts/2004/11/16, and /products/2001/05 (remember that the day parameter is optional?), handing the requests to the index() actions of their respective controllers, with the custom date parameters in $this->params. Ver comentrios desta seo
Passando parmetros para "action"

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 58 /90

Assumindo que sua action foi definida como esta e voc quer acessas os argumentos usando $articleID ao invs de $this->params['id'], somente adicione um array extra no terceiro parmetro de Router::connect().
// some_controller.php function view($articleID = null, $slug = null) { // algum cdigo aqui } // routes.php Router::connect( // E.g. /blog/3-CakePHP_Rocks '/blog/:id-:slug', array('controller' => 'blog', 'action' => 'view'), array( //A ordem importa pois isto ir mapear ":id" para $articleID na sua action 'pass' => array('id', 'slug'), 'id' => '[0-9]+' ) );

E agora, graas as funcionalidades de roteamento reverso, voc pode passar na url um arra como o abaixo e o Cake saber como formar a URL como definido nas rotas.
// view.ctp // Isto ir retornar um link para /blog/3-CakePHP_Rocks <?php echo $html->link('CakePHP Rocks', array( 'controller' => 'blog', 'action' => 'view', 'id' => 3, 'slug' => Inflector::slug('CakePHP Rocks') )); ?>

Roteando prefixos Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Vrias aplicaes necessitam de uma seo para usurios administradores com privilgios de alterao de dados. Muitas vezes isso definido na url, como /admin/users/edit/5. No CakePHP possvel utilizar uma rota para administradores mapeando a nossa seo no arquivo de configurao para Routing.admin.
Configure::write('Routing.admin', 'admin');

1. Configure::write('Routing.admin', 'admin'); Voc pode definir quais mtodos do seu controller usaro a rota de administrador bastando iniciar o nome do mtodo com o prefixo admin_. Usando o nosso exemplo para acessar uma url de Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 59 /90

administrao usurios /admin/users/edit/5 deveremos ter o o mtodo admin_edit em nosso UsersController informando que o primeiro parmetro o nmero 5. Voc pode mapear a url /admin para a sua ao inicial admin_index alterando o arquivo de configurao de rotas.
Router::connect('/admin', array('controller' => 'pages', 'action' => 'index', 'admin' => true));

Voc pode configurar o seu arquivo de configurao para utilizar vrios prefixos tambm:
Router::connect('/profiles/:controller/:action/*', array('prefix' => 'profiles', 'profiles' => true));

As aes(mtodos) que pertenam seo de profiles devem ter seus nomes iniciados com o prefixo profiles_. A estrutura da url do nosso exemplo da seo de profiles de usurios /profiles/users/edit/5 que far chamada ao mtodo profiles_edit no nosso UsersController. importante lembrar que usando o HTML Helper do cakePHP para montar nossos links j estaremos montando o nosso link de forma correta. Abaixo h um exemplo de como construir o nosso link utilizando o HTML helper.
echo $html->link('Edite seu perfil', array('profiles' => true, 'controller' => 'users', 'action' => 'edit', 'id' => 5));

Voc pode setar vrios prefixos no roteador do cakePHP criando uma estrutura flexvel de URL's para a sua aplicao. Ver comentrios desta seo
Extenses de Arquivos

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Para fazer com que suas rotas manipulem diferentes extenses de arquivos, voc precisa de uma linha a mais em seu arquivo de configurao de rotas:
Router::parseExtensions(array('html', 'rss'));

Isto vai informar ao router para desconsiderar as extenses que arquivos correspondentes e ento processar o restante. Se voc quiser criar uma URL como /pagina/titulo-da-pagina.html, voc deveria criar sua rota como mostrado abaixo:
Router::connect( '/pagina/:title', array('controller' => 'pages', 'action' => 'view'), array( 'pass' => array('title') )

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP
);

Pgina 60 /90

E ento para criar links que utilizem esta rota, simplesmente use:
$html->link('Ttulo do link', array('controller' => 'pages', 'action' => 'view', 'title' => Inflector::slug('titulo da pagina', '-'), 'ext' => 'html'))

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Verdors

Pgina 61 /90

So os scripts de terceiros, que no fazem parte do core do Cake, que ficam no diretrio verdors. Carregando arquivos de terceiros (vendors): A tradicional forma carregando arquivos da pasta "verdors" usando a funo vendor() que est caindo em desuso. Recebemos um warning se a usarmos. A nova maneira de usar com App:import(). Para carregar um arquivo de nome exemplo.php use o seguinte:
App::import('Vendor', 'exemplo');

Tem um pequeno problema aqui: s funciona se o nome do arquivo tiver todas as letras em minsculas. Caso o arquivo tenha a inicial maisculas ao invs use:
App::import('Vendor', 'exemplo', array('file' => 'Exemplo.php'));

O segundo parmetro pode ser qualquer string, exceto varia ou null. O mesmo se aplica para:
App::import('Vendor', 'example'.DS.'example'); // loads example/example.php App::import('Vendor', 'example', array('file' => 'Example'.DS.'example.php')); // loads Example/example.php Refencia - http://cakebaker.42dh.com/2008/03/26/loading-vendor-files/

Referncias: http://lemoncake.wordpress.com/2007/08/08/vendors-in-cakephp/

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Plugins

Pgina 62 /90

Plugins Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

O CakePHP permite que voc defina uma combinao de controllers, models e views e os distribua como um plugin empacotado de aplicao que os outros podero usar em suas aplicaes CakePHP. Voc tem um mdulo de gerncia de usurios legal, ou um blog simples, ou quem sabe um mdulo de webservices em uma de suas aplicaes? Empacote-o como um plugin do CakePHP para poder incorpor-lo em outras aplicaes. A principal fronteira entre um plugin e a aplicao na qual est instalado a configurao da aplicao (conexo da base de dados, etc.). Por outro lado, ele funciona dentro de seu prprio espao, se comportando como se fosse a prpria aplicao. Ver comentrios desta seo
Criando um Plugin

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Como um exemplo funcional, vamos criar um novo plugin que pea uma pizza para voc. Para comear, vamos ter de colocar os arquivos de nosso plugin dentro da pasta /app/plugins folder. O nome da subpasta em que os arquivos do plugin ficaro importante e ser usado em diversos locais, ento escolha-o sabiamente. Para este plugin, vamos usar o nome 'pizza'. Aqui est como a configurao de nosso plugin deve se parecer:
/app /plugins /pizza /controllers /models /views /pizza_app_controller.php /pizza_app_model.php <<<<<os controllers do plugin vo aqui os models do plugin vo aqui as views do plugin views vo aqui o AppController do plugin o AppModel do plugin

Se voc quiser ser capaz de acessar seu plugin a partir de uma dada URL, torna-se obrigatrio definir um AppController e um AppModel para o seu plugin. Estas duas classes especiais so nomeadas depois do plugin e estendem os respectivos AppController e AppModel da aplicao. No h nenhuma novidade nos seus contedos, que para nosso plugin de pizza de exemplo, devem ser algos parecidos com: Plain Text View Ribamar FS http://cursos.ribafs.org

Curso de CakePHP
// /app/plugins/pizza/pizza_app_controller.php: <?php class PizzaAppController extends AppController { //... } ?>

Pgina 63 /90

// /app/plugins/pizza/pizza_app_model.php: <?php class PizzaAppModel extends AppModel { //... } ?>

Se voc se esquecer de definir estas classes especiais, o CakePHP ir dar um alerta sobre erros de "Missing Controller" enquanto voc no os criar. Ver comentrios desta seo
Controllers de Plugin

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Os controllers de nosso plugin pizza sero armazenados em /app/plugins/pizza/controllers/. Como o propsito principal aqui o pedido de pizzas, vamos precisar de um OrdersController para este plugin. Ainda que no seja obrigatrio, recomendado que voc d nomes relativamente nicos para os controllers de seu plugin para evitar conflitos de namespaces com as aplicaes residentes. No difcil de imaginar que a aplicao-pai possa ter um UsersController, OrdersController ou ProductsController; ento voc pode querer ser criativo com os nomes de controllers ou prefixar o nome do plugin ao nome da classe (PizzaOrdersController, neste caso). Ento, colocamos nosso PizzaOrdersController na pasta /app/plugins/pizza/controllers com um contedo semelhante a:
// /app/plugins/pizza/controllers/pizza_orders_controller.php class PizzaOrdersController extends PizzaAppController { var $name = 'PizzaOrders'; var $uses = array('Pizza.PizzaOrder'); function index() { //... } }

Este controller estende o AppController do plugin (chamado de PizzaAppController) ao invs do AppController da aplicao. Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 64 /90

Perceba tambm como o nome do model prefixado com o nome do plugin. Essa linha de cdigo adicionada apenas para deixar as coisas mais claras, mas no necessria neste exemplo. Se voc quiser visualizar o que estamos fazendo, acesse /pizza/pizza_orders. Se tudo estiver certo, neste ponto voc deve receber uma mensagem de erro sobre Missing Model, uma vez que nosso model PizzaOrder ainda no est definido. Ver comentrios desta seo
Plugin Models

Traduzir Visualizar apenas esta seo Comentrios (0) Histrico

There is no translation yet for this section. Please help out and translate this.. More information about translations Models for the plugin are stored in /app/plugins/pizza/models. We've already defined a PizzaOrdersController for this plugin, so let's create the model for that controller, called PizzaOrder. PizzaOrder is consistent with our previously defined naming scheme of pre-pending all of our plugin classes with Pizza.
// /app/plugins/pizza/models/pizza_order.php: class PizzaOrder extends PizzaAppModel { var $name = 'PizzaOrder'; } ?>

Visiting /pizza/pizzaOrders now (given youve got a table in your database called pizza_orders) should give us a Missing View error. Lets create that next. If you need to reference a model within your plugin, you need to include the plugin name with the model name, separated with a dot. For example:
// /app/plugins/pizza/models/pizza_order.php: class ExampleModel extends PizzaAppModel { var $name = 'ExampleModel'; var $hasMany = array('Pizza.PizzaOrder'); } ?>

If you would prefer that the array keys for the association not have the plugin prefix on them, use the alternative syntax:

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 65 /90

// /app/plugins/pizza/models/pizza_order.php: class ExampleModel extends PizzaAppModel { var $name = 'ExampleModel'; var $hasMany = array( 'PizzaOrder' => array( 'className' => 'Pizza.PizzaOrder' ) ); } ?>

Plugin Views

Traduzir Visualizar apenas esta seo Comentrios (0) Histrico

There is no translation yet for this section. Please help out and translate this.. More information about translations Views behave exactly as they do in normal applications. Just place them in the right folder inside of the /app/plugins/[plugin]/views/ folder. For our pizza ordering plugin, we'll need a view for our PizzaOrdersController::index() action, so let's include that as well:
// /app/plugins/pizza/views/pizza_orders/index.ctp: <h1>Order A Pizza</h1> <p>Nothing goes better with Cake than a good pizza!</p> <!-- An order form of some sort might go here....-->

Testando plugins


/app

Editar Visualizar apenas esta seo Comentrios (0) Histrico Compare com o contedo original

Testes para plugins so criados em seu prprio diretrio dentro da pasta plugins.
/plugins /pizza /tests /cases /fixtures /groups

Testes para plugins so como testes normais, exceto que voc deve se lembrar de usar a conveno de nomenclatura para plugins ao importar as classes. Este um exemplo de um caso de teste para o model PizzaOrder criado no captulo de plugins deste manual. Uma diferena para os outros testes a primeira linha que faz a importao de 'Pizza.PizzaOrder'. Voc tambm precisa prefixar os Ribamar FS http://cursos.ribafs.org

Curso de CakePHP fixtures de seu plugin com 'plugin.plugin_name.'.

Pgina 66 /90

<?php App::import('Model', 'Pizza.PizzaOrder'); class PizzaOrderCase extends CakeTestCase { // Fixtures de plugin localizados em /app/plugins/pizza/tests/fixtures/ var $fixtures = array('plugin.pizza.pizza_order'); var $PizzaOrderTest; function testSomething() { // ClassRegistry faz com que o model use a conexo de teste da base de dados $this->PizzaOrderTest =& ClassRegistry::init('PizzaOrder'); // faz algum teste til aqui $this->assertTrue(is_object($this->PizzaOrderTest)); } } ?>

Se voc quiser usar o fixtures de plugin nos testes da aplicao, voc pode referenci-los usando a sintaxe 'plugin.pluginName.fixtureName' no array $fixtures. E isso tudo! Fonte: http://book.cakephp.org/pt/complete/3/The-Manual

Veja um tutorial do Felipe Theodoro ensinando a criar seus prprios plugins para o Cake. http://blog.ftgoncalves.com/2009/03/criando-seus-proprios-plugins-para-o-cakephp/

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Relacionamentos

Pgina 67 /90

O cake detecta relacionamentos entre as tabelas, mas para isso precisamos atender a algumas das suas convenes. Para isso a chave primria deve ser id ou criar com o Bake e indicar a chave primria. 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 Cake - Dicas 1) Padronizao do aplicativo default Como cada vez que vou criar um novo aplicativo no cake:

Pgina 68 /90

- Copio a pasta app com o nome do novo aplicativo (Exemplo: cad_livros) - Depois ento vou realizar as personalizaes necessrias para comear: - locales/pt-BR - views/layout/default.ctp (fao uma cpia de cake/cake/libs/view/layouts/default.ctp para a pasta views/layout e personalizo) - webroot/index.php (adapto para permitir que vrios aplicativos usem o mesmo core) - entre outros. Como eu estou sempre fazendo isso, fica mais prtico j efetuar todas essas alteraes na pasta "app" do cake para que quando eu a copie j leve todas as minhas alteraes.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 69 /90

Cake Aplicativos de Exemplo Aplicativo Livros Aplicativo gerado pelo Bake com a finalidade de mostrar um relacionamento entre as tabelas autores e livros e tambm mostrar o comportamento das validaes. Criar um aplicativo para apenas duas tabelas relacionadas usando o Bake Banco - livro tabelas create table autores ( autor int auto_increment primary key, nome char(45) not null, email char(50) ); create table livros ( isbn char(17) primary key, titulo char(45) not null, editora char(50) not null, autore_id int not null, FOREIGN KEY (autore_id) REFERENCES autores(autor) ON DELETE RESTRICT ); insert into autores values (1, 'Alexandre Dumas Pai', 'alex@alex.com'); insert into autores values (2, 'Cames', 'camoes@camoes.com'); insert into autores values (3, 'Dante Alighieri', 'dante@dante.com'); insert into autores values (4, 'Albert Camus', 'albert@albert.com'); insert into autores values (5, 'Jean Paul Sartre', 'sartre@sartre.org'); insert into autores values (6, 'Augusto Cury', 'cury@cury.org'); 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 Trs Mosqueteiros', 'Nova Data', 1); insert into livros values ('978-0-470-03899-6', 'Os Lusadas', 'Saraiva', 2); insert into livros values ('978-0-470-03899-7', 'A Divina Comdia', '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 Razo', 'Novatec', 5); insert into livros values ('976-0-470-03899-4', 'Pais Brilhantes, Professores Fascinantes', 'Eldorado', 6); Copiar a pasta app para livro. Configurar a webroot/index.php para que vrios app usem o mesmo core.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 70 /90

Agora usemos o bake para criar o aplicativo, com validao dos campos e relacionamento. cd /var/www/cake/cake/console ./cake bake -app livro 1) Crie a configurao com o banco de dados livro. ./cake bake -app livro 2) Criar o model, o controller e a view para autores. 3) Depois criar o model, o controller e a view para livros (sempre nesta ordem). Use diretamente ./cake bake -app livro model ./cake bake -app livro controller ./cake bake -app livro view Au final vamos criar um simples menu para o Aplicativo: Adicionar o arquivo views/pages/home.ctp <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> A poderiamos adicionar editar, visualizar, excluir para ambos. Chamar no navegador com: http://localhost/cake/livro/ Dar suporte a pt-BR Aps implementar o suporte a pt-BR as mensagens de erro sero traduzidas, os nomes das aes dentre outros.

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cdigo do Aplicativo Livro criado com o Cake Bake models/autore.php <?php class Autore extends AppModel { var $name = 'Autore'; var $primaryKey = 'autor'; var $validate = array( 'autor' => array('numeric'), 'nome' => array('notempty'), 'email' => array('email') ); } ?> models/livro.php <?php class Livro extends AppModel { var $name = 'Livro'; var $primaryKey = 'isbn'; var $validate = array( 'isbn' => array('notempty'), 'titulo' => array('notempty'), 'editora' => array('notempty'), 'autore_id' => array('numeric') );

Pgina 71 /90

//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

Pgina 72 /90

var $name = 'Autores'; var $helpers = array('Html', 'Form'); function index() { $this->Autore->recursive = 0; $this->set('autores', $this->paginate()); } function view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid Autore.', true)); $this->redirect(array('action'=>'index')); } $this->set('autore', $this->Autore->read(null, $id)); } 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)); } } } function edit($id = null) { if (!$id && empty($this->data)) { $this->Session->setFlash(__('Invalid Autore', true)); $this->redirect(array('action'=>'index')); } if (!empty($this->data)) { 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)); } } if (empty($this->data)) { $this->data = $this->Autore->read(null, $id); } } Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 73 /90

function delete($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid id for Autore', true)); $this->redirect(array('action'=>'index')); } if ($this->Autore->del($id)) { $this->Session->setFlash(__('Autore deleted', true)); $this->redirect(array('action'=>'index')); } } } ?> controllers/livros_controller.php <?php class LivrosController extends AppController { var $name = 'Livros'; var $helpers = array('Html', 'Form'); function index() { $this->Livro->recursive = 0; $this->set('livros', $this->paginate()); } function view($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid Livro.', true)); $this->redirect(array('action'=>'index')); } $this->set('livro', $this->Livro->read(null, $id)); } 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 }

Pgina 74 /90

function edit($id = null) { if (!$id && empty($this->data)) { $this->Session->setFlash(__('Invalid Livro', true)); $this->redirect(array('action'=>'index')); } if (!empty($this->data)) { 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)); } } if (empty($this->data)) { $this->data = $this->Livro->read(null, $id); } $autores = $this->Livro->Autore->find('list'); $this->set(compact('autores')); } function delete($id = null) { if (!$id) { $this->Session->setFlash(__('Invalid id for Livro', true)); $this->redirect(array('action'=>'index')); } if ($this->Livro->del($id)) { $this->Session->setFlash(__('Livro deleted', true)); $this->redirect(array('action'=>'index')); } } } ?> 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

Pgina 75 /90

</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

Pgina 76 /90

foreach ($autores as $autore): $class = null; if ($i++ % 2 == 0) { $class = ' class="altrow"'; } ?> <tr<?php echo $class;?>> <td> <?php echo $autore['Autore']['autor']; ?> </td> <td> <?php echo $autore['Autore']['nome']; ?> </td> <td> <?php echo $autore['Autore']['email']; ?> </td> <td class="actions"> <?php echo $html->link(__('View', true), array('action' => 'view', $autore['Autore'] ['autor'])); ?> <?php echo $html->link(__('Edit', true), array('action' => 'edit', $autore['Autore'] ['autor'])); ?> <?php echo $html->link(__('Delete', true), array('action' => 'delete', $autore['Autore'] ['autor']), null, sprintf(__('Tem certeza de que deseja excluir o autor # %s?', true), $autore['Autore'] ['autor'])); ?> </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 Autore', true), array('action' => 'add')); ?></li> </ul> </div> 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

Pgina 77 /90

&nbsp; </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']; ?> &nbsp; </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']; ?> &nbsp; </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

Pgina 78 /90

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

Pgina 79 /90

foreach ($livros as $livro): $class = null; if ($i++ % 2 == 0) { $class = ' class="altrow"'; } ?> <tr<?php echo $class;?>> <td> <?php echo $livro['Livro']['isbn']; ?> </td> <td> <?php echo $livro['Livro']['titulo']; ?> </td> <td> <?php echo $livro['Livro']['editora']; ?> </td> <td> <?php echo $html->link($livro['Autore']['autor'], array('controller' => 'autores', 'action' => 'view', $livro['Autore']['autor'])); ?> </td> <td class="actions"> <?php echo $html->link(__('View', true), array('action' => 'view', $livro['Livro'] ['isbn'])); ?> <?php echo $html->link(__('Edit', true), array('action' => 'edit', $livro['Livro']['isbn'])); ? > <?php echo $html->link(__('Delete', true), array('action' => 'delete', $livro['Livro'] ['isbn']), null, sprintf(__('Are you sure you want to delete # %s?', true), $livro['Livro']['isbn'])); ?> </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 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

Pgina 80 /90

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']; ?> &nbsp; </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']; ?> &nbsp; </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']; ?> &nbsp; </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'])); ?> &nbsp; </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 Aplicativo de Exemplo cake_olamundo Criando Aplicativo no CakePHP de forma Simples e Rpida Vamos copiar a pasta app do cake para ola_cake Criar o banco cad_cliente Configurar ola_cake/config/database.php

Pgina 81 /90

Configurar ola_cake/webroot/index.php na linha com define('CAKE_CORE_INCLUDE_PATH' para: define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__)))); Criar tabela create table clientes ( id int not null auto_increment primary key, nome char(45) not null ); INSERT INTO clientes (id, nome) VALUES (1,'Joao Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (2,'Roberto Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (3,'Antnio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (4,'Carlos Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (5,'Otoniel Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (6,'Helena Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (7,'Flvio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (8,'Joana Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (9,'Francisco Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (10,'Jorge Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (11,'Pedro Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (12,'Ribamar Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (13,'Tiago Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (14,'Elias Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (15,'Marcos Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (16,'Ricardo Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (17,'Rmulo Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (18,'Henrique Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (19,'Francis Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (20,'Otvio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (21,'Rogrio Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (22,'Jurandir Pereira Brito'); INSERT INTO clientes (id, nome) VALUES (23,'Raqul Pereira Brito'); Passos para a criao de um aplicativo bsico aps as configuraes: - Criar o model Ribamar FS http://cursos.ribafs.org

Curso de CakePHP - 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'; } ?>

Pgina 82 /90

Toda funo pblica 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'; // Para a view index.ctp function index() { $this->set('clientes', $this->Cliente->find('all')); } } ?> 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 <table> <tr> <th>ID</th> <th>Nome</th> <th>Aes</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; ?> Agora chamar no navegador assim: http://localhost/cake/ola_cake/clientes

Pgina 83 /90

A temos a listagem dos registros da tabela praticamente sem programao, apenas algumas poucas linhas. Adicionar Registros Para isso precisaremos adicionar uma varivel (array $helpers) e uma funo add() ao controller, como tambm adicionar uma view pasta clientes, de nome add.ctp. var $helpers = array('Html', 'Form'); 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 no adicionado. Tente novamente.'); } Ribamar FS http://cursos.ribafs.org

Curso de CakePHP } } Que ficar assim: cake/ola_cake/controllers/clientes_controller.php <?php class ClientesController extends AppController { var $name = 'Clientes'; var $helpers = array('Html', 'Form'); function index() { $this->set('clientes', $this->Cliente->find('all')); }

Pgina 84 /90

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 no adicionado. Tente novamente.'); } } } } ?> Adicionar a view: cake/ola_cake/views/clientes/add.ctp <?php echo $form->create('Cliente');?> <fieldset> <legend>Adicionar novo Cliente</legend> <?php echo $form->input('ID'); echo $form->input('Nome'); ?> </fieldset> <?php echo $form->end('Adicionar');?> Agora chame com o navegador: http://localhost/cake/ola_cake/clientes/add

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 85 /90

Adicionar um link do form Add para a nossa view index.ctp (adicionar ao final): <?php echo $html->link('Adicionar Cliente', array('action'=>'add')); ?> Adicionar um link para a view index na view add.ctp (ao final): <?php echo $html->link('Listar todos os Clientes', array('action'=>'index')); ?>

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'; var $helpers = array('Html', 'Form'); 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 no adicionado. Tente novamente.'); } } } function edit($id = null) { if (!$id) { $this->Session->setFlash('Cliente Invlido'); $this->redirect(array('action'=>'index'), null, true); } if (empty($this->data)) { $this->data = $this->Cliente->find(array('id' => $id)); } else { if ($this->Cliente->save($this->data)) { $this->Session->setFlash('O Cliente foi salvo!'); Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 86 /90

$this->redirect(array('action'=>'index'), null, true); } else { $this->Session->setFlash('O Cliente no pde ser salvo. Favor tentar novamente.'); } } } } ?> Adicionar o link para Edio na index.ctp, para que fique assim: <h2>Clientes</h2> <?php if(empty($clientes)): ?> Nenum cliente encontrado <?php else: ?> <table> <tr> <th>ID</th> <th>Nome</th> <th>Aes</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; ?> <?php echo $html->link('Adicionar Cliente', array('action'=>'add')); ?> Agora adicionar o link para o edit.ctp: <?php echo $html->link('Listar Todos os Clientes', array('action'=>'index')); ?><br /> <?php echo $html->link('Adicionar Cliente', array('action'=>'add')); ?>

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Criar um Menu de entrada Adicionar o arquivo home.ctp em views/pages:

Pgina 87 /90

<h1>Bem vindo ao Bake</h1> <p>Aqui podmeos fazer:</p> <ul> <li><?php echo $html->link('Lista de todos os clientes', array('controller' => 'clientes', 'action'=>'index')); ?></li> <li><?php echo $html->link('Adicionar novo Cliente', array('controller' => 'clientes', 'action'=>'add')); ?></li> <li>Editar Clientes</li> <li>Excluir Clientes</li> </ul> Agora basta chamar no navegador: http://localhost/cake/ola_cake/

Outros Aplicativos de Exemplo encontrados no Site: bake blog estoque foreign forum ola_cake

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP Cake - Referncias Site oficial http://cakephp.org Site Brasileiro do CakePHP http://cakephp.com.br/ Manuais Manual do Cake - CookBook http://book.cakephp.org/pt/complete/3/The-Manual Manual do Cake em Portugus http://manual.cakephp.com.br/doku.php 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

Pgina 88 /90

Lista internacional (em processo de mudana para outro servidor) http://groups.google.com/group/cake-php/topics Lista portuguesa http://groups.google.com/group/cake-php-pt Tutoriais Tutorial da IBM em 5 partes somando mais de 130 pginas - 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 Cdigo 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

Pgina 89 /90

http://www.ibm.com/developerworks/opensource/tutorials/os-php-cake2/os-php-cake2-pdf.pdf Cdigo 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/ Cdigo 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 Cdigo 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 Outro timo tutorial da IBM Create an interactive production wiki using PHP https://www6.software.ibm.com/developerworks/education/os-php-wiki1/os-php-wiki1-pdf.pdf Cdigo fonte - https://www6.software.ibm.com/developerworks/education/os-phpwiki1/downloads.html Livros Livros impressos sobre CakePHP http://astore.amazon.com/cakesoftwaref-20 Outros livros: Cakephp Application Development - http://www.packtpub.com/cakephp-applicationdevelopment/book Cdigo fonte - http://www.packtpub.com/support (Selecionar Cakephp Application Development na lista e clicar em Go) Entrar com seu e-mail para receber o cdigo fonte Tabela de contedo - http://www.packtpub.com/article/cakephp-application-development-table-ofcontents

Ribamar FS http://cursos.ribafs.org

Curso de CakePHP

Pgina 90 /90

Beginning CakePHP: From Novice to Professional http://www.apress.com/book/view/1430209771 Cdigo fonte - http://www.apress.com/book/downloadfile/4046 Captulo 1 (amostra) - http://www.apress.com/book/downloadfile/4066 Tabela com contedo - http://www.apress.com/book/downloadfile/4067 Practical CakePHP Projects - http://www.apress.com/book/view/143021578x Captulo 1 (amostra) - http://www.apress.com/resource/bookfile/4222 Cdigo fonte - http://www.apress.com/resource/bookfile/4182 Tabela com contedo - http://www.apress.com/book/downloadfile/4223

Ribamar FS http://cursos.ribafs.org

Vous aimerez peut-être aussi