Anda di halaman 1dari 80

MANUAL CAKEPHP 1.

2
Juan Basso

3 de maro de 2008

Sumrio
PARTE I. COMEANDO COM CAKEPHP ......................................................................7
Prefcio ................................................................................................................................................. 7 Requisitos do leitor .................................................................................................................................. 7 Introduo ao CakePHP ......................................................................................................................... 7 O que CakePHP? Por que usar? ............................................................................................................. 7 Onde obter ajuda? ................................................................................................................................... 8 Entendendo o Model-View-Controller (MVC) ........................................................................................ 9 Introduo ................................................................................................................................................ 9 Benefcios ............................................................................................................................................... 10

PARTE II.

PRINCPIOS BSICOS DO CAKEPHP ....................................................... 11

Estrutura CakePHP ............................................................................................................................... 11 Extenses de controller ......................................................................................................................... 11 Extenses de view .................................................................................................................................. 11 Extenses do model ............................................................................................................................... 11 Extenses de aplicao .......................................................................................................................... 12 Estrutura de arquivos do CakePHP ....................................................................................................... 12 Estrutura do diretrio App ..................................................................................................................... 13 Requisio tpica do CakePHP .............................................................................................................. 13 Convenes CakePHP ........................................................................................................................... 15 Convenes de arquivos e nome de classes .......................................................................................... 15 Convenes de modelos ........................................................................................................................ 15 Convenes de controladores................................................................................................................ 15 Convenes de vises ............................................................................................................................ 16

PARTE III.

DESENVOLVENDO COM CAKEPHP ...................................................... 17

Requisitos ............................................................................................................................................ 17 Preparativos para instalao................................................................................................................ 17 Baixando o CakePHP .............................................................................................................................. 17 Permisses ............................................................................................................................................. 17 Instalao ............................................................................................................................................ 18 Desenvolvimento ................................................................................................................................... 18 Produo ................................................................................................................................................ 18 Instalao avanada ............................................................................................................................... 19 Caminho de classes adicionais ........................................................................................................... 20

Apache e mod_rewrite .......................................................................................................................... 20 Comece agora! ....................................................................................................................................... 20 Configurao........................................................................................................................................ 21 Configurao da base de dados ............................................................................................................. 21 Configurao do ncleo ......................................................................................................................... 22 As classes de configurao ..................................................................................................................... 22 Classes de configurao ..................................................................................................................... 22 Variveis de configurao do ncleo ................................................................................................. 22 Constantes de configurao .............................................................................................................. 22 Configurao de rotas (Routes) ............................................................................................................. 22 Inflexo personalizada ........................................................................................................................... 23 Configurao de inicializao (bootstrap) .............................................................................................. 24 Controllers (Controladores) ................................................................................................................. 24 Introduo .............................................................................................................................................. 24 Atributos ................................................................................................................................................ 25 $name ................................................................................................................................................ 25 $components, $helpers e $uses ........................................................................................................ 25 Relativo pgina: $layout e $pageTitle ............................................................................................. 26 Atributos dos parmetros ($params) ................................................................................................ 26 Outros atributos ................................................................................................................................ 27 Mtodos ................................................................................................................................................. 28 Interagindo com as vises ................................................................................................................. 28 Fluxo de controle ............................................................................................................................... 29 Callbacks ............................................................................................................................................ 29 Outros mtodos ................................................................................................................................. 30 Components (Componentes) ............................................................................................................... 33 Introduo .............................................................................................................................................. 33 Construindo componentes personalizados............................................................................................ 33 Acessando classes do MVC de dentro dos componentes ...................................................................... 34 Models (Modelos)................................................................................................................................ 34 Introduo .............................................................................................................................................. 34 Campos mgicos .................................................................................................................................... 34 Atributos ................................................................................................................................................ 34 Mtodos ................................................................................................................................................. 34 Associaes ............................................................................................................................................ 34 Introduo ......................................................................................................................................... 34 hasOne ............................................................................................................................................... 35 belongsTo .......................................................................................................................................... 37 hasMany ............................................................................................................................................ 38 hasAndBelongsToMany (HABTM) ...................................................................................................... 41 Salvando dados em tabelas relacionadas (hasOne, hasMany, belongsTo) ....................................... 43 Salvando dados em tabelas relacionadas (HABTM) .......................................................................... 44 Criando e removendo relaes durante execuo ............................................................................ 45 DataSources ........................................................................................................................................... 47 Behaviors................................................................................................................................................ 47

ii

Introduo ......................................................................................................................................... 47 Usando Behaviors .............................................................................................................................. 47 TreeBehavior ..................................................................................................................................... 47 TranslateBehavior .............................................................................................................................. 47 ACLBehavior ....................................................................................................................................... 47 Views (Vises)...................................................................................................................................... 47 Templates / Skin ..................................................................................................................................... 47 Layouts ................................................................................................................................................... 48 Elements (Elementos) ............................................................................................................................ 50 Helpers (Ajudantes) ............................................................................................................................. 50 Introduo .............................................................................................................................................. 50 Helpers do CakePHP ............................................................................................................................... 51 Criando helpers ...................................................................................................................................... 52 Incluindo outros helpers .................................................................................................................... 52 Usando seus helpers personalizados ................................................................................................. 53 Contribuindo ...................................................................................................................................... 53 Scaffolding ........................................................................................................................................... 53 Introduo .............................................................................................................................................. 53 Personalizando os scaffolds ................................................................................................................... 54 CakePHP Console ................................................................................................................................. 55 Introduo .............................................................................................................................................. 55 Criando Shells e Tasks ............................................................................................................................ 55 Criando suas Shells ............................................................................................................................ 55 Tasks .................................................................................................................................................. 55 Gerando cdigo com Bake ................................................................................................................... 55 Plugins ................................................................................................................................................. 55 Criando um plugin .................................................................................................................................. 55 Plugin de controladores ..................................................................................................................... 55 Plugin de modelos ............................................................................................................................. 55 Plugin de vises ................................................................................................................................. 55 Plugin de informaes ....................................................................................................................... 55 Constantes e funes globais ............................................................................................................... 55 Funes globais ...................................................................................................................................... 55 Constantes do ncleo ............................................................................................................................. 58 Constantes do diretrio ......................................................................................................................... 58

PARTE IV. TAREFAS COMUNS COM CAKEPHP ......................................................... 60


Validao de dados .............................................................................................................................. 60 Regras simples ....................................................................................................................................... 60 Uma regra por campo ............................................................................................................................ 60 rule ..................................................................................................................................................... 60

iii

required ............................................................................................................................................. 60 allowEmpty ........................................................................................................................................ 60 on ....................................................................................................................................................... 60 message ............................................................................................................................................. 60 Mltiplas regras por campo ................................................................................................................... 60 Construindo regras de validao ............................................................................................................ 60 alphaNumeric .................................................................................................................................... 60 between ............................................................................................................................................. 60 blank .................................................................................................................................................. 60 cc ........................................................................................................................................................ 60 comparison ........................................................................................................................................ 60 date .................................................................................................................................................... 60 email .................................................................................................................................................. 60 ip ........................................................................................................................................................ 60 minLength .......................................................................................................................................... 60 maxLength ......................................................................................................................................... 60 numeric .............................................................................................................................................. 60 phone ................................................................................................................................................. 60 postal ................................................................................................................................................. 60 ssn ...................................................................................................................................................... 60 url ....................................................................................................................................................... 60 Regras de validao personalizada ........................................................................................................ 60 Validao por expresses regulares personalizadas ......................................................................... 61 Validao por mtodos personalizados ............................................................................................. 61 Limpeza de dados ................................................................................................................................ 61 Manipulao de erros .......................................................................................................................... 61 Debugando .......................................................................................................................................... 61 Gerando caches ................................................................................................................................... 61 Logando ............................................................................................................................................... 61 Introduo .............................................................................................................................................. 61 Usando as funes de log ...................................................................................................................... 61 Testando .............................................................................................................................................. 62 Internacionalizando ............................................................................................................................. 62 Definindo o locale da sua aplicao ....................................................................................................... 62 Internacionalizando em CakePHP .......................................................................................................... 63 Paginao ............................................................................................................................................ 64 Configurando os controladores ............................................................................................................. 64 Paginando nas vises ............................................................................................................................. 64 Paginando com AJAX .............................................................................................................................. 64 Alteraes no layout .......................................................................................................................... 64 Alteraes nas vises ......................................................................................................................... 64

iv

PARTE V.

COMPONENTES INTERNOS ....................................................................... 65

Lista de controle de acessos (ACL)........................................................................................................ 65 Autenticao........................................................................................................................................ 65 Sesses ................................................................................................................................................ 65 Manipulando requisies ..................................................................................................................... 65 Segurana ............................................................................................................................................ 65 E-mail .................................................................................................................................................. 65 Cookies ................................................................................................................................................ 65 Introduo .............................................................................................................................................. 65 Configurando os controladores ............................................................................................................. 65 Usando o componente ........................................................................................................................... 65

PARTE VI. HELPERS INTERNOS .................................................................................... 66


Formulrios ......................................................................................................................................... 66 Criando formulrios ............................................................................................................................... 66 $options['type'].................................................................................................................................. 66 $options['action'] ............................................................................................................................... 67 $options['url'] .................................................................................................................................... 67 $options['default'] ............................................................................................................................. 67 Fechando formulrios ............................................................................................................................ 68 Elemento de formulrio mgico ............................................................................................................ 68 $options['type'].................................................................................................................................. 69 $options['before'], $options['between'] e $options['after'].............................................................. 69 $options['options']............................................................................................................................. 69 $options['multiple'] ........................................................................................................................... 70 $options['maxLength'] ....................................................................................................................... 70 $options['div'] .................................................................................................................................... 70 $options['label'] ................................................................................................................................. 70 $options['id'] ...................................................................................................................................... 70 $options['error'] ................................................................................................................................ 70 $options['selected'] ........................................................................................................................... 70 $options['rows'], $options['cols'] ...................................................................................................... 70 $options['empty'] .............................................................................................................................. 70 $options['timeFormat'] ...................................................................................................................... 70 $options['dateFormat'] ...................................................................................................................... 71 Mtodos especficos do elemento de formulrio .................................................................................. 71 HTML ................................................................................................................................................... 73 Inserindo elementos bem-formados ..................................................................................................... 73 JavaScript............................................................................................................................................. 73

AJAX ....................................................................................................................................................... 73 Opes do AjaxHelper ............................................................................................................................ 73 Opes gerais..................................................................................................................................... 73 Opes de callback ............................................................................................................................ 73 Mtodos ................................................................................................................................................. 73 Cache ................................................................................................................................................... 73 Form .................................................................................................................................................... 73 Number ............................................................................................................................................... 73 Text ..................................................................................................................................................... 73 Time..................................................................................................................................................... 73

PARTE VII.

EXEMPLOS .................................................................................................. 74

Tutorial de como fazer um blog em CakePHP ....................................................................................... 74 Sistema simples de autenticao de usurios ...................................................................................... 74

PARTE VIII.

APNDICES ................................................................................................. 75

Escritores da verso inglesa ................................................................................................................. 75 Tradutores para lngua portuguesa ...................................................................................................... 75 Apoio e reviso da verso traduzida ...................................................................................................... 75 Inflexo em portugus ......................................................................................................................... 75

vi

Comeando com CakePHP

Parte I.
Prefcio

Comeando com CakePHP

Bem vindo ao paraso de desenvolvimento web. Se voc est lendo o prefcio de um manual tcnico, porque est lhe sobrando bastante tempo. No somos celebridades e o material o que vem depois. Voc pode pular estes captulos suprfluos e ir direto ao ponto nas sees que voc quer. Requisitos do leitor Para ler este manual, voc j deve estar familiarizado com o PHP. Conhecer de programao orientada a objeto ir lhe ajudar bastante, porm eu suponho que as sees de introduo deste manual serviro como um bom exemplo do que vem pela frente. Com isso, este material escrito para desenvolvedores de todos os nveis de habilidade que desejam criar algo robusto, sustentvel, rpido e agradvel. Devo alertar que haver sees que abordam tecnologias que esto realmente fora do mbito deste manual. Administrao de servidor Web, AJAX e JavaScript, por exemplo, podem ser mencionados em partes do texto, mas na maior parte do texto ns estaremos focado no CakePHP.

Introduo ao CakePHP
O que CakePHP? Por que usar? CakePHP gratuito, de cdigo aberto, uma framework em PHP para desenvolvimento gil. uma estrutura fundamental para programadores criarem aplicaes web. Nosso principal objetivo permitir que voc trabalhe em uma estrutura que possa programar de forma rpida e sem a perda de flexibilidade. CakePHP joga fora a monotonia do desenvolvimento web. Ns oferecemos todas as ferramentas que voc precisa para comear programando o que realmente deseja: a lgica especfica da sua aplicao. Em vez de reinventar a roda cada vez que se constri um novo projeto, pegue uma cpia do CakePHP e comece a construir sua carruagem real da sua aplicao. CakePHP tem uma equipe de desenvolvedores e uma grande comunidade, trazendo grande valor ao projeto. Alm de manter voc fora do reinvento da roda, usando CakePHP significa que o ncleo da sua aplicao bem testado e constantemente aperfeioado. Abaixo segue uma pequena lista dos recursos que voc poder desfrutar no CakePHP: Ativo e com comunidade amigvel; Licena flexvel; Compatibilidade com PHP 4 e PHP 5; Integrando funcionalidade CRUD (Create, Read, Update and Delete, ou Criar, Ler, Atualizar e Excluir) para interagir com o banco de dados;

Comeando com CakePHP

Aplicaes scaffolding; Gerao de cdigo; Arquitetura MVC (Model, View, Controller, ou Modelo, Vises, Controlador); Requisies ao expedidor com clareza, URLs personalizveis e rotas; Validaes internas; Templates rpidos e flexveis (Sintaxe PHP e com ajudantes); Ajudantes para usar AJAX, JavaScript, HTML, formulrios e outros nas vises; Componentes de E-mail, Cookie, Segurana, Sesses, Manipulao de Requisies e outros; Lista de controle de acessos flexvel; Limpeza de dados; Flexibilidade com cache; Internacionalizao; Funciona em qualquer subdiretrio do seu website, com poucas configuraes do Apache.

Onde obter ajuda? Voc comeou no lugar certo. Este manual (e a API) deve ser provavelmente o primeiro lugar que voc v para procurar as respostas das suas dvidas. Assim como acontece com muitos outros projetos de cdigo aberto, ns obtemos novos usurios regularmente. Tentamos ser os melhores para responder seus questionamentos em primeiro lugar. As respostas podem demorar a chegar, mas permanecer por tempos e ajudar a esclarecer outras pessoas. Tanto o manual, quanto a API podem ser encontradas online. http://manual.cakephp.com.br (em portugus) http://manual.cakephp.org (em ingls) http://api.cakephp.org/1.2 (em ingls) Se voc estiver assustado, d um grito pelo canal de IRC internacional ou entre no grupo da comunidade luso-brasileira. Alm da equipe de desenvolvimento do ncleo do CakePHP no canal, principalmente durante o dia. Se voc precisar de alguma ajuda, deseja encontrar usurios na sua rea ou gostaria de doar o novo carro esportivo, gostaramos de falar com voc. Grupo da comunidade luso-brasileira: http://groups.google.com/group/cake-php-pt #cakephp-pt @ irc.freenode.net (em portugus) #cakephp @ irc.freenode.net (em ingls) O CakePHP Bakery uma casa para todas as coisas de CakePHP. Visite este site para ver tutoriais, estudos de caso e exemplos de cdigo. Assim que estiver familiarizado com o CakePHP, faa o login e compartilhe seus conhecimentos com a comunidade para ganhar fama e fortuna. http://bakery.cakephp.org

Comeando com CakePHP

O CakeForge outro recurso que os desenvolvedores podem usar para hospedar seus projetos usando CakePHP e compartilhar com outras pessoas. Se voc est olhando para achar projetos existentes, ou querendo compartilhar, acesso o CakeForge. http://www.cakeforge.org O site oficial do CakePHP est sempre esperando sua visita. Ele tem links para sites de outros desenvolvedores, screencasts, oportunidade para doar ao projeto e downloads. http://www.cakephp.org

Entendendo o Model-View-Controller (MVC)


Introduo Aplicaes bem escritas em CakePHP segue o design pattern MVC (Model-View-Controller ou Modelo-Viso-Controlador). Programando em MVC separa sua aplicao em trs partes principais. O model representa os dados, a view representa a visualizao dos dados e o controller manipula e roteia as requisies dos usurios.

Figura 1. Requisio tpica do CakePHP

A Figura 1 mostra um exemplo de uma simples requisio MVC em CakePHP. Para fins ilustrativos, digamos que um usurio chamado Ricardo apenas clicou no link Comprar um bolo personalizado agora! da sua aplicao. 1. Ricardo clica no link apontando para http://www.exemplo.com.br/cakes/comprar e seu navegador faz uma requisio ao site; 2. O dispatcher (expedidor) verifica a URL requisitada (/cakes/comprar) e redireciona ao controller correto; 3. O controller executa a lgica especfica da aplicao. Por exemplo, verifica se o Ricardo est logado; 4. O controller tambm usa os models para acessar os dados da sua aplicao. Muitas vezes, os models representam as tabelas do banco de dados, mas podem representar registros LDAP, feeds de RSS ou at mesmo arquivos do sistema. Neste exemplo, o controller usa o model para trazer ao Ricardo as ltimas compras do banco de dados; 5. Depois que o controller fez sua mgica sobre os dados, ele repassa para a view. A view faz com que os dados fiquem prontos para a representao do usurio. As views em CakePHP normalmente vem no formato HTML, mas pode ser facilmente exibidas em

Comeando com CakePHP

10

PDF, documento XML, um objeto JSON ou outro formato qualquer, dependendo da sua necessidade; 6. Uma vez que a viso tenha usado os dados provenientes do controller para construir a pgina, o contedo retornado ao browser do Ricardo. Aproximadamente toda requisio da sua aplicao seguir o modelo bsico do modelo. Ns vamos especificar os detalhes mais adiante, mas mantenha essa viso geral no seu pensamento. Benefcios Por que usar MVC? Porque um verdadeiro padro de desenvolvimento (design pattern) e torna fcil a manuteno da sua aplicao, com pacotes modulares de rpido desenvolvimento. Elaborar tarefas divididas entre models, views e controllers, faz com que sua aplicao fique leve e independente. Novas funcionalidades so facilmente adicionadas e dar nova cara nas caractersticas antigas pode ser feitas num piscar de olhos. O design modular e separado tambm permite aos desenvolvedores e designers trabalhem simultaneamente, incluindo a habilidade de um construir um rpido prottipo. A separao tambm permite que os desenvolvedores alterem uma parte da aplicao sem afetar outras. Se voc nunca desenvolveu uma aplicao neste sentido, isso vai lhe agradar muito, mas estamos confiantes que depois de construir sua primeira aplicao em CakePHP, voc no vai querer voltar atrs.

Princpios bsicos do CakePHP

11

Parte II.

Princpios bsicos do CakePHP

Estrutura CakePHP
CakePHP possui a caracterstica de usar as classes de Controller, Model e View, mas tambm possui classes e objetos adicionais que fazem o desenvolvimento em MVC mais rpido e agradvel. Components, Behaviors e Helpers so classes que proporcionam extensibilidade e reuso para adicionar funcionalidades rapidamente base MVC das suas aplicaes. Agora vamos comear a subir um pouco o nvel para analisar os detalhes de como usar estas ferramentas mais tarde. Extenses de controller O Component (Componente) uma classe que ajuda na lgica do controller. Se voc tem a mesma lgica e quer compartilhar entre controllers (ou aplicaes), o component uma boa sada. Por exemplo, o component interno EmailComponent cria e envia e-mails em segundo plano. Ao invs de escrever um mtodo em cada controller que utiliza esta lgica, pode-se criar um component que empacote esta funcionalidade e seja compartilhado entre os controllers. Controllers tambm so equipados com callbacks. Estes callbacks esto disponveis para que voc possa utilizar, apenas se voc precisar inserir uma lgica entre operaes do ncleo do CakePHP. Os callbacks disponveis incluem: beforeFilter(), executado antes de qualquer ao do controller; beforeRender(), executado depois da lgica do controller, mas antes da view ser renderizada; afterFilter(), executado depois de todas as lgicas do controller, incluindo a renderizao da view. No h diferena entre afterRender() e afterFilter(), exceto que voc tenha feito uma chamada manualmente para render() no seu mtodo do controller e tenha includo alguma lgica depois dessa chamada.

Extenses de view O Helper (Ajudante) a classe que ajuda na lgica da view. Assim como o component ajuda o controller, os helpers permitem a apresentao lgica ser acessada e compartilhada entre as views. AjaxHelper um dos principais helpers. Ele faz requisies AJAX facilmente de dentro das views. A maioria das aplicaes tem partes do cdigo que so usados repetidamente nas views. CakePHP facilita o reuso de cdigo na view com a utilizao de layouts e elements (elementos). Por padro, toda view renderizada por um controller seguindo algum layout. Os elements so como pequenos trechos de cdigo necessrios que podem ser reutilizados em diversas views. Extenses do model Assim como as outras extenses, os Behaviors funcionam do mesmo modo, adicionando funcionalidades entre os models. Por exemplo, se voc armazenar os dados do usurio em uma estrutura de rvore, voc pode especificar o model User como comportamento de rvore e ganhar funcionalidades para remover, adicionar e alterar ns em sua estrutura de rvore fundamental.

Princpios bsicos do CakePHP

12

Os models tambm so suportados por outra classe chamada DataSource. DataSources so abstraes que permitem os models manipularem diferentes tipos de dados consistentemente. Enquanto a principal fonte de dados numa aplicao CakePHP via banco de dados, voc pode escrever DataSources adicionais que permitem seu model representar um feed RSS, arquivo CSV, entidades LDAP ou eventos iCal. DataSources permite voc associar registros de diferentes fontes: ao invs de limitar em joins do SQL, DataSources permitem voc chamar seu model de LDAP que est associada a vrios eventos iCal. Assim como nos controllers, models tm recursos de callback como: beforeFind() afterFind() beforeValidate() beforeSave() afterSave() beforeDelete() afterDelete()

Os nomes desses mtodos devem ser descritivos o bastante para que voc saiba o que eles fazem. Certifique-se de pegar os detalhes no captulo sobre model. Extenses de aplicao Tanto os controllers, helpers e models tm uma classe pai que voc pode usar para definir modificaes na aplicao. AppController (localizado em /app/app_controller.php), AppHelper (localizado em /app/app_helper.php) e AppModel (localizado em /app/app_model.php) so bons lugares para colocar mtodos que voc precisa para acessar entre todos os controllers, helpers e models. Embora no sejam classes ou arquivos, as rotas definem regras na requisio feita para o CakePHP. As definies das rotas definem como o CakePHP deve mapear uma URL para um mtodo do controller. O behavior padro assume que a URL /controller/action/var1/var2 mapeia para Controller::action($var1, $var2), mas voc pode usar rotas para personalizar URLs e como elas devem ser interpretadas pela sua aplicao. Alguns recursos na sua aplicao podem ser empacotados com mrito. Um plugin um pacote de model, controller e view que realiza um objetivo especfico que pode abranger vrios aplicativos. Um sistema de gesto de usurios ou um blog simplificado podem ser bons exemplos de plugins para CakePHP.

Estrutura de arquivos do CakePHP


Vamos dar uma olhada o que o CakePHP fora da caixa. Voc que o CakePHP utiliza-se da requisio bsica do MVC, mas no sabe como que os arquivos so organizados. app cake docs index.php

Princpios bsicos do CakePHP

13

vendors

Quando voc faz o download do CakePHP, voc ver que possui quatro pastas principais. A pasta app ser o lugar da sua mgica: aqui sero guardados os arquivos da sua aplicao. A pasta cake onde a mgica acontece. Faa um compromisso pessoal de no editar os arquivos desta pasta! Ns no ajudamos voc se voc modific-la. A pasta docs contm as informaes de alteraes, licena, etc. Finalmente, a pasta vendors onde voc colocar aplicativos de terceiros para utilizar na aplicao, por exemplo, jQuery, prototype, FCKEditor, etc. Estrutura do diretrio App A pasta app do CakePHP onde normalmente voc colocar sua aplicao em desenvolvimento, Vamos dar uma olhada mais de perto dentro desta pasta.
Tabela 1. Descrio dos diretrios de app

Diretrio config

controllers locale models plugins tmp

vendors

views webroot

Descrio Contm os arquivos de configurao. Detalhes das conexes ao banco de dados, bootstrapping, arquivos de configurao do ncleo e outros devem ser armazenados aqui. Contm os controllers da sua aplicao e seus components. Guarda os arquivos com as strings para internacionalizaao. Contm os models, behaviors e datasources da sua aplicao. Contm os pacotes de plugins. Aqui onde o CakePHP armazena os arquivos temporrios. Os dados atuais so armazenados onde voc tenha configurado o CakePHP, mas esta pasta normalmente usada para guardar a descrio dos models, logs e outras informaes, como as das sesses. 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. Arquivos de apresentao devem vir aqui: elements, pginas de erro, helpers, layouts e arquivos de views. No modo de produo, esta pasta deve servir como a pasta raiz da sua aplicao. Dentro desta pastas so guardados os arquivos pblicos, como estilos CSS, imagens e arquivos de JavaScript.

Requisio tpica do CakePHP


Ns cobrimos os ingredientes bsicos no CakePHP, ento vamos ver como cada objeto funciona em uma completa requisio. Continuando com nossa requisio original de exemplo, vamos imaginar que nosso amigo Ricardo tenha clicado no link em Comprar um bolo personalizado agora! da sua aplicao CakePHP.

Princpios bsicos do CakePHP

14

Figura 2. Requisio tpica no CakePHP. Em preto, elemento necessrio; Em cinza, elemento opcional; Em azul, callback

1. Ricardo clica no link apontando para http://www.exemplo.com.br/cakes/buy, e seu navegador faz a requisio ao seu servidor de web; 2. O roteador processa a URL, extraindo os parmetros desta requisio: o controller, action (ao) e qualquer outro argumento que vai afetar na lgica do negcio durante esta requisio; 3. Usando rotas, a requisio da URL mapeada para a action do controller (um mtodo especfico da classe do controller). Neste caso, o mtodo buy() do CakesController. O callback beforeFilter() do controller chamado antes de qualquer action do controller ser executada; 4. O controller pode usar mtodos para ter acesso aos dados da aplicao. Neste exemplo, o controller usa o model para ver no banco de dados as ltimas compras de Ricardo. Qualquer callback aplicvel do modelo, behaviors e DataSources podem ser aplicados durante esta operao. Enquanto um model no necessrio, todos os controllers do CakePHP inicialmente requisitam de pelo menos um model; 5. Depois do model ter adquiridos os dados, ele retorna-os ao controller. Podem ser aplicados callbacks no model; 6. O controller pode usar components para refinar os dados ou efetuar outras operaes (manipular sesses, autenticao ou enviar e-mails, por exemplo); 7. Uma vez que o controller tenha usado os models e os components para preparado os dados suficientemente, estes dados so repassados as views usando o mtodo set() do controller. Callbacks dos controllers podem ser aplicados antes dos dados serem enviados. A lgica da view efetuada, podendo incluir elements ou helpers. Por padro, as views so sempre renderizadas dentro de um layout; 8. Alm disso, callbacks dos controllers (como afterFilter) pode ser aplicado. Para completar, o cdigo renderizado pela view vai para o navegador do Ricardo.

Princpios bsicos do CakePHP

15

Convenes CakePHP
Ns somos grandes fs de convenes nas configuraes. Enquanto isso toma 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 livra-sede madrugas de manuteno de arquivos de configurao. Convenes tambm fazem com que o sistema fique uniformemente desenvolvido, permitindo outros desenvolvedores o ajudem mais facilmente. Convenes no CakePHP tem sido produzida por anos de experincia em desenvolvimento web e boas prticas. Enquanto ns sugerimos voc a usar essas convenes enquanto desenvolve em CakePHP, ns devemos mencionar que muitos desses princpios so facilmente sobrescritos por alguma coisa que especialmente passado 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 modelos Nome das classes de modelo devem ser no singular e CamelCased. Person, BigPerson e ReallyBigPerson so todos os exemplos de nomes convencionados para modelos. Os nomes das tabelas correspondem ao nome do modelo do CakePHP, mas no plural e sublinhados. As tabelas para os modelos mencionados anteriormente devem ser people, big_people e really_big_people, respectivamente. Tabelas associadas, usadas em relaes hasAndBelongsToMany entre modelos, devem ser nomeadas depois dos modelos das tabelas que a compem, em ordem alfabtica (apples_zebras em vez de zebras_apples). Se sua aplicao possui esse tipo de relao entre os modelos Tag e Post, o nome deve ser posts_tags. Convenes de controladores 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.

Princpios bsicos do CakePHP

16

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. Convenes de vises Os arquivos de template das vises so chamados depois das funes que os controladores mostram, 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 proteo 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 /app/controllers/people_controller.php Template da Viso: encontrado em /app/views/people/index.ctp

em

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 a 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, disponvel na parte de Exemplos deste manual.

Desenvolvendo com CakePHP

17

Parte III.
Requisitos

Desenvolvendo com CakePHP

Servidor HTTP. Apache com mod_rewrite preferido, mas no obrigatrio. PHP 4.3.2 ou superior. Sim! CakePHP funciona com PHP 4 e PHP 5.

Tecnicamente um banco de dados no obrigatrio, mas ns imaginamos que a maioria das aplicaes iro utilizar um. CakePHP suporte uma variedade de banco de dados: MySQL (4 ou superior); PostgreSQL; Firebird DB2; Microsoft SQL Server; Oracle; SQLite; ODBC; ADOdb.

Preparativos para instalao


Baixando o CakePHP H duas maneiras de pegar uma cpia do CakePHP, Primeiro: voc pode baixar o arquivo (zip/tar.gz/tar.bz2) ou voc pode baixar o cdigo do repositrio SVN. Para pegar a cpia estvel, visite o site http://www.cakephp.org. L haver um link chamado Download Now! para baixar. Os arquivos do CakePHP tambm so armazenados no CakeForge e voc pode visitar a pgina do projeto no site http://cakeforge.org/projects/cakephp. Se voc quer os arquivos mais atuais, verifique no site http://cakephp.org/downloads/index/nightly e vers a ltima verso estvel, porm nem sempre a ltima release. Nestas verses incluem correes entre releases. Ou seja, so verses intermedirias entre releases, mas que so estveis. Para pegar os arquivos direto do https://svn.cakephp.org/repo/branches/1.2.x.x. repositrio SVN, conecte-se em

Permisses O CakePHP usa o diretrio /app/tmp para diversas operaes. Descritivos dos modelos, fazer cache de vises e informaes das sesses so alguns exemplos. Assim, tenha certeza que o diretrio /app/tmp na instalao do seu cake permite escrita pelo usurio do servidor de web.

Desenvolvendo com CakePHP

18

Instalao
Instalando o CakePHP pode ser feito simplesmente descompactando o contedo no seu servidor web ou de forma mais complexa e flexvel, do jeito que voc preferir. Esta seo vais falar de trs maneiras de instalar o CakePHP: desenvolvimento, produo e avanada. Desenvolvimento: fcil para comear, URL dos seus aplicativos incluem o diretrio de instalao do CakePHP e menos seguro; Produo: Requer maior habilidade para configurar o servidor web, porm mais seguro e com URLs mais amigveis; Avanada: Com algumas configuraes, permite voc colocar os diretrios do CakePHP em diferentes locais do sistema, possibilitando compartilhar o ncleo do CakePHP entre diversas aplicaes.

Desenvolvimento Apenas coloque seus arquivos do CakePHP no diretrio pblico do seu servidor web (normalmente htdocs, www, public_html). Por exemplo, assumindo que o diretrio pblico do seu servidor web seja /var/www/html, os arquivos devem ficar desta maneira: /var/www/html o /cake_1_2 /app /cake /docs /index.php /vendors

Para ver a sua aplicao CakePHP, entre no link http://www.exemplo.com/cake_1_2/. Produo Para utilizar-se do modelo de produo, voc precisar ter privilgios de acessar o diretrio pblico do servidor web. Escolhendo o modo de produo significa que todo o domnio age como um nico pedido CakePHP. A disposio dos arquivos no modo de produo fica da seguinte maneira: /pasta_para_o_cake/ o /app /webroot (este diretrio deve ser seu diretrio pblico do servidor web) o /cake o /docs o /index.php o /vendors

Se sua aplicao est hospedada no Apache, a diretiva DocumentRoot para seu domnio deve ficar assim:
DocumentRoot /pasta_para_o_cake/app/webroot

Desenvolvendo com CakePHP

19

Para ver sua aplicao CakePHP, entre no link http://www.exemplo.com.br. Instalao avanada Aqui esto algumas situaes que voc escolhe o lugar onde os diretrios do CakePHP vo ficar no seu sistema. Isto pode ser por causa de uma restrio do sistema ou para compartilhar as bibliotecas entre diferentes aplicaes. Esta seo descreve como espalhar seus diretrios dos CakePHP no sistema. Primeiro, note que h trs partes principais da sua aplicao CakePHP: 1. As bibliotecas do ncleo do CakePHP, em /cake; 2. O cdigo da sua aplicao, em /app; 3. Os arquivos pblicos da sua aplicao, normalmente em /app/webroot. Cada um desses diretrios pode ser colocado em qualquer lugar do seu sistema, com exceo do webroot, que precisa estar acessvel pelo servidor web. Voc pode mover a pasta webroot para fora do diretrio da sua aplicao (app), desde que informe ao Cake onde voc vai colocla. Para configurar sua instalao do Cake, ns vamos ter que fazer algumas alteraes no arquivo /app/webroot/index.php. Aqui existem trs constantes que precisaremos editar: ROOT, APP_DIR e CAKE_CORE_INCLUDE_PATH. ROOT deve ser configurada para informar o diretrio onde sua aplicao se encontra, ou seja, onde est a pasta app; APP_DIR deve ser configurada para informar qual a pasta app; CAKE_CORE_INCLUDE_PATH deve ser configurada para informar o diretrio onde esto as bibliotecas do CakePHP (a pasta cake).

Vamos fazer um exemplo para que voc veja como funciona a instalao avanada na prtica. Imagine que eu quero que a aplicao funcione como segue: As bibliotecas do CakePHP devero ser colocadas em /usr/lib/cake; O diretrio pblico da minha aplicao (webroot) deve ser em /var/www/meusite; O diretrio da aplicao deve ser /home/eu/meusite.

Com estas configuraes, eu preciso editar o meu arquivo webroot/index.php (que no final deve estar em /var/www/meusite/index.php, neste exemplo) e ver o seguinte:
if (!defined('ROOT')) { define('ROOT', DS.'home'.DS.'eu'); } if (!defined('APP_DIR')) { define ('APP_DIR', 'meusite'); } if (!defined('CAKE_CORE_INCLUDE_PATH')) { define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib'.DS.'cake');

/app/webroot/index.php (parcialmente, comentrios foram removidos)

Desenvolvendo com CakePHP

20

recomendado que voc use a constante DS no lugar das barras para entre os diretrios. Isso previne que no cause erro quando se use a aplicao em sistemas operacionais diferentes, tornando seu cdigo mais portvel. Caminho de classes adicionais Em algumas ocasies interessante voc compartilhar as classes do MVC entre as aplicaes no mesmo sistema. Se voc quer um mesmo controller para mesma aplicao, voc pode usar o arquivo bootstrap.php do CakePHP para adicionar estas classes adicionais. No bootstrap.php, defina algumas variveis com nomes especiais para fazer com que o CakePHP olhe nestes diretrios a procura da sua classe:
$viewPaths $controllerPaths $modelPaths $helperPaths $componentPaths $behaviorPaths = = = = = = array(); array(); array(); array(); array(); array();

Cada um dessas variveis especiais pode ser um conjunto na array com o diretrio absoluto onde esto s classes que voc desejar. Tenha certeza que cada diretrio especificado inclua as barras com DS. Apache e mod_rewrite Enquanto o CakePHP construdo para trabalhar com o mod_rewrite e vimos que muitos usurios apanham para conseguir fazer isto funcionar nos seus sistemas, ns lhe daremos algumas dicas que voc pode tentar para tentar rodar corretamente: Tenha certeza que o override est habilitado no .htaccess. Em seu httpd.conf, voc deve olhar na seo que define seu Directory no servidor. Tenha certeza que AllowOverride est configurado como All para o diretrio correto de DocumentRoot; Tenha certeza que voc est editando o httpd.conf do sistema antes da configurao do usurio ou do site em especfico; Tenha certeza que o arquivo .htacess est na pasta do CakePHP. Em alguns sistemas operacionais ele pode ficar oculto na hora de mover devido a interpretarem o . como sinnimo de ocultamento. Tenha certeza que sua cpia do CakePHP do site ou repositrio oficial do CakePHP e que foi extrado corretamente; Tenha certeza que voc est carregando o mod_rewrite corretamente. Voc pode ver algo como LoadModule rewrite_module libexec/httpd/mod_rewirte.so e AddModule mod_rewrite.c no seu httpd.conf; Se voc est instalando no diretrio do usurio (http://exemplo.com.br/~username), voc ter que modificar o arquivo .htaccess no diretrio da base da instalao do CakePHP. Apenas adicione a linha RewriteBase /~meuusername/.

Comece agora! Tudo bem, vamos ver o CakePHP em ao. Dependendo de qual opo de instalao voc utilizou, acesse no seu navegador o link http://exemplo.com.br ou http://exemplo.com.br/cake_instalado/. Neste ponto, voc ver a pgina padro do CakePHP e a mensagem do estado da configurao do seu banco de dados.

Desenvolvendo com CakePHP

21

Parabns! Voc j pode criar sua primeira aplicao CakePHP.

Configurao
Configurao da base de dados O CakePHP espera que os detalhes de configurao da base de dados estejam no arquivo app/config/database.php. Um exemplo de configurao da base de dados pode ser encontrado em app/config/database.php.default. A configurao final deve ser parecida com o exemplo abaixo.
var $default = array('driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'usuarioDB', 'password' => 'senhaDB', 'database' => 'basededados', 'prefix' => '');

Exemplo de configurao da base de dados A conexo $default usada a menos que outra configurao seja especificada pela propriedade $useDbConfig em um model. Por exemplo, se minha aplicao tiver uma base de dados adicional do legacy alm do padro, eu poderia us-la em meus models criando uma nova conexo da base de dados de $legacy similar a configurao $default, e ajustando a var $useDbConfig = 'legacy'; nos models apropriados. Preencha corretamente os pares de chave/valor na configurao para atender melhor s suas necessidades.
Tabela 2. Configuraes da base de dados

Chave driver

persistent host login password database prefix (opcional) port (opcional) enconding Indica qual caractere definido ser usado para enviar indicaes SQL ao servidor. schema Usado em instalaes de base de dados PostgreSQL para especificar qual schema usar. Note que as configuraes de prefixo so para as tabelas, no para os models. Por exemplo, se voc criou um relacionamento entre as tabelas Apple e Flavor, o nome ser prefixo_apples_flavors (no prefixo_apples_prefixo_flavors), isso se sua opo de prefixo estiver como 'prefixo_'.

Valor O nome do driver da base de dados para esta configurao. Exemplos: mysql, postgres, sqlite, pear-drivername, adodb-drivername, mssql, oracle, ou odbc. Se usar ou no uma conexo persistente com a base de dados. O nome do servidor da base de dados (ou endereo IP). O usurio desta conta. A senha desta conta. O nome da base de dados que esta conexo ir usar. Esta string ser adicionada como prefixo no nome de todas tabelas de sua base de dados.Se suas tabelas no possuem prefixo, deixe esta string vazia. A porta TCP ou socket Unix usado para conectar com o servidor.

Desenvolvendo com CakePHP

22

A partir deste ponto, voc deve dar uma olhada nas Convenes CakePHP, mostradas neste manual. A nomenclatura correta para suas tabelas (e o nome de algumas colunas) pode livrar de algumas implementaes e configuraes desnecessrias. Configurao do ncleo As classes de configurao Classes de configurao Variveis de configurao do ncleo Constantes de configurao Configurao de rotas (Routes) Routes uma funcionalidade que mapeia URLs em aes do controller. Foi adicionado ao CakePHP para tornar URL amigveis mais configurveis e flexveis. No obrigatrio o uso do mod_rewrite para usar routes, mas usando-o far sua barra de endereos muito mais limpa e arrumada. Routes no CakePHP 1.2 foi ampliada e pode ser muito mais poderosa. 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 parmetros para suas aes no controller usando a prpria URL.
URL para a rota padro: http://examplo.com/controller/action/param1/param2/param3

A URL /noticias/ler mapeia para a ao ler() do controller Noticias (NoticiasController), e /produtos/verInformacoes mapeia para a ao view_informacoes() 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. 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

Desenvolvendo com CakePHP

23

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

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') )

Inflexo personalizada As convenes de nomenclatura do Cake podem ser realmente legais. Voc pode nomear sua tabela big_boxes, seu model BigBox, seu controller BigBoxesController e tudo isso funciona em conjunto automaticamente. A maneira que o CakePHP usa para associar todas juntas atravs da utilizao de inflections (inflexes), que transformam as palavras do singular em plural e vice-versa. Existem ocasies (especialmente para nossos amigos que no falam ingls - nosso caso), onde voc pode rodar o inflector do CakePHP (a classe que pluraliza, singulariza, camelCases e under_scores) e no funcionar como voc gostaria. Se o CakePHP no reconhecer seu Foci ou Fish, editando o arquivo de configurao personalizada de inflexes voc poder indicar seus casos especiais. O arquivo de configurao encontrado em /app/config/inflections.php. Neste arquivo, voc ir encontrar seis variveis. Cada uma permite voc fazer o ajuste fino das inflections do CakePHP. Variveis do inflections.php $pluralRules Descrio Este array contm regras de expresses regulares para pluralizar casos especiais. A chave do array so os patterns e o valor so as substituies.

Desenvolvendo com CakePHP

24

$uninflectedPlural

Um array que contm palavras que no precisam ser alteradas quando passadas para o plural (lpis, etc.). $irregularPlural Um array que contm palavras e seus plurais. A chave do array contm a forma no singular e o valor a forma no plural. Este array deve ser usado para guardar palavras que no seguem as definies em $pluralRules. $singularRules Similar a $pluralRules, contm as regras para singularizar as palavras. $uninflectedSingular Similar a $uninflectedPlural, contm as palavras que no contm forma no singular. Por padro, este array tem o mesmo valor de $uninflectedPlural. $irregularSingular Similar a $irregularPlural, contm as palavras que possuem apenas a forma singular. A verso para lngua portuguesa do inflections.php pode ser encontrada nos apndices, com o ttulo Inflexo em portugus. Configurao de inicializao (bootstrap)

Controllers (Controladores)
Introduo Um controller (ou controlador) usado para gerenciar a lgica para uma parte de sua aplicao. Mais comumente, controllers so usados para gerenciar a lgica de um nico model. Por exemplo, se voc est construindo um site para uma padaria online, voc pode ter um ReceitasController e um IngredientesController gerenciando suas receitas e seus ingredientes. No CakePHP, controllers so nomeados de acordo com o model que manipulam, no plural. O model Receita manipulado pelo ReceitasController, o model Produto manipulado pelo ProdutosController, e por a vai. Seus controllers de aplicao so classes que estendem a classe CakePHP AppController, a qual por sua vez estende a classe ncleo Controller. A classe AppController pode ser definida em app/app_controller.php e deve conter mtodos que so compartilhados entre todos os seus controllers. A classe AppController estende o Controller que uma classe padro da biblioteca CakePHP. Controllers podem incluir qualquer nmero de mtodos que so geralmente referidos como actions (aes). Actions so mtodos do controlador usados para mostrar views (vises). Uma action um nico mtodo de um controller. O dispatcher (despachante) do CakePHP chama actions quando uma requisio casa uma URL com uma action do controller. Retornando ao nosso exemplo da padaria online, nosso ReceitasController pode conter as actions ver(), compartilhar() e buscar(). O controller poderia ser encontrado em app/controllers/receitas_controller.php e poderia conter:
<?php class ReceitasController extends AppController { function ver($id) { // a lgica da action vai aqui... }

Desenvolvendo com CakePHP

25

function compartilhar($cliente_id, $receita_id) { // a lgica da action vai aqui... } function buscar($busca) { // a lgica da action vai aqui... } } ?>

app/controllers/receitas_controller.php Para que voc possa usar o controller de forma mais efetiva em sua aplicao, vamos cobrir alguns dos principais atributos e mtodos fornecidos pelos controllers do CakePHP. Atributos Para uma lista completa de atributos do controller e suas descries visite a API do CakePHP. D uma olhada http://api.cakephp.org/1.2/classController.html. $name Usurios PHP4 devem iniciar suas definies de controllers usando o atributo $name. O atributo $name deve conter o nome do controller. Geralmente apenas a forma plural do nome do model. Isso cuida de alguns dos problemas de nomes de classe do PHP4 e ajuda o CakePHP a encontrar os nomes das coisas.
<?php class ReceitasController extends AppController { var $name = 'Receitas'; } ?>

Exemplo de uso do atributo $name do controller $components, $helpers e $uses Os prximos atributos de controller usados com maior freqncia dizem ao CakePHP que helpers (ajudantes), components (componentes), e models voc usar junto com o controller atual. Usar esses atributos disponibiliza essas classes MVC para o controller como variveis de classe ($this->NomeDoModel, por exemplo). Por favor, perceba que cada controller tem algumas dessas classes disponveis por padro, ento voc pode nem mesmo ter que configurar o seu controller. Controllers tem por padro seu model principal disponvel. Nosso ReceitasController ter o model Receita disponvel em $this->Receita, e nosso ProdutosController tambm tem acesso ao model Produto em $this->Produto. Os helpers Html e Session esto sempre disponveis por padro, assim como o component Session. Para aprender mais sobre essas classes, lembre-se de dar uma olhada em suas repectivas sesses mais a frente nesse manual.

Desenvolvendo com CakePHP

26

Vamos ver como chamar um controller CakePHP no qual voc planeja usar classes MVC adicionais.
<?php class ReceitasController extends AppController { var $name = 'Receitas'; var $uses = array('Receita', 'Usurio'); var $helpers = array('Html', 'Ajax'); var $components = array('Session', 'Email'); } ?>

Quando estiver definindo esses atributos, tenha certeza de incluir as classes padro (como Html no array $helpers, por exemplo) se voc pretende us-los. Relativo pgina: $layout e $pageTitle Alguns poucos atributos existem nos controllers CakePHP que do maior controle sobre como suas views so embutidas em um layout. O atributo $layout pode conter o nome do layout salvo em /app/views/layouts. Voc especifica um layout atribuindo ao atributo $layout o nome do arquivo de layout menos a extenso .ctp. Se esse atributo no for definido, o CakePHP renderiza o layout default (padro). Se voc no definiu um em /app/views/default.ctp, o layout default do ncleo do CakePHP ser renderizado.
<?php class RecipesController extends AppController { function quickSave() { $this->layout = 'ajax'; } } ?>

Usando $layout para definir um layout alternativo O atributo $pageTitle do controller torna possvel definir o ttulo da pgina renderizada. Para que isso funcione apropriadamente, seu layout precisa ter embutido a varivel $title_for_layout entre as tags <title> no cabealho do documento HTML. Apenas atribua $pageTitle a string que voc quer ver no <title> do seu documento. Atributos dos parmetros ($params) Parmetros do controller esto disponveis em $this->params no seu controller CakePHP. Essa varivel usada para dar acesso informao sobre a requisio atual. O uso mais comum do $this->params obter acesso informao que foi enviada ao controller via operaes POST ou GET. $this->params['form']

Desenvolvendo com CakePHP

27

Qualquer dado do POST de qualquer formulrio guardado aqui, incluindo tambm informao encontrada em $_FILES. $this->params['bare'] o Guarda 1 se o layout atual est vazio, 0 se no. $this->params['isAjax'] o Guarda 1 se o layout atual 'ajax', 0 se no. Essa varivel s configurada se o component RequestHandler est sendo usado no controller. $this->params['controller'] o Guarda o nome do controller atual manipulando a requisio. Por exemplo, se a URL /posts/ver/1 foi requisitada, $this->params['controller'] ser igual 'posts'. $this->params['action'] o Guarda o nome da action atual manipulando a requisio. Por exemplo, se a URL /posts/ver/1 requisitada, $this->params['action'] ser igual 'ver'. $this->params['pass'] o Guarda a query string GET passada com a requisio atual. Por exemplo, se a URL /posts/ver/?var1=3&var2=4 foi requisitada, $this->params['pass'] ser igual '?var1=3&var2=4'. $this->params['url'] o Guarda a URL atual requisitada, com os pares chave-valor das variveis GET. Por exemplo, se a URL /posts/view/?var1=3&var2=4 foi chamada, $this>params['url'] conter:

[url] => Array ( [url] => posts/view [var1] => 3 [var2] => 4 )

$this->data o Usado para manipular os dados POST enviados dos formulrios FormHelper ao controller.

// O FormHelper usado para criar um elemento form: $form->text('Usuario.primeiro_nome'); // Quando rederizado, se parece com: <input name="data[Usuario][primeiro_nome]" value="" type="text" /> // Quando o formulrio enviado para o controller via POST, // os dados so mostrados em $this->data // O primeiro nome pode ser encontrado aqui: $this->data['Usuario']['primeiro_nome'];

Outros atributos Ainda que voc possa dar uma olhada nos detalhes de todos os atributos de controllers na API, existem outros atributos de controllers que merecem suas prprias sesses no manual.

Desenvolvendo com CakePHP

28

O atributo $cacheAction serve para criar cache das views, e o atributo $paginate usado para criar a paginao padro para o controller. Para mais informao sobre como usar esses atributos, d uma olhada em suas respectivas sesses mais a frente nesse manual. Mtodos Para uma lista completa de mtodos do controller e suas descries visite a API CakePHP. D uma olhada http://api.cakephp.org/1.2/class_controller.html. Interagindo com as vises set(string $var, mixed $value) O mtodo set() a principal forma de enviar dados do seu controller para sua view. Uma vez que voc usou set(), a varivel pode ser acessada na sua view.
// Primeiro voc passa os dados do controller: $this->set('cor', "pink"); // Ento, na view, voc pode utilizar os dados: <p>Voc selecionou a cor <?php echo $cor; ?> para colorizar o cake.</p>

Exemplo de uso do set() O mtodo set() tambm pega um array associativo como seu primeiro parmetro. Esse pode ser geralmente um caminho rpido para atribuir um grupo de informaes para a view. Perceba que os ndices de seu array sofrero inflection antes de serem atribudos view ('indice_com_underline' se torna 'indiceComUnderline', etc.):
$dados = array( 'cor' => 'pink', 'tipo' => 'aucar', 'preco_base' => 23.95 ); // fazem $cor, $tipo, e $precoBase // disponveis na view: $this->set($dados);

render(string $action, string $layout, string $file)

O mtodo render() automaticamente chamado ao final de cada action do controller requisitada. Esse mtodo executa toda a lgica da view (usando dados que voc forneceu usando o mtodo set()), insere a view dentro do layout e o serve de volta para o usurio final. O arquivo de view padro renderizado determinado por conveno. Se a action buscar() do ReceitasController requisitada, o arquivo de view /app/views/receitas/buscar.ctp ser renderizado.

Desenvolvendo com CakePHP

29

Ainda que o CakePHP v automaticamente cham-lo (a menos que voc configure $this>autoRender para false) depois de cada lgica de action, voc pode us-lo para especificar um arquivo de view alternativo configurando o nome da action no controller usando $action. Voc pode tambm especificar um arquivo alternativo um terceiro parmetro, $file. Quando usar $file, lembre-se de utilizar um pouco das constantes globais do CakePHP (como a VIEWS). O parmetro $layout permite especificar o layout na qual a view renderizada. Fluxo de controle redirect(string $url, integer $status, boolean $exit) O mtodo de controle de fluxo que voc vai usar com maior freqncia o redirect(). Esse mtodo pega seu primeiro parmetro na forma de uma URL relativa CakePHP. Quando um usurio fez uma compra com sucesso, voc provavelmente ir redirecion-lo para a tela de recibo.
function comprar() { // A lgica para finalizar a compra vai aqui... if($sucesso) { $this->redirect('/compras/obrigado'); } else { $this->redirect('/compras/confirmar'); } }

Exemplo de uso do redirect() O segundo parmetro do redirect() lhe permite definir um cdigo de status HTTP para acompanhar o redirecionamento. Voc pode querer usar 301 (movido permanentemente) ou 303 (veja outro), dependendo da natureza do redirecionamento. Esse mtodo no chama exit() depois de redirecionar a menos que voc configure o terceiro parmetro para true. flash(string $message, string $url, integer $pause)

Similarmente, o mtodo flash() usado para direcionar o usurio para uma nova pgina depois de uma operao. O mtodo flash() diferente pelo fato de mostrar uma mensagem antes de passar o usurio para uma outra URL. O primeiro parmetro deve guardar a mensagem a ser mostrada, e o segundo parmetro uma URL relativa CakePHP. CakePHP vai mostrar a mensagem na varivel $message, por um tempo definido em segundos na varivel $pause antes de direcionar o usurio. Para mensagens flash dentro da pgina, d uma olhada no mtodo setFlash() do component Session. Callbacks Controllers CakePHP vem com callbacks para inserir lgica exatamente antes ou depois das actions serem rederizadas.

Desenvolvendo com CakePHP

30

beforeFilter()

Essa funo executada antes de qualquer action no controller. o lugar ideal para checar uma sesso ativa ou inspecionar permisses. beforeRender()

Chamada aps a lgica da action do controller, mas antes da view ser renderizada. Esse callback no usado geralmente, mas pode ser necessrio se voc est chamando render() manualmente antes do final de uma dada action. afterFilter()

Chamada depois de toda action do controller. afterRender()

Chamada depois que uma action tiver sido renderizada. Outros mtodos constructClasses() Esse mtodo carrega os models requeridos pelo controller. Esse processo de carregamento feito pelo CakePHP normalmente, mas o mtodo uma boa quando estiver acessando controllers de diferentes perspectivas. Se voc precisa do CakePHP em um script de linha de comando ou outro uso de fora, constructClasses() pode ser uma boa. referrer()

Retorna a URL referida pela requisio atual. disableCache()

Usado para dizer ao navegador do usurio no fazer cache dos resultados na requisio atual. Isso diferente do cache da view, coberto no captulo anterior. postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

Use esse mtodo para tornar um grupo de dados enviados por POST (de inputs compatveis com o helper Html) em um grupo de condies de busca para o model. Essa funo oferece um atalho rpido para criar lgica de busca. Por exemplo, um usurio administrativo pode querer ser capaz de buscar compras para saber quais itens precisam ser enviados. Voc pode criar um rpido formulrio baseado no model Compra. Ento a action do controller pode usar os dados enviados do formulrio para criar as condies de busca.
function index() { $c = $this->Compras->findAll($this->postConditions($this->data)); $this->set('compras', $c); }

Desenvolvendo com CakePHP

31

Se $this->data['Compra']['destino'] igual a Padaria da Cidade Velha, postConditions converte essa condio para um array compatvel para uso no mtodo NomeDoModel>findAll(). Nesse caso, array(Compra.destino => Padaria da Cidade Velha). Se voc quer usar um operador SQL diferente entre os termos, fornea-os usando o segundo parmetro.
/* Contedo de $this->data array( 'Compra' => array( 'num_de_itens' => '4', 'fornecedor' => 'Trigo Integral LTDA' ) ) */ // Vamos pegar compras que tem ao menos 4 itens e contm 'Trigo Integral LTDA' $c = $this->Compra->findAll($this->postConditions( $this->data, array('>=', 'LIKE') ));

O ndice nas especificaes de operadores a ordem das colunas no array $this->data. J que num_de_itens o primeiro, o operador >= aplica-se a ele. O terceiro parmetro lhe permite dizer ao CakePHP que operador booleano SQL usar entre as condies de busca. Strings com 'AND', 'OR', e 'XOR' so todos valores vlidos. Finalmente, se o ltimo parmetro est configurado para true, e o parmetro $op um array, os campos no includos em $op no sero includos nas condies retornadas. cleanUpFields(string $modelClass = null)

Esse mtodo de convenincia concatena as vrias partes de datas em $this->data antes de salvar. Se voc tem inputs de data do helper Form, esse mtodo concatena o ano, ms, dia e hora em uma string mais compatvel com banco de dados. Esse mtodo usa o model padro do controller (por ex.: o model Cookie para o controller CookiesController) como alvo para a concatenao, mas uma classe alternativa pode ser usada como primeiro parmetro. paginate()

Esse mtodo usado para paginar os resultados divididos pelos seus models. Voc pode especificar tamanhos de pginas, condies de busca do model e mais. Detalhes sobre esse mtodo mais a frente. D uma olhada no captulo de paginao mais a frente nesse manual. requestAction(string $url, array $options)

Essa funo chama uma action de controller de qualquer lugar e retorna os dados dessa action. A $url passada uma URL relativa ao CakePHP

Desenvolvendo com CakePHP

32

(/nomedocontroller/nomedaaction/parametros). Se o array $options incluir um valor de returno. AutoRender automaticamente configurada para true para a action do controller, tendo a requestAction te levando para a view totalmente renderizada. Nota: apesar de ser possvel usar requestAction() para pegar uma view totalmente renderizada, a perda performance que voc obtm passando por toda a camada da view novamente na realidade no faz valer a pena. O mtodo requestAction() melhor usado em conjunto com elements - como um caminho para enviar lgica de negcio para um element antes da renderizao. Primeiro, vamos ver como pegar dados da action do controller. Primeiro, ns precisamos criar a action do controller que retorna algum dado que precisamos em vrios lugares atravs da aplicao:
// Aqui est nosso controller simples: class UsuariosController extends AppController { function pegarListaDeUsuarios() { return $this->Usuario->findAll("Usuario.ativo = 1"); } }

Imagine que ns precisamos criar uma simples tabela mostrando os usurios ativos no sistema. Ao invs de duplicar o cdigo de gerao de lista em outro controller, ns podemos pegar dados do UsuariosController->pegarListaDeUsuarios() ao invs de usar requestAction();
class ProdutosController extends AppController { function mostrarProdutosDoUsuario() { $this->set( 'usuarios', $this->requestAction('/usuarios/pegarListaDeUsuarios') ); // Agora a varivel $usuarios na view vai ter dados do // UsuariosController::pegarListaDeUsuarios(). } }

Se voc tem um element na sua aplicao que no esttico, voc pode querer usar requestAction() para enviar lgica equivalente do controller para o element a medida em que voc o injeta nas suas views. Apesar de elements sempre tem acesso a qualquer varivel da view que o controller passou, essa uma forma de passar dados para o element vindos de outro controller. Se voc criou uma action do controller que fornece a lgica necessria, voc pode pegar dados e pass-lo para o segundo parmetro do mtodo renderElement() da view usando requestAction().
<?php echo $this->renderElement( 'usuarios', $this->requestAction('/usuarios/pegarListaDeUsuarios') );

Desenvolvendo com CakePHP

33

?>

Se o array '$options' contiver um valor return, a action do controller ser renderizada dentro de um layout vazio e retornada. Dessa forma, a funo requestAction() til tambm em situaes Ajax onde um pequeno elemento de uma view precisa ser preenchido antes ou durante uma atualizao Ajax.

Components (Componentes)
Introduo Components (Componentes) so pacotes com funes lgicas que so usadas para serem compartilhadas entre os controllers. Se voc est querendo copiar e colar coisas entre os controllers, voc pode criar funcionalidades em components para isso. O CakePHP j vem com um conjunto de components 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 components ser explicado em outros captulos. Por enquanto, mostraremos apenas como criar seus prprios components. Criando components ajuda a manter o cdigo do controller limpo e permite que voc reuse o cdigo entre os projetos ou controllers. Construindo componentes personalizados Suponha que sua aplicao online precisa utilizar funes complexas de matemtica em diversas partes da aplicao. Poderamos, ento, criar um component para que esta lgica seja compartilhada entre diversos controllers. O primeiro passo criar um arquivo para o component e uma classe. Crie o arquivo em /app/controllers/components/math.php. A estrutura bsica do arquivo do component similar a apresentada abaixo.
<?php class MathComponent extends Object { function doComplexOperation($amount1, $amount2) { return $amount1 + $amount2; } } ?>

Quando seu component estiver criado, ns podemos utiliz-lo nos controllers da aplicao colocando o nome do component no vetor da varivel $components:
// Isso faz com que o novo component possa ser acessado usando $this->Math

Desenvolvendo com CakePHP

34

var $components = ('Math', 'Session');

Acessando classes do MVC de dentro dos componentes Para ter acesso a instncia do controlador dentro do seu novo component, voc precisa implementar o mtodo startup(). Este um mtodo especial que trs a referncia do controller como primeiro parmetro e esta funo chamada automaticamente depois da funo beforeFilter() do controller. Se por alguma razo voc no quer que o mtodo startup() seja executado quando o controller instanciado, defina o valor da varivel $disableStartup para true. Se voc deseja inserir uma lgica antes que o controller seja chamado, use o mtodo initialize() no seu component.
<?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 components dentro de um component personalizado. Para isso, basta criar a varivel $components na classe (assim como voc faria em um controller) como um array que contenha os nomes dos components que voc deseja utilizar.

Models (Modelos)
Introduo Campos mgicos Atributos Mtodos Associaes Introduo Um dos mais poderosos recursos do CakePHP o mapeamento relacional fornecido pelos models. No CakePHP, as ligaes entre os models so manipuladas atravs de associaes.

Desenvolvendo com CakePHP

35

Definir as relaes entre os diversos objetos em sua aplicao deve ser um processo natural. Por exemplo: em uma base de dados de receitas, uma receita pode ter muitas opinies, opinies tm um nico autor, e os autores podem ter muitas receitas. Definir a forma como estas relaes trabalham permite o acesso aos seus dados de uma forma intuitiva e poderosa. O objetivo desta seo para mostrar-lhe como planejar, definir, utilizar as associaes entre os models no CakePHP. Porque a forma mais comum de armazenamento em aplicaes web uma base relacional, a maior parte daquilo que ns vamos cobrir neste manual ser, em um banco de dados com um contexto relacionado. Os quatro tipos de associao no CakePHP so: hasOne, hasMany, belongsTo, e hasAndBelongsToMany (HABTM).
Tabela 3. Tipos de associaes possveis

Tipo de associao Exemplo hasOne Um usurio tem um perfil. hasMany Usurios em um sistema pode ter vrias receitas. belongsTo Uma receita pertence a um usurio. hasAndBelongsToMany Receitas tem, e pertencem a muitas tags1. Associaes so definidas atravs da criao de uma classe varivel com o nome da associao que voc est definindo. A classe varivel s vezes pode ser to simples como uma string, mas pode ser to completa como um array multidimensional utilizado para definir associaes especficas.
<?php class User extends AppModel { var $name = 'User'; var $hasOne = 'Profile'; var $hasMany = array( 'Recipe' => array( 'className' => 'Recipe', 'conditions' => 'Recipe.approved = 1', 'order' => 'Recipe.created DESC' ) ); } ?>

hasOne Vamos criar um model chamado User que tenha a relao hasOne com o model Profile. Primeiro, suas tabelas da base de dados devem ser introduzidas corretamente. Para uma relao hasOne trabalhar, uma tabela tem de incluir uma chave estrangeira que aponta para um registro na outra. Neste caso, a tabela profiles dever conter um campo chamado user_id. O padro bsico :
HasOne: os *outros* models contm a chave estrangeira.
1

Tag: palavra-chave ou etiqueta, neste contexto significa palavra-chave.

Desenvolvendo com CakePHP

36

Apple hasOne Banana => bananas.apple_id User hasOne Profile => profiles.user_id Doctor hasOne Mentor => mentors.doctor_id

O arquivo do model User ser salvo em /app/models/user.php. Para definir a associao User hasOne Profile, adicione a propriedade $hasOne a classe do model. Lembre-se de ter um model Profile em /app/models/profile.php, ou a associao no ir funcionar.
<?php class User extends AppModel { var $name = 'User'; var $hasOne = 'Profile'; } ?>

Existem duas formas de descrever essa relao nos seus models. O mtodo mais simples consiste em definir o atributo $hasOne para uma string contendo o nome da classe do model associado, como fizemos anteriormente. Se voc precisar de mais controle, voc pode definir suas associaes usando um array. Por exemplo, voc pode querer classificar linhas relacionadas em ordem decrescente, de acordo com uma data, ou voc pode querer limitar a associao para incluir apenas alguns registros.
<?php class User extends AppModel { var $name = 'User'; var $hasOne = array( 'Profile' => array( 'className' => 'Profile', 'conditions' => 'Profile.published = 1', 'dependent' => true ) ); } ?>

As possveis chaves do array para associaes hasOne so: className: o nome da classe do model a ser associado ao model atual. Se voc estiver definindo um relacionamento User hasOne Profile, o valor da chave className deve ser igual a 'Profile'; foreignKey: o nome da chave estrangeira encontrada no outro model. Isto especialmente til se voc precisa definir mltiplos relacionamentos hasOne. O valor padro para esta chave o nome no singular do outro model, seguida de _id. conditions: Um fragmento SQL utilizado para filtrar registros relacionados do model. uma boa prtica a utilizao dos nomes dos modelos nos fragmentos SQL: Profile.approved = 1 sempre melhor do que apenas approved = 1.

Desenvolvendo com CakePHP

37

fields: A lista de campos da tabela a serem recuperados quando os dados do model associado so coletados. Retorna todos os campos por padro. dependent: Quando true, e o mtodo delete() do model chamado com o parmetro cascade (cascata) para true, os registros associados do model tambm so apagados. Neste caso, defini-lo true, a excluso do User tambm vai apagar o seu Profile associado. Uma vez que esta associao tenha sido definida, operaes de busca sobre o modelo User tambm vai buscar um registro relacionado de Profile, se existir:
// Exemplo de resultados de uma chamada $this->User->find(); Array ( [User] => Array ( [id] => 121 [name] => Gwoo the Kungwoo [created] => 2007-05-01 10:31:01 ) [Profile] => Array ( [id] => 12 [user_id] => 121 [skill] => Baking Cakes [created] => 2007-05-01 10:31:01 ) )

belongsTo Agora que temos o acesso aos dados do Profile pelo model User, vamos definir uma associao belongsTo no model Profile, a fim de obter acesso aos dados relacionados de User. A associao belongsTo um complemento natural associaes hasOne e hasMany : ele nos permite ver os dados da outra direo. Quando voc estiver fazendo suas tabelas na base de dados, com um relacionamento belongsTo, seguir esta conveno:
belongsTo: O model *atual* contm a chave estrangeira. Banana belongsTo Apple Profile belongsTo User Mentor belongsTo Doctor => bananas.apple_id => profiles.user_id => mentors.doctor_id

Se uma tabela contm uma chave estrangeira, ela faz relacionamento belongsTo.

Podemos definir a associao belongsTo no nosso model Profile em /app/models/profile.php usando a sintaxe de string como segue:
<?php class Profile extends AppModel { var $name = 'Profile'; var $belongsTo = 'User'; }

Desenvolvendo com CakePHP

38

?>

As possveis chaves do array para associaes belongsTo so: className: o nome da classe do model a ser associado ao model atual. Se voc estiver definindo um relacionamento Profile belongsTo User, o valor da chave className deve ser igual a 'User'; foreignKey: O nome da chave estrangeira encontrada no outro model. Isto especialmente til se voc precisa definir mltiplos relacionamentos belongsTo. O valor padro para esta chave o singular do nome do outro model, seguida de '_id'. conditions: Um fragmento SQL utilizado para filtrar registros relacionados do model. uma boa prtica a utilizao dos nomes dos models nos fragmentos SQL: User.active = 1 sempre melhor do que apenas active = 1. fields: A lista de campos da tabela a serem recuperados quando os dados do model associado so coletados. Retorna todos os campos por padro. Uma vez que esta associao tenha sido definida, as operaes de busca sobre o model Profile tambm vai buscar um registro ligado ao registro de User se existir:
// Exemplo de resultados de uma chamada $this->Profile->find(). Array ( [Profile] => Array ( [id] => 12 [user_id] => 121 [skill] => Baking Cakes [created] => 2007-05-01 10:31:01 ) [User] => Array ( [id] => 121 [name] => Gwoo the Kungwoo [created] => 2007-05-01 10:31:01 ) )

hasMany Prximo passo: definir uma associao User hasMany Comment. A associao hasMany nos permitir buscar comentrios de um usurio quando faz uma operao de busca no model User. Quando voc estiver fazendo suas tabelas na base de dados, com um relacionamento hasMany, seguir esta conveno:
hasMany: os *outros* models contm a chave estrangeira. User hasMany Comment Cake hasMany Virtue => Comment.user_id => Virtue.cake_id

Desenvolvendo com CakePHP

39

Product hasMany Option

=> Option.product_id

Podemos definir a associao hasMany no nosso model User /app/models/user.php usando a sintaxe string como segue:
<?php class User extends AppModel { var $name = 'User'; var $hasMany = 'Comment'; } ?>

Ns tambm podemos definir uma relao mais especfica utilizando sintaxe de array:
<?php class User extends AppModel { var $name = 'User'; var $hasMany = array( 'Comment' => array( 'className' => 'Comment', 'foreignKey' => 'user_id', 'conditions' => 'Comment.status = 1', 'order' => 'Comment.created DESC', 'limit' => '5', 'dependent'=> true ) ); } ?>

As possveis chaves do array para associaes hasMany so: className: o nome da classe do model a ser associado ao model atual. Se voc estiver definindo um relacionamento User hasMany Comment, a chave className deve ser igual Comment. foreignKey: o nome da chave estrangeira encontrada no outro model. Isto especialmente til se voc precisa definir mltiplos relacionamentos hasMany. O valor padro para esta chave o nome do outro model no singular, seguida de _id. conditions: Um fragmento SQL utilizado para filtrar registros no model relacionado. uma boa prtica a utilizao nome do model nos fragmentos SQL: Comment.status = 1 sempre melhor do que apenas status = 1. fields: A lista de campos a serem recuperados quando os dados do model associado so coletados. Retorna todos os campos por padro. order: Um fragmento SQL que define a classificao para a ordem para o retorno de linhas associadas. limit: O nmero mximo de linhas associadas que voc quer que retorne.

Desenvolvendo com CakePHP

40

offset: O nmero de linhas associadas para saltar sobre (dadas as atuais condies e ordem), antes de ir buscar e associar. dependent: Quando true, possvel a eliminao recursiva. Neste exemplo, Os registros de Comment sero apagados quando o seu associado registro de User for excludo. Nota: o segundo parmetro do mtodo Model->delete() deve ser true, a fim de ocorrer a supresso (eliminao) recursiva. finderQuery: Uma completa consulta SQL CakePHP que pode-se usar para buscar registros associados. Isto deve ser utilizado em situaes que exijam muito resultado personalizado. Uma vez que esta associao tenha sido definida, As operaes de busca sobre o model User tambm vai buscar registros relacionados em Comment se existirem:
// Exemplo de resultados de uma chamada $this->User->find(); Array ( [User] => Array ( [id] => 121 [name] => Gwoo the Kungwoo [created] => 2007-05-01 10:31:01 ) [Comment] => Array ( [0] => Array ( [id] => 123 [user_id] => 121 [title] => On Gwoo the Kungwoo [body] => The Kungwooness is not so Gwooish [created] => 2006-05-01 10:31:01 ) [1] => Array ( [id] => 123 [user_id] => 121 [title] => More on Gwoo [body] => But what of the Nut? [created] => 2006-05-01 10:41:01 ) ) )

Uma coisa para se lembrar que voc precisar de um nova associao Comment belongsTo User, a fim de obter os dados de ambos os sentidos. O que temos esboado nesta seo lhe d poderes para obter os dados dos comentrios do usurio. Adicionando a associao Comment belongsTo User no model Comment lhe d poderes para obter os dados do usurio a partir do model Comment - completa a ligao e permitindo que haja o fluxo de informao a partir de qualquer perspectiva de model.

Desenvolvendo com CakePHP

41

hasAndBelongsToMany (HABTM) Tudo bem. Neste ponto, voc j pode chamar voc mesmo de profissional em associaes de models no CakePHP. Voc j est bem versado (experiente) nas trs associaes que ocupam a maior parte das relaes entre objetos. Vamos resolver o ltimo tipo de relacionamento: hasAndBelongsToMany, ou HABTM. Esta associao usada quando voc tem dois models que precisam se juntar, vrias vezes, muitas vezes, de muitas formas diferentes. A principal diferena entre hasMany e HABTM que a ligao entre os modelos em HABTM no exclusiva. Por exemplo, estamos prestes a juntar nosso model Recipe (Receita) com o model Tag usando HABTM. Anexando a tag Italian a minha receita grandma's Gnocci no esgota o registro do Tag. Tambm posso marcar o meu churrasco Honey Glazed Spaghettio's com a tag Italian se eu quiser. Ligaes entre objetos associados com hasMany so exclusivos. Se User hasMany Comment, um comentrio apenas ligado a um usurio especfico. Deixou-se para ganhar. Avancemos. preciso criar uma tabela extra no banco de dados para manipular associaes HABTM. Esta nova tabela deve juntar o nome das tabelas associadas, incluindo os nomes de ambos os models envolvidos, em ordem alfabtica. O contedo da tabela deve ser de pelo menos dois campos, cada um com uma chave estrangeira (que devem ser inteiros) apontando para ambas as chaves primrias dos modelos envolvidos.
HABTM: Requer uma tabela separada que inclui os dois nomes dos models. Nota: O nome da tabela deve estar em ordem alfabtica. Recipe HABTM Tag Cake HABTM Fan Foo HABTM Bar => recipes_tags.recipe_id, recipes_tags.tag_id => cakes_fans.cake_id, cakes_fans.fan_id => bars_foos.foo_id, bars_foos.bar_id

Uma vez que esta nova tabela foi criada, podemos definir a associao HABTM nos arquivos dos models. Estamos indo saltar diretamente a sintaxe array desta vez:
<?php class Recipe extends AppModel { var $name = 'Recipe'; var $hasAndBelongsToMany = array( 'Tag' => array('className' 'joinTable' 'foreignKey' 'associationForeignKey' 'conditions' 'order' 'limit' 'uniq' 'finderQuery' 'deleteQuery' 'insertQuery' ) );

=> => => => => => => =>

'Tag', 'recipes_tags', 'tag_id', 'recipe_id', '', '', '', true, => '', => '', => ''

Desenvolvendo com CakePHP

42

} ?>

foreignKey: O nome da chave estrangeira encontrada no outro model. Isto especialmente til se voc precisa definir mltiplos relacionamentos HABTM. O valor padro para esta chave o nome do outro model no singular, seguida de _id. associationForeignKey: O nome da chave estrangeira encontrada no model atual. Isto especialmente til se voc precisa definir mltiplos relacionamentos HABTM. O valor padro para esta chave o nome do atual model no singular, seguida de _id. conditions: Um fragmento SQL utilizado para filtrar registros no model relacionado. uma boa prtica a utilizao nome do model nos fragmentos SQL: Recipe.status = 1 sempre melhor do que apenas status = 1. fields: A lista de campos a serem recuperados quando os dados do model associado so coletados. Retorna todos os campos por padro. order: Um fragmento SQL que define a classificao para a ordem para o retorno de linhas associadas. limit: O nmero mximo de linhas associadas que voc quer que retorne. offset: O nmero de linhas associadas para saltar sobre (dadas as atuais condies e ordem), antes de ir buscar e associar. dependent: Quando true, possvel a eliminao recursiva. Neste exemplo, Os registros de Comment sero apagados quando o seu associado registro de User for excludo. Nota: o segundo parmetro do mtodo Model->delete() deve ser true, a fim de ocorrer a supresso (eliminao) recursiva. finderQuery, deleteQuery, insertQuery: Uma completa consulta SQL CakePHP que pode-se usar para buscar registros associados. Isto deve ser utilizado em situaes que exijam muito resultado personalizado. Uma vez que esta associao tenha sido definida, operaes de busca sobre o model Recipe (Receita) tambm vai buscar registros relacionados em Tag caso existam:
// Exemplo de resultados de uma chamada $this->Recipe->find(); Array ( [Recipe] => Array ( [id] => 2745 [name] => Chocolate Frosted Sugar Bombs [created] => 2007-05-01 10:31:01 [user_id] => 2346 ) [Tag] => Array (

Desenvolvendo com CakePHP

43

[0] => Array ( [id] => 123 [name] => Breakfast ) [1] => Array ( [id] => 123 [name] => Dessert ) [2] => Array ( [id] => 123 [name] => Heart Disease ) ) )

Lembre-se de definir uma associao HABTM no model Tag se quiser buscar dados do model Recipe, quando se utiliza o model Tag para pesquisas. Salvando dados em tabelas relacionadas (hasOne, hasMany, belongsTo) Ao trabalhar com models associados, importante perceber que ao salvar os dados do model deve sempre ser feita pelo model CakePHP correspondente. Se voc est salvando um novo Post e seus comentrios associados, ento voc deve usar ambos os models Post e Comment durante a operao de salvamento. Se nenhum dos registros do model associado, existem ainda no sistema (por exemplo, voc pretende gravar um novo User com seus respectivos registros de Profile ao mesmo tempo), voc precisa primeiro salvar o primrio, ou model pai. Para ter uma idia de como isso funciona, vamos imaginar que temos uma funo no nosso UsersController que manipula o salvamento de um novo User e seu relacionado Profile. O exemplo mostrado abaixo, a funo ir assumir que voc POSTou dados suficientes (usando o FormHelper) para criar um nico usurio e um nico perfil.
function add() { if (!empty($this->data)) { // Podemos salvar os dados de User // Deve-se estar em $this->data['User'] $this->User->save($this->data); // Agora ns adicionamos a informao que identifica // o usurio da base de dados a $this->data['Profile'] // e salvamos o Profile. // A ID do usurio recm-criado foi definida // em $this->User->id. $this->data['Profile']['user_id'] = $this->User->id; // O salvamento do Profile pode ocorrer no model User // Porque a nossa relao "User hasOne Profile", pode acessar // o model Profile atravs do model User:

Desenvolvendo com CakePHP

44

$this->User->Profile->save($this->data); } }

Como regra geral, quando se trabalha com associaes hasOne, hasMany, e belongsTo. Estas so todas as informaes sobre a sua implementao. A idia bsica obter a chave de um model e coloc-la no campo chave estrangeira do outro. Por vezes, este poderia envolver a utilizao do atributo $id da classe do model aps um save(), mas outras vezes isso pode envolver apenas recolher o ID de um input hidden em um formulrio que apenas tenha sido POSTado a uma funo do controller. Salvando dados em tabelas relacionadas (HABTM) Salvando models que esto associados por hasOne, belongsTo, e hasMany bastante simples: basta voc preencher o campo chave estrangeira com a ID do model associado. Feito isso, basta voc chamar o mtodo save() sobre o model, e tudo fica ligado corretamente. Com HABTM, um pouco complicado, mas temos ido fora da nossa forma a torn-lo o mais simples possvel. Em consonncia (concordncia), juntamente com o nosso exemplo, vamos precisar fazer algum tipo de formulrio que relaciona tags a receitas. Vamos agora criar um formulrio que gera tags, e associ-las a uma lista de receitas existentes. Talvez voc realmente deseje criar um formulrio que cria novas tags e associ-las durante a execuo - mas pelo bem da simplicidade, vamos apenas mostrar-lhe como associ-los e deixlo continuar a partir da. Vamos apenas iniciar com a parte do formulrio que gera uma tag. Lembra-se de nosso original exemplo Recipe HABTM Tags? O mais simples de HTML pode parecer algo como isto:
<?php echo $form->create('Tag');?> <?php echo $form->hidden( 'Recipe.Recipe', array('value' => $recipe_id) ) ?> <p><?php echo $form->input('Tag.name');?></p> <p><?php echo $form->end('Adicionar Tag');?></p> </form>

Ligaes HABTM so formadas por um campo de formulrio, nomeado com o nome do outro model envolvido na associao HABTM. Neste exemplo, voc pode ver o campo hidden 'Recipe/Recipe' cujo valor definido com a ID da receita que queremos relacionar para a tag que ser salva. A funo do controller que trata este formulrio poder ser semelhante a esta:
function add() { // Primeiro, vamos obter a ID da tag atual $this->Tag->recursive = 0; $tag = $this->Tag->findByName($this->data['Tag']['name']); // Voc pode querer criar a tag aqui se no existir, // Mas ns estamos assumindo que ela existe para avanar. :) // Definimos esta ID em $this->data, marcando-a como a

Desenvolvendo com CakePHP

45

// tag que queremos associar. $this->data['Tag']['id'] = $tag['Tag']['id']; // Definimos a ID da receita em $this->data, marcando-a como a // receita que queremos associar. $this->data['Recipe']['Recipe'] = array( $this->data['Recipe']['Recipe'] ); // Salva a associao if ($this->Tag->save($this->data)) { // Faa alguma coisa quando obter sucesso. } }

Voila, dados dos models esto associados. Para analisar: a fim de salvar relacionamentos HABTM, preencher $this->data['OutroModelo']['OutroModelo'] com um array contendo a ID (ou IDs) dos registros que voc deseja associar, e salvar o model atual , certificando-se que $this->data[ModeloAtual]['id'] esteja em vigor. Criando e removendo relaes durante execuo Por vezes, torna-se necessrio criar e destruir associaes no model durante a execuo. Isso pode acontecer por algum nmero de razes: Voc deseja reduzir a quantidade coletada de dados associados, mas todas as suas associaes esto no primeiro nvel de recurso; Voc quer mudar o modo como uma associao definida, a fim de ordenar ou filtrar dados associados.

Esta criao e destruio de associao feita usando os mtodos bindModel() e unbindModel() do model CakePHP. Vamos configurar alguns models, para que possamos ver como bindModel() e unbindModel() trabalham. Ns vamos comear com dois models:
<?php class Leader extends AppModel { var $name = 'Leader'; var $hasMany = array( 'Follower' => array( 'className' => 'Follower', 'order' => 'Follower.rank' ) ); } ?> <?php class Follower extends AppModel { var $name = 'Follower'; } ?>

Desenvolvendo com CakePHP

46

Agora, no LeadersController, podemos usar o mtodo find() do model Leader para buscar um lder e seus seguidores associados. Como voc pode ver acima, a associao em sintaxe de array no model Leader define um relacionamento Leader hasMany Follower. Para fins de demonstrao, vamos usar unbindModel() para remover esta associao em uma funo do controller.
function someAction() { // Isto recupera Lderes, e seus seguidores associados $this->Leader->findAll(); // Vamos remover o hasMany ... $this->Leader->unbindModel( array('hasMany' => array('Follower')) ); // Agora usando a funo find() ir retornar // Lderes, sem os seus seguidores $this->Leader->find(); // NOTA: unbindModel() afeta somente a mais prxima // funo find(). Uma nova chamada find() ser usada // a informao configurada na associao do model. // J utilizando findAll(), aps unbindModel(), // esta vai buscar Lderes com seguidores // associados mais uma vez ... $this->Leader->findAll(); }

Mais um lembrete. Removendo ou adicionando associaes usando bind e unbindModel() s funciona para a prxima operao do model, a menos que o segundo parmetro $reset for escolhido para true. Se o segundo parmetro foi escolhido para true, ao vincular este parmetro, a funes binds, mantm-se em vigor para o restante dos pedidos ou pesquisas. Aqui est a base para o uso padro de unbindModel():
$this->Model->unbindModel( array('associationType' => array('associatedModelClassName')) ); // associationType => O tipo de associao (associatedModelClassName) que voc quer remover. com o outro model

Agora que removida com xito uma associao durante a execuo, vamos adicionar uma. Nossa como de ainda temos Lderes sem princpios necessitamos alguns Princpios associados. O arquivo do model para o nosso model Principle est vazio, com exceo para a declarao var $name. Vamos associar alguns princpios para ao nosso model Leader durante a execuo (mas lembre: apenas servir a prxima operao de busca). Esta funo aparece no LeadersController:
function anotherAction() { // No h "Leader hasMany Principles" no // arquivo do model leader.php, // aqui somente vamos encontrar Lderes.

Desenvolvendo com CakePHP

47

$this->Leader->findAll(); // Vamos usar bindModel() para adicionar uma nova associao // para o model Leader. $this->Leader->bindModel( array('hasMany' => array( 'Principle' => array( 'className' => 'Principle' ) ) ) ); // Agora que est ligado corretamente, // Podemos utilizar uma nica funo find() para buscar // Lderes com seus associados princpios: $this->Leader->findAll(); }

Isto o que voc tem. A base para uso do bindModel() o encapsulamento de uma associao normal dentro de um array cuja chave nomeada aps o tipo de associao que voc est tentando criar:
$this->Model->bindModel( array('associationName' => array( 'associatedModelClassName' => array( // Aqui voc pode usar normalmente as chaves e/ou opes de associao. ) ) ) );

Embora o model recm-vinculado no precise de nenhum tipo de associao na definio do model dentro do arquivo dele, ele ainda precisa ser introduzido corretamente para que a nova associao funcione corretamente. DataSources Behaviors Introduo Usando Behaviors TreeBehavior TranslateBehavior ACLBehavior

Views (Vises)
Templates / Skin Em CakePHP, voc fala com seus usurios atravs da camada das views. A maior parte do tempo, suas views estaro mostrando documentos (x)HTML para os navegadores, mas voc

Desenvolvendo com CakePHP

48

pode tambm precisar servir dados AMF para um objeto Flash, responder a uma aplicao remota via SOAP, ou exportar um arquivo CSV para um usurio. Os arquivos de view do CakePHP so escritos em PHP comum e tem a extenso padro de .ctp (CakePHP Template). Esses arquivos contm toda a lgica de apresentao necessria para transformar os dados recebidos do controller em um formato que est pronto para a audincia. Arquivos de view so guardados em /app/views/, em um diretrio com o nome do controller que usa os arquivos, e nomeado de acordo com a view a qual corresponde. Por exemplo, a action ver() do controller Produtos ser normalmente encontrada em /app/views/produtos/ver.ctp. A camada da view no CakePHP pode ser feita de algumas diferentes partes. Cada parte tem diferentes usos, e ser coberta em seu captulo: layouts: arquivos view que contm o cdigo da apresentao que encontrado envolvendo muitas interfaces em sua aplicao. A maior parte das views renderizada dentro de um layout; elements: pedaos de cdigo pequenos e reutilizveis. Elements so geralmente renderizados dentro de views; helpers: essas classes encapsulam lgica da view que necessria em muitos lugares na camada da view. Entre outras coisas, helpers no CakePHP podem ajud-lo a construir formulrios, construir funcionalidade Ajax, paginar dados do model, ou servir feeds RSS.

Layouts Um layout contm cdigo de apresentao que envolve uma view. Qualquer coisa que voc quiser ver em todas as suas views deve ser colocada em um layout. Arquivos de layout devem ser colocados em /app/views/layouts. O layout padro pode ser sobrescrito criando um novo layout padro em /app/views/layouts/default.ctp. Uma vez que um novo layout foi criado, cdigo de view renderizado pelo controller colocado dentro do layout padro quando a pgina renderizada. Quando voc cria um layout, voc precisa dizer ao CakePHP onde colocar o cdigo de suas views. Para tanto, garanta que seu layout tem um lugar para o contedo do layout atravs da varivel $content_for_layout (e opcionalmente, ttulo para o layout atravs da varivel $title_for_layout). Aqui vai um exemplo do que um layout padro deve parecer:
<!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> <title><?php echo $title_for_layout?></title> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> </head> <body> <!-- Se voc gostaria que algum tipo de menu seja

Desenvolvendo com CakePHP

49

mostrado em todas as suas views, insira ele aqui --> <div id="header"> <div id="menu">...</div> </div> <!-- aqui que eu quero que minhas views apaream <?php echo $content_for_layout ?> -->

<!-- Adicione um rodap para cada pgina mostrada --> <div id="footer">...</div> </body> </html>

Para configurar um ttulo para o layout, mais fcil faz-lo no controller, usando a varivel de controller $pageTitle.
class UsuariosController extends AppController { function verAtivos() { $this->pageTitle = 'Ver Usurios Ativos'; } }

Voc pode criar quantos layouts voc desejar: apenas coloque-os no diretrio /app/views/layouts, e escolha entre eles o ideal para cada action do controller usando a varivel $layout ou a funo setLayout(). Controllers que no tenham a varivel $layout configurada usaro o layout padro. Por exemplo, se uma sesso do meu site incluir um pequeno espao para banner, eu posso criar um novo layout com um pequeno espao para propaganda e especific-lo como layout para todas as actions de controller usando algo como:
class UsuariosController extends AppController { var $layout = 'padrao_propag_mini'; function verAtivos() { $this->pageTitle = 'Ver Usurios Ativos'; $this->layout = 'padrao_propag_mini'; } function verImagem() { $this->layout = 'imagem'; // imprimir a imagem para o usurio } }

CakePHP tem em seu ncleo, dois layouts (alm do layout padro) que voc pode usar em suas aplicaes: 'ajax' e 'flash'. O layout Ajax timo para criar respostas Ajax - um layout vazio (a maior parte das chamadas ajax requer pouca marcao em retorno, ao invs uma interface totalmente renderizada). O layout flash usado para mensagens mostradas pelos mtodos flash() dos controllers. Trs outros layouts - xml, js, e rss - existem no ncleo para acelerar e facilitar servir contedo diferente de text/html.

Desenvolvendo com CakePHP

50

Elements (Elementos) Muitas aplicaes tm pequenos blocos de cdigo de apresentao que precisa ser repetido de pgina em pgina, algumas vezes em diferentes lugares no layout. O CakePHP te ajuda a repetir partes do seu website que precisam ser reutilizadas. Essas partes reutilizveis so chamadas elements. Um element basicamente uma mini-view que pode ser includa em outras views. Elements vivem no diretrio /app/views/elements/, e tem uma extenso .ctp no nome de arquivo. Por padro, elements so estticos. Voc pode dar vida aos seus elements e passar para eles variveis da view usando um parmetro adicional no mtodo renderElement().
// Chamando um element sem parmetros // Esse element s contm cdigo esttico de view. <?php echo $this->element('ajuda'); ?> // Chamando um element passando um array de dados, // permitindo que o element se comporte dinamicamente. <?php echo $this->element( 'ajuda', array('mensagem' => 'Ah, esse texto realmente muito til.')); ?>

Nota: Voc pode aproveitar o sistema de cache de view do CakePHP se voc fornecer cache como true no segundo parmetro do mtodo element().
// Renderiza o element e faz cache dele por um dia <?php echo $this->element('ajuda', array('cache' => true)); ?>

Dentro do arquivo element, todos as variveis esto disponveis como os nomes dos ndices do array fornecido (muito parecido com como set() funciona no controller com arquivos de view). No exemplo acima, o arquivo /app/views/elements/ajuda.ctp pode usar a varivel $mensagem. Uma forma de aproveitar totalmente os elements usar requestAction(). A funo requestAction() preenche a view com variveis da action do controller e as retorna como um array. Isso torna possvel aos seus elements agir realmente no estilo MVC. Crie uma action do controller que prepara as variveis da view para seus elements e chame requestAction() dentro do segundo parmetro de requestElement() para preencher o element com as variveis de view vindas do controller. Elements podem ser usados para fazer a view mais legvel, colocando os elementos repetitivos em seus prprios arquivos. Eles podem tambm ajud-lo a reutilizar fragmentos de contedo em sua aplicao.

Helpers (Ajudantes)
Introduo Helpers (Ajudantes) so classes do tipo component para a camada de apresentao da sua aplicao. Eles contm lgica de apresentao que compartilhada entre muitas views,

Desenvolvendo com CakePHP

51

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'); } ?>

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 da parte de Helpers internos.
Tabela 4. Helpers internos do CakePHP

Helper CakePHP Ajax

Cache Form Html Javascript Number Paginator Rss Session Text Time Xml

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

Desenvolvendo com CakePHP

52

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... } } ?>

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>" ); }

Incluindo 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) class LinkHelper extends Helper { var $helpers = array('Html'); function editar($titulo, $caminho) { // Usando o helper HTML para criar // dados formatados: $link 'editar')); = $this->Html->link($titulo, $caminho, array('class' =>

return $this->output("<div class=\"editarContainer\">$link</div>"); } }

Desenvolvendo com CakePHP

53

Usando seus helpers personalizados 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. Contribuindo Por favor, considere doar seu cdigo de volta ao CakePHP - contate um dos desenvolvedores usando nosso sistema de Trac ou a lista de e-mails, ou abra um novo projeto em CakeForge para compartilhar seu novo helper com outros.

Scaffolding
Introduo Scaffold (equivalente em portugus seria andaime, aqui trataremos como prottipo) de aplicao uma tcnica que permite ao desenvolvedor definir e criar uma aplicao bsica que pode criar, obter, atualizar e excluir objetos. Scaffold em CakePHP tambm permite desenvolvedores definir como objetos so relacionados com outros, e criar e quebrar essas ligaes. Tudo que necessrio para criar um scaffold um model e seu controller. Uma vez que voc configurou a varivel $scaffold no seu controller voc j tem tudo funcionando. O scaffold do CakePHP muito legal. Ele te d uma aplicao CRUD (Create - Criar, Retrive Obter, Update - Atualizar, Delete - Excluir) totalmente funcional em minutos. To legal que voc vai querer us-lo em aplicaes em fase de produo. Agora, ns tambm pensamos que ele legal, mas, por favor, perceba que scaffold ... bem... apenas scaffold. uma estrutura simples que voc pe para funcionar muito rpido no incio do projeto para ter algo funcionando o mais rpido possvel. Ele no tem inteno de ser completamente flexvel, ele mais como uma forma de j comear com algo funcionando. Se voc se perceber precisando personalizar suas lgica e suas views, hora deixar de lado seu scaffold e escrever um pouco de cdigo. O console Bake do CakePHP, coberto em uma sesso mais a frente, timo prximo passo: ele gera todo o cdigo que produzir um resultado parecido com o scaffold atual. Scaffold uma tima forma de lidar com as partes iniciais do desenvolvimento de uma aplicao web. Esquemas de banco de dados iniciais esto sujeitos a mudanas, o que perfeitamente normal na parte inicial do processo de design. E a existe um problema: desenvolvedores web detestam criar formulrios que nunca sero realmente usados. Para reduzir o trabalho do desenvolvedor, o scaffold foi adicionado no CakePHP. Ao fazer scaffold o CakePHP analisa suas tabelas do banco de dados e cria listas padronizadas com botes add,

Desenvolvendo com CakePHP

54

delete e edit, formulrios padres de edio e views padronizadas para inspeo de itens no banco de dados. Para adicionar scaffold na sua aplicao, em seu controller adicione a varivel $scaffold:
<?php class CategoriasController extends AppController { var $scaffold; } ?>

Assumindo que voc criou at mesmo o arquivo de classe model Categoria (em /app/models/categoria.php), voc est pronto para ir. Visite http://exemplo.com/categorias para ver seu novo scaffold. Nota: criar mtodos em controllers que tem scaffold pode causar resultados no desejados. Por exemplo, se voc criar uma mtodo index() em um controller com scaffold, seu mtodo index ser renderizado ao invs da funcionalidade do scaffold. O scaffold est ciente das associaes entre models, ento se o seu model Categoria est associado atravs de belongsTo a um model Usuario, voc ver a listagem de IDs do Usuario. Se voc ao invs do ID quer ver outra coisa (como o nome do usurio), voc pode configurar a varivel $displayField no model. Vamos configurar a varivel $displayField na class Usuario para que as categorias mostrem usurios pelo nome ao invs de apenas o ID no scaffold. Esse recurso faz com que o scaffold se torne mais legvel em muitas situaes.
<?php class Usuario extends AppModel { var $name = 'Usuario'; var $displayField = 'nome'; } ?>

Personalizando os scaffolds Se voc est procurando por algo um pouco diferente em suas views de scaffold, voc pode criar templates. Ns no recomendamos essa tcnica para aplicaes em nvel de produo, mas esse nvel de personalizao pode ser til durante as fases de interao. A personalizao feita atravs da criao de templates para as views:
Views scaffold personalizadas para um controller especfico (PostsController neste exemplo) deve ser colocado assim: /app/views/posts/scaffold.index.ctp /app/views/posts/scaffold.show.ctp /app/views/posts/scaffold.edit.ctp /app/views/posts/scaffold.new.ctp Views scaffold para todos os controllers devem ser colocadas assim:

Desenvolvendo com CakePHP

55

/app/views/scaffolds/index.ctp /app/views/scaffolds/show.ctp /app/views/scaffolds/edit.ctp /app/views/scaffolds/new.ctp /app/views/scaffolds/add.ctp

CakePHP Console
Introduo Criando Shells e Tasks Criando suas Shells Tasks

Gerando cdigo com Bake Plugins


Criando um plugin Plugin de controladores Plugin de modelos Plugin de vises Plugin de informaes

Constantes e funes globais


Embora a maior parte do seu dia-a-dia no trabalho com o CakePHP ser utilizando as classes e os mtodos do ncleo, o CakePHP apresenta inmeras funes globais que podem ser teis. Muitas destas funes so para o uso das classes do CakePHP (carregando classes Models ou Components), mas muitas outras funes tornam o trabalho com arrays ou strings um pouco mais fcil. Iremos tambm abranger algumas das constantes disponveis. Fazendo uso destas constantes, as atualizaes iro se tornar mais fceis, mas tambm, so uma maneira conveniente de apontar para determinados arquivos ou diretrios em suas aplicaes. Funes globais Aqui esto as funes globais disponveis no CakePHP. Muitos delas so longas funes do PHP convenientemente reescritas, mas algumas (como vendor(), e uses()) podem ser usadas para incluir cdigos ou executar outras funes teis. Provavelmente, se voc estiver querendo uma funo para realizar uma tarefa repetitiva, ela estar aqui. __(string $string_id, boolean $return = false)

Esta funo manipula a internacionalizao nas aplicaes CakePHP. A string $string_id identifica a ID para uma traduo, e o segundo parmetro lhe permite "echoar" a string diretamente (este o padro), ou devolv-la para o tratamento posterior (voc deve passar

Desenvolvendo com CakePHP

56

um valor booleano 'true' para ativar esse Internacionalizando para obter mais informaes. a(mixed $one, $two, $three...)

comportamento).

Confira

seo

Retorna uma array com os parmetros utilizados na chamada desta funo.


print_r(a('foo', 'bar')); // Sada: array( [0] => 'foo', [1] => 'bar' )

aa(array $one, $two, $three...)

Usado para criar arrays associativas, formada com os parmetros utilizados na chamada desta funo.
echo aa('a','b'); // Sada: array( 'a' => 'b' )

am(array $one, $two, $three...)

Agrupa todas as arrays passadas como parmetros. convertSlash(string $string)

Converte barras em underlines e remove o primeiro e ultimo underline em uma string. Retorna a string convertida. countdim(array $array)

Retorna o nmero de dimenses de uma array fornecida. debug(mixed $var, boolean $showHtml = false)

Se o nvel de debug da aplicao diferente de zero, $var impresso na tela. Se $showHTML for verdadeiro (true), os dados sero exibidos de forma mais amigvel leitura no navegador. e(mixed $data)

Conveniente reescrita da funo echo(). env(string $key)

Retorna uma varivel de ambiente a partir de fontes disponveis. Utilizado como um backup caso $_SERVER ou $_ENV estiverem desabilitados.

Desenvolvendo com CakePHP

57

Esta funo tambm emula PHP_SELF e DOCUMENT_ROOT em servidores que no os suportam. De fato, uma boa idia usar sempre a funo env() em vez de usar $_SERVER ou getenv() (especialmente se voc pretende distribuir seu cdigo), uma vez que ele um completo emulador das variveis citadas acima. fileExistsInPath(string $file)

Verifica se o arquivo fornecido est dentro do atual include_path do PHP. Retorna um resultado booleano. ife($condition, $ifNotEmpty, $ifEmpty)

Utilizado em operaes ternrias. Se $condition no vazio, $ifNotEmpty retornado se no $ifEmpty retornado. loadBehavior() loadComponent() loadController() loadControllers() loadHelper() loadModel() loadModels() loadPluginComponent() loadPluginController() loadPluginHelper() loadPluginModels() loadView()

Este conjunto de funes globais usado para carregar classes do ncleo do CakePHP para posterior instanciao. Basta fornecer o nome da(s) classe(s) que voc gostaria de carregar. Isto especialmente til para o console de tarefas.
loadModel('Orders'); $Order = new Order();

low(string $string)

Conveniente reescrita da funo strtolower() do PHP. paths()

Retorna uma array contendo o caminho dos diretrios do CakePHP indexados por Models, Behaviors, Controllers, Components, e Helpers. pr(mixed $var)

Conveniente reescrita da funo print_r() do PHP, com a adio da tag <pre> englobando a sada de print_r().

Desenvolvendo com CakePHP

58

r(string $search, string $replace, string $subject)

Conveniente reescrita da funo str_replace() do PHP. stripslashes_deep(array $value)

Retira as barras da array informada de forma recursiva, retornando a array modificada. up(string $string)

Conveniente reescrita da funo strtoupper() do PHP. uses(string $lib1, $lib2, $lib3...)

Usado para carregar bibliotecas do ncleo do CakePHP (encontradas em cake/libs/). vendor(string $lib1, $lib2, $lib3...)

Usado para carregar bibliotecas externas (de terceiros) encontrados no diretrio /vendors ou app/vendors. Constantes do ncleo
Tabela 5. Constantes do CakePHP

Constante COMPRESS_CSS

LOG_ERROR

Descrio Se definido como verdadeiro (true) as folhas de estilo CSS sero compactadas em modo de produo. Isto requer um diretrio /var/cache com permisso de escrita pelo servidor. Para utilizar, inclua suas folhas de estilo referenciando-as com o caminho /ccss (diferente de /css) ou utilize o mtodo Controller::cssTag(). Constante de erro. Usado para diferenciar erros de Log e Debug. Atualmente o PHP suporta LOG_DEBUG

Constantes do diretrio
Tabela 6. Constantes dos diretrios

Constante APP APP_PATH CACHE CAKE COMPONENTS CONFIGS CONTROLLER_TESTS CONTROLLERS CSS ELEMENTS HELPER_TESTS HELPERS INFLECTIONS JS

Caminho absoluto dos diretrios do aplicativo Diretrio raiz Diretrio do aplicativo Diretrio para os arquivos de cache do aplicativo Diretrio do CakePHP Diretrio dos components Diretrio dos arquivos de configurao do aplicativo Diretrio do controller de testes Diretrio dos controladors Diretrio dos arquivos CSS Diretrio dos elements Diretrio dos helpers de teste Diretrio dos helpers Diretrio das inflexes (geralmente o mesmo diretrio dos arquivos de configurao) Diretrio dos arquivos JavaScript (no webroot)

Desenvolvendo com CakePHP

59

LAYOUTS LIB_TESTS LIBS LOGS MODEL_TESTS MODELS SCRIPTS TESTS TMP VENDORS VIEWS

Diretrio dos layouts Diretrio das bibliotecas de testes do CakePHP Diretrio das bibliotecas do CakePHP Diretrio dos arquivos de log (no app) Diretrio dos models de teste Diretrio dos models Diretrio de scripts do CakePHP Diretrio de testes (pai das pastas models, controllers, etc. No diretrio de testes) Diretrio de arquivos temporrios Diretrio para bibliotecas externas (de terceiros) Diretrio das views

Tarefas comuns com CakePHP

60

Parte IV.

Tarefas comuns com CakePHP

Validao de dados
Regras simples Uma regra por campo rule required allowEmpty on message Mltiplas regras por campo Construindo regras de validao alphaNumeric between blank cc comparison date email ip minLength maxLength numeric phone postal ssn url Regras de validao personalizada

Tarefas comuns com CakePHP

61

Validao por expresses regulares personalizadas Validao por mtodos personalizados

Limpeza de dados Manipulao de erros Debugando Gerando caches Logando


Introduo Enquanto algumas definies da Classe de Configurao do CakePHP podem realmente ajudlo a ver o que est acontecendo por debaixo dos panos, h certos momentos em que voc precisa logar os dados no disco (em um arquivo de texto) para descobrir o que est acontecendo. Num mundo que est cada vez mais dependente de tecnologias como SOAP e AJAX, o ato de debugar pode ser bastante difcil. Logar tambm pode ser uma maneira de descobrir o que est acontecendo na sua aplicao ao longo do tempo. Quais os termos de busca esto sendo usados? Quais erros esto sendo mostrados aos meus usurios? Quantas vezes uma determinada consulta est sendo executada? Logar dados no CakePHP fcil. A funo log() faz parte da classe Object, que uma classe ancestral comum para quase todas as outras classes do CakePHP. Se o contexto for uma classe CakePHP (Model, Controller, Component... quase todas), voc pode logar seus dados. Usando as funes de log A funo log() recebe dois parmetros. A primeira a mensagem que voc gostaria de escrever no arquivo de log. Por padro, esta mensagem de erro escrita no log de erros encontrado em app/tmp/logs/error.log:
// Execute isto dentro de uma classe do CakePHP: $this->log("Algo no funciona!"); // O resultado ser adicionado ao final do arquivo app/tmp/logs/error.log 2007-11-02 10:22:02 Error: Algo no funciona!

O segundo parmetro usado para definir o tipo de mensagem de log que voc deseja escrever. Se no for informado, o padro LOG_ERROR, que escrever no arquivo mencionado anteriormente. Voc pode passar este segundo parmetro como LOG_DEBUG e escrever as suas mensagens no arquivo de log para debug encontrado em app/tmp/logs/debug.log
// Execute isto dentro de uma classe do CakePHP:

Tarefas comuns com CakePHP

62

$this->log('Uma mensagem de debugao.', LOG_DEBUG); // O resultado ser adicionado ao final do arquivo app/tmp/logs/debug.log (em vez de error.log) 2007-11-02 10:22:02 Error: Uma mensagem de debugao.

Observao: O diretrio app/tmp deve ter permisso de escrita pelo usurio do servidor web para que esta funo execute corretamente.

Testando Internacionalizando
Um dos melhores caminhos para chegar a uma grande platia fazer um aplicativo em diversos idiomas. Isso pode representar uma grande tarefa, mas os recursos de internacionalizao no CakePHP fazem isto muito mais fcil. Primeiro, importante que voc entenda a terminologia. O termo localizao (localization) refere-se adaptao de uma aplicao para atender as necessidades de um idioma especfico (ou cultura), como, por exemplo, um locale. Internacionalizao (internacionalization) referese habilidade de sua aplicao se "localizvel". Internacionalizao e localizao so abreviadas como i18n e l10n, respectivamente; 18 e 10 representam a quantidade de caracteres entre o primeiro e o ltimo caractere. Definindo o locale da sua aplicao Qualquer controlador que usa o contedo localizado inclui a classe L10 do ncleo do CakePHP.
<?php // Include the L10n class: uses(L10n); class RecipesController extends AppController { // ... } ?>

Em seguida, voc precisa criar os arquivos de idioma que controlam as strings internacionalizveis. Cada idioma contm um conjunto de strings com suas IDs. Criando estes arquivos, voc tem um caminho para ser organizado e traduzido. Cada idioma deve conter o arquivo default.po em uma pasta com o nome do idioma a que se refere.
/app/locale/eng/LC_MESSAGES/default.po (Ingls) /app/locale/fre/LC_MESSAGES/default.po (Francs) /app/locale/por/LC_MESSAGES/default.po (Portugus) /app/local/pt_br/LC_MESSAGES/default.po (Portugus - Brasil)

A pasta locale fica dentro da pasta app da sua instalao do CakePHP. Os caracteres de localizao (ex: eng, por, pt_br) seguem o padro ISO 639-2 (exemplos podem ser encontrados no site do Library of Congress, http://www.loc.gov/standards/iso639-2/php/code_list.php).

Tarefas comuns com CakePHP

63

Depois de criar os arquivos, preencha-os com as strings chaves e os valores usados para o processo de internacionalizao. Cada string chave deve ter um nico valor correspondente. Aqui um exemplo bsico que deve estar dentro do arquivo .po do idioma portugus:
msgid "purchase" msgstr "Para comprar o item selecionado, clique em Comprar Agora." msgid "search" msgstr "Clique aqui para procurar na nossa base de dados."

Note que seus arquivos .po devem ser codificados usando o padro ISO-8859-1, e que estes no excedam o limite de 1024 caracteres na string de valor (msgstr). Depois de criar os arquivos .po corretamente, sua aplicao j est internacionalizada. Internacionalizando em CakePHP Usando os dados de localizao na sua aplicao simples. O primeiro passo avisar ao CakePHP qual idioma sua aplicao deve utilizar para mostrar o contedo. Isso pode ser feito detectando subdomnios (en.exemplo.com.br ou pt.exemplo.com.br), usando a informao do browser ou qualquer outra maneira. Alterao de idioma deve ser feita no controlador:
$this->L10n = new L10n(); $this->L10n->get("en"); Configure::write('Config.language', "en");

Voc pode por este cdigo no beforeFilter para fazer com que cada ao no controlador seja mostrada usando o idioma corretamente, ou voc pode querer colocar isso em uma ao que manipule a autenticao, ou ainda colocar para escolher o idioma padro. Para fazer suas strings internacionalizveis, utilize a funo __(). Esta funo est disponvel globalmente, mas voc provavelmente utilizar mais nas vises. O primeiro parmetro da funo o texto que vai na msgid do arquivo .po. Este contedo exibido (echo) por padro, mas um segundo parmetro pode ser utilizado (opcional), que informa se voc quer retornar o texto (para manipulao de links, por exemplo). O pequeno exemplo abaixo mostra como internacionalizar strings usando a funo __(). A atual sada depende do idioma que foi selecionado usando a classe L10n e as configuraes setadas.
<hr /> <p><?php __("purchase"); ?></p> <hr />

Lembre-se de usar o parmetro de retorno em mtodos de helper se voc deseja que o contedo seja traduzido na chamada do mtodo do ajudante. Use o segundo parmetro do __() para retornar os dados ao invs de exibir (echo):
<?php echo $form->error( 'Card.cardNumber', __("errorCardNumber", true), array('escape' => false) ); ?>

Tarefas comuns com CakePHP

64

Paginao
Configurando os controladores Paginando nas vises Paginando com AJAX Alteraes no layout Alteraes nas vises

Componentes internos

65

Parte V.

Componentes internos

Lista de controle de acessos (ACL) Autenticao Sesses Manipulando requisies Segurana E-mail Cookies
Introduo Configurando os controladores Usando o componente

Helpers internos

66

Parte VI.
Formulrios

Helpers internos

O FormHelper uma nova adio ao CakePHP. A maior parte do trabalho pesado na criao de formulrio agora feita usando esta nova classe, em vez dos (agora obsoletos) mtodos do HtmlHelper. O FormHelper centra-se na criao de formulrios rapidamente, de uma forma que ir dinamizar validao, re-preenchimento e o layout. O FormHelper tambm flexvel, que vai fazer quase tudo para voc automagicamente ou voc pode usar mtodos especficos para obter apenas o que necessita. Criando formulrios O primeiro mtodo que voc precisar usar na ordem para ganhar vantagens do FormHelper o create(). Este mtodo especial retorna uma tag de abertura de formulrio. create(string $model = null, array $options = array())

Todos os parmetros so opcionais. Se create() chamada sem parmetros fornecidos, Esta assume que voc est construindo um formulrio que ser submetido a funo add() do controlador atual, via POST. O elemento do formulrio tambm retornado com o atributo id seguindo um padro DOM ModelActionForm, em forma de camelo. Se eu fosse chamar create() dentro de uma viso (view) do controlador UserController, Eu veria algo como a seguinte sada na viso.
<form id="UserAddForm" method="post" action="/users/add">

O mtodo create() permite personalizar muito mais usando os parmetros, no entanto. Primeiro, voc pode especificar um nome de modelo. Este modelo , ento, assumido como o padro para todos os campos do formulrio, bem como o id em DOM da tag do formulrio alterada.
<?php echo $form->create('Recipe'); ?> // Sada: <form id="RecipeAddForm" method="post" action="/recipes/add">

* Recipe = Receita O array $options onde a maior parte da configurao do formulrio acontece. Este array especial pode conter um nmero de diferentes pares valor-chave que afetam a forma como a tag do formulrio gerada. $options['type'] Esta chave utilizada para especificar o tipo de formulrio a ser criado. Os valores vlidos incluem 'post', 'get', 'file', 'put' e 'delete'. Preenchendo com 'post' ou 'get' muda o modo de como o formulrio submete a informao.
<?php echo $form->create('User', array('type' => 'get')); ?>

Helpers internos

67

// Sada: <form id="UserAddForm" method="get" action="/users/add">

Especificando 'file' muda a forma de submeter para o mtodo post, e inclui um atributo enctype de multipart/form-data na tag do formulrio. Isto para ser usado se houver algum elemento de entrada de arquivo, dentro do formulrio. A ausncia de um bom atributo enctype, far com que o upload de arquivo no funcione.
<?php echo $form->create('User', array('type' => 'file')); ?> // Sada: <form id="UserAddForm" action="/users/add">

enctype="multipart/form-data"

method="post"

Quando estiver usando put ou delete, o formulrio ser funcionalmente equivalente a um formulrio submetido em modo 'post', mas, quando submetido, o mtodo de solicitao HTTP ser ultrapassado com 'PUT' ou 'DELETE', respectivamente. Isto permite o CakePHP emular adequadamente o suporte em navegadores web. $options['action'] A chave $action permite que voc aponte o formulrio para uma action especfica no seu controller atual. Por exemplo, se voc gostaria de apontar o formulrio para a action login() do controller atual, voc deve fornecer um array $options como o seguinte:
<?php echo $form->create('Usuario', array('action' => 'login')); ?> // Sada: <form id="UsuarioLoginForm" method="post" action="/usuarios/login">

$options['url'] Se o destino do formulrio atual no o controller atual, voc pode especificar a URL para o atributo action do formulrio utilizando a chave 'url' do array $options. A URL pode ser fornecida em relao a sua aplicao CakePHP (URL relativa), ou pode apontar para um domnio externo (URL absoluta).
<?php echo $form->create(null, array('url' => 'recipes/add')); ?> // Sada: <form method="post" action="/recipes/add"> <?php echo $form->create(null, array( 'url' => 'http://www.google.com/search' 'type' => 'get' )); ?> // Sada: <form method="get" action="http://www.google.com/search">

$options['default'] Se 'default' foi definido para booleano false, a forma de submeter modificada, de modo que pressionando o boto submit no envia o formulrio. Se o formulrio destina-se a ser

Helpers internos

68

submetido via AJAX, a configurao 'default' para false suprime a forma do comportamento padro, para que voc possa pegar os dados e envi-los via AJAX. Fechando formulrios O FormHelper inclui tambm um mtodo end() que completa a marcao do formulrio. Freqentemente, end() s imprime uma tag de fechamento de formulrio, mas usando o end() tambm permite o FormHelper inserir elementos hidden de formulrio quando necessrios, isso tudo depende da forma de como usado.
<?php echo $form->create(); ?> <!-- Form elements go here --> <?php echo $form->end(); ?>

Se uma string fornecida como o primeiro parmetro para end(), o FormHelper retorna um boto de submisso nomeado (ou com o valor) da string dada, juntamente com a tag de fechamento o formulrio.
<?php echo $form->end('Finish'); ?> Sada: <div class="submit"> <input type="submit" value="Finish" /> </div> </form>

Elemento de formulrio mgico Primeiro, vamos olhar para alguns dos muitos mtodos de criao automtica de formulrios do FormHelper. O principal mtodo que vamos olhar o input(). Este mtodo ir automaticamente deduzir o campo do modelo que foi fornecido no primeiro parmetro, e criar um campo de formulrio adequado para esse campo.
Tabela 7. Tipo de campos na interface conforme tipo de campo no banco de dados

Tipo da coluna Resultando no campo de formulrio string (char, varchar, etc.) text boolean, tinyint(1) checkbox Text textarea text, nomeado como password, password passwd, ou psword Date selects de dia, ms, e ano. datetime, timestamp selects de dia, ms, ano, hora, minuto, e meridiano Time selects de hora, minuto, e meridiano Por exemplo, vamos supor que o meu model User inclui campos de username (varchar), a password (varchar), approved (datetime) e quote (text). Posso usar o mtodo input() do FormHelper para criar uma entrada adequada para todos estes campos de formulrio.
<?php echo $form->create(); ?> <?php

Helpers internos

69

echo $form->input('username'); echo $form->input('password'); echo $form->input('approved'); echo $form->input('quote'); ?> <?php echo $form->end('Adicionar'); ?>

// // // // //

text text selects de dia, ms, ano, hora, minuto, meridiano textarea

$options['type'] Voc pode forar o tipo de uma entrada (e sobrepor a deduo pelo model), especificando o tipo. Alm dos tipos de campos encontrados na tabela acima, voc tambm pode criar entradas 'file', e 'password'.
<?php $form->input('field', array('type' => 'file')); Sada: <div class="input"> <label for="UserField">Field</label> <input type="file" name="data[User][field]" id="UserField" /> </div>

$options['before'], $options['between'] e $options['after'] Utilize estas chaves se voc precisa injetar alguma marcao dentro da sada do mtodo input().
<?php echo $form->input('field', array( 'before' => '--before--', 'after' => '--after--', 'between' => '--between---' ));?> Sada: <div class="input"> --before-<label for="UserField">Field</label> --between--<input name="data[User][field]" type="text" value="" id="UserField" /> --after-</div>

$options['options'] Esta chave permite que voc especifique manualmente as opes para uma entrada select, ou para um grupo de rdio. A menos que 'type' esteja especificada como 'radio', o FormHelper ir assumir que a meta de sada um entrada select.
<?php echo $form->input('field', array('options' => array(1,2,3,4,5))); ?> Sada: <div class="input"> <label for="UserField">Field</label>

Helpers internos

70

<select name="data[User][field]" id="UserField"> <option value="0">1</option> <option value="1">2</option> <option value="2">3</option> <option value="3">4</option> <option value="4">5</option> </select> </div>

As opes tambm podem ser preenchidas como pares chave-valor. $options['multiple'] Se 'multiple', foi escolhida para true para uma entrada que retorna um select, a escolha nesta entrada select permitir vrias selees. $options['maxLength'] Define o nmero mximo de caracteres permitidos em uma entrada de texto. $options['div'] Defina esta chave false para desativar a sada do div em torno da entrada e de seu marcador (label). $options['label'] Defina esta chave false para desativar a sada do marcador (label) que habitualmente acompanha o input. $options['id'] Definir esta chave para forar o valor da id DOM para a entrada. $options['error'] Esta chave deve ser ajustada para uma string que ser mostrada na eventualidade de um erro de validao. Se 'error' no est definida, uma mensagem de erro genrico padro ser mostrada. $options['selected'] Usado em combinao com uma entrada do tipo select. Defina 'selected' para o valor do item que deseja ser selecionado por padro quando a entrada renderizada. $options['rows'], $options['cols'] Estas duas chaves especificam o nmero de linhas e colunas em uma entrada de texto (textarea). $options['empty'] Se escolhida para true, fora a entrada para permanecer vazia. Isso til para entrada de senha que normalmente no deveria est preenchida com uma senha do usurio como acontece com o valor padro. $options['timeFormat'] Utilizado para especificar o formato do tempo nas entradas relacionadas com o tempo. Os valores vlidos incluem '12', '24', 'none'.

Helpers internos

71

$options['dateFormat'] Utilizado para especificar o formato do conjunto de entradas para selecionar uma data. Os valores vlidos incluem 'DMY', 'MDY', 'YMD', e 'NONE'. Mtodos especficos do elemento de formulrio O restante dos mtodos disponveis no FormHelper so para a criao especfica de elementos de formulrios. Muitos destes mtodos tambm fazem uso de um parmetro especial $options. Neste caso, porm, $options usado principalmente para especificar atributos da tag HTML(tais como o valor ou id (DOM) de um elemento do formulrio).
<?php echo $form->text('username', array('class' => 'users')); ?> Sada: <input name="data[User][username]" id="UserUsername" /> type="text" class="users"

checkbox(string $fieldName, array $options)

Cria um elemento checkbox. Este mtodo tambm gera um elemento hidden associado para forar a apresentao de dados para o especificado campo.
<?php echo $form->checkbox('done'); ?> Sada: <input type="hidden" name="data[User][done]" value="0" id="UserDone_" /> <input type="checkbox" name="data[User][done]" value="1" id="UserDone" />

year(string $fieldName, int $minYear, int $maxYear, mixed $selected, array $attributes, boolean $showEmpty)

Cria um elemento select preenchido com o passar dos anos a partir de $minYear para $maxYear, com o ano $selected selecionado por padro. Atributos HTML podem ser oferecidos em $attributes. Se $showEmpty false, o elemento select no inclue a opo vazia. month(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

Cria um elemento select preenchido com nomes dos meses. dateTime(string $fieldName, string $dateFormat = 'DMY', $timeFormat = '12', mixed $selected, array $attributes, boolean $showEmpty)

Cria um conjunto de entradas select para selecionar data e hora. Os valores vlidos para $dateformat so 'DMY', 'MDY', 'YMD' ou 'NONE'. Os valores vlidos para $timeFormat so '12','24', e 'NONE'. day(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

Cria um elemento select preenchido com os dias (numrico) do ms. hour(string $fieldName, boolean $format24Hours, mixed $selected, array $attributes, Boolean $showEmpty)

Helpers internos

72

Cria um elemento select preenchido com a hora do dia. minute(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

Cria um elemento select preenchido com os minutos da hora. meridian(string $fieldName, mixed $selected, array $attributes, boolean $showEmpty)

Cria um elemento select preenchido com 'am' e 'pm'. error(string $fieldName, string $text, array $options)

Mostra uma mensagem de erro de validao, especificado por $text, para o determinado campo, no evento que um erro de validao tenha ocorrido. file(string $fieldName, array $options)

Cria uma entrada de arquivo. hidden(string $fieldName, array $options)

Cria uma entrada de fomulrio hidden. isFieldError(string $fieldName)

Retorna true se o campo fornecido em $fieldName tem uma validao de erro ativa. label(string $fieldName, string $text, array $attributes)

Cria um elemento tag (etiqueta), preenchido com $text. password(string $fieldName, array $options)

Cria uma entrada de senha (password). radio(string $fieldName, array $options, array $attributes)

Cria uma entrada radio. select(string $fieldName, array $options, mixed $selected, array $attributes, boolean $showEmpty)

Cria um elemento select, preenchido com os itens de $options, com uma opo selecionada por padro, especificada por $selected. Defina $showEmpty para false se voc no quer uma opo vazia dentro do select. submit(string $caption, array $options)

Cria um boto Submit com legenda $caption. Se a definio de $caption for uma URL de uma imagem (que contm o caracter '.' (ponto)), o boto submit ser exibido como uma imagem. submitImage(string $path, array $options)

Helpers internos

73

Cria um boto imagem de submisso, com a imagem especificada pela URL em $path (caminho). text(string $fieldName, array $options)

Cria uma entrada textarea. textarea(string $fieldName, array $options)

Cria uma entrada textarea.

HTML
Inserindo elementos bem-formados

JavaScript
AJAX Opes do AjaxHelper Opes gerais Opes de callback Mtodos

Cache Form Number Text Time

Exemplos

74

Parte VII.

Exemplos

Tutorial de como fazer um blog em CakePHP Sistema simples de autenticao de usurios

Apndices

75

Parte VIII.
Escritores da verso inglesa
Jos Lorenzo derelm mar3k Tarique Sani Aaron Thies Ahsanul Bari Nate Abele Garrett J. Woodworth Larry Masters Mark Story

Apndices

Tradutores para lngua portuguesa


Bill Jr. Juan Basso Julio Protzek Sadjow Medeiros Leo Tarcsio Sassara Tulio Faria

Apoio e reviso da verso traduzida Gustavo Carreno Icaro Monteiro

Inflexo em portugus
Abaixo segue o cdigo para a inflexo para lngua portuguesa. Caso voc queira utilizar, coloque o cdigo no arquivo /app/config/inflections.php.
<?php /* * Por Sadjow Medeiros Leo (sadjow@gmail.com) * Baseado em http://forum.rubyonbr.org/forums/14/topics/520 */ $pluralRules = array( # # Regra geral: adiciona um "s" no final da palavra # #casa - casas '/^([a-zA-Z]*)a$/i' # #pe - pes '/^([a-zA-Z]*)e$/i' # #sem exemplo '/^([a-zA-Z]*)i$/i' # #carro - carros '/^([a-zA-Z]*)o$/i'

=> '\1as', => '\1es', => '\1is', => '\1os',

Apndices

76

# #pneu - pneus '/^([a-zA-Z]*)u$/i' => '\1us',

# # Se a palavra termina com "r" or "z", adiciona "es" # #luz - luzes # #flor - flores # #arroz - arrozes '/^([a-zA-Z]*)r$/i' => '\1res', '/^([a-zA-Z]*)z$/i' => '\1zes', # # Se a palavra termina com "al", "el", "ol", "ul": Troca "l" por "is" # #farol - farois # #hospital - hospitais # #telemovel - telemoveis # #pincel - pinceis # #anzol - anzois '/^([a-zA-Z]*)al$/i' => '\1ais', '/^([a-zA-Z]*)el$/i' => '\1eis', '/^([a-zA-Z]*)ol$/i' => '\1ois', '/^([a-zA-Z]*)ul$/i' => '\1uis',

# # Se palavra termina em "il" e tem acento agudo na ltima slaba, troca "il", por "is" #cantil - cantis '/^([a-zA-Z]*)il$/i' => '\1is', # # TODO # # Se a palavra termina com "il" e tiver um acento agudo na penultima slaba, troca "il" por "eis" # # sem exemplo // Esse aqui um pouco mais complicado. Fiquei de fazer, porque no tem como // identificar acentos quando no se usa acentos( nome das tabelas) // Ainda estou pensando. Me ajuda ok?! # # Se a palavra termina com "m", troca "m" por "ns" # #armazem - armazens # #portagem - portagens # inflect.plural /^([a-zA-z]*)m$/i, '\1ns' '/^([a-zA-Z]*)m$/i' => '\1ns', # #TODO # # Se a palavra termina com "s" e tem uma slaba, troca "s" por "es" # # # # # # # # #sem exemplo #inflect.plural /^([a-zA-z]*)e$/i, '\1es' #TODO # Se a palavra termina com "x" fica a mesma #sem exemplo... professor X, telvez? #inflect.plural /^([a-zA-z]*)x$/i, '\1x'

Apndices

77

# # Se a palavra termina com "o", Existem 3 jeitos para o prural: os, es, es # #NOTA: Difcil de achar, Eu usei os casos mais conhecidos # # e depois usei os casos irregulares (l embaixo em $irregularPlural) para os outros. Se algum conhece # # mais casos, por favor adicione na lista e mande-me um email, obrigado! # # # #co - ces # #colcho - colches # #porto - portes # #po - pes # #alemo - alemes # #cho - ? # #pilho - pilhes # #canho - canhes # #bido - bides # #mo - mos '/^([a-zA-Z]*)ao$/i' => '\1oes' ); /** * This is a key only array of plural words that should not be inflected. * Notice the last comma * * $uninflectedPlural = array('.*[nrlm]ese', '.*deer', '.*fish', '.*measles', '.*ois', '.*pox'); */ $uninflectedPlural = array(); /** * This is a key => value array of plural irregular words. * If key matches then the value is returned. * * $irregularPlural = array('atlas' => 'atlases', 'beef' => 'beefs', 'brother' => 'brothers') */ //$irregularPlural = array(); /* Sadjow Medeiros Leo (sadjow@gmail.com) // Irregular */ $irregularPlural = array( 'cao' => 'caes', 'pao' => 'paes', 'mao' => 'maos', 'alemao' => 'alemaes' ); /** * This is a key => value array of regex used to match words. * If key matches then the value is returned. * * $singularRules = array('/(s)tatuses$/i' => '\1\2tatus', '/(matr)ices$/i' =>'\1ix','/(vert|ind)ices$/i') */ //$singularRules = array(); /* * Sadjow Medeiros Leo ( sadjow@gmail.com )

Apndices

78

*/ $singularRules = array( # #pes - pe # #carros - carro # #pneus - pneu '/^([a-zA-Z]*)as$/i' '/^([a-zA-Z]*)es$/i' '/^([a-zA-Z]*)is$/i' '/^([a-zA-Z]*)os$/i' '/^([a-zA-Z]*)us$/i'

=> => => => =>

'\1a', '\1e', '\1i', '\1o', '\1u',

# #luzes - luz # #flores - flor # #arrozes - arroz '/^([a-zA-Z]*)res$/i' => '\1r', '/^([a-zA-Z]*)zes$/i' => '\1z', # #cantis - cantil '/^([a-zA-Z]*)is$/i' => '\1il', # # #farois - farol # #hospitais - hospital # #telemoveis - telemovel # #pinceis - pincel # #anzois - anzol '/^([a-zA-Z]*)ais$/i' => '\1al', '/^([a-zA-Z]*)eis$/i' => '\1el', '/^([a-zA-Z]*)ois$/i' => '\1ol', '/^([a-zA-Z]*)uis$/i' => '\1ul', # # #armazens - armazem # #portagens - portagem '/^([a-zA-Z]*)ns$/i' => '\1m', # # #ces - co # #colches - colcho # #portes - porto # #pes - po # #alemes - alemo '/^([a-zA-Z]*)oes$/i' => '\1ao', '/^([a-zA-Z]*)aes$/i' => '\1ao', '/^([a-zA-Z]*)aos$/i' => '\1ao' ); /** * This is a key only array of singular words that should not be inflected. * You should not have to change this value below if you do change it use same format * as the $uninflectedPlural above. */ $uninflectedSingular = $uninflectedPlural; /** * This is a key => value array of singular irregular words. * Most of the time this will be a reverse of the above $irregularPlural array * You should not have to change this value below if you do change it use same format

Apndices

79

* * $irregularSingular = array('atlases' => 'atlas', 'beefs' 'brothers' => 'brother') */ $irregularSingular = array_flip($irregularPlural); ?>

=>

'beef',

Anda mungkin juga menyukai