Cakephp - framework de desenvolvimento de aplicações Web em PHP

3.667 visualizações

Publicada em

Apresentação da framework de desenvolvimento de aplicações web - cakePHP.
Aprender a criar uma aplicação web em PHP usando o CakePHP.
- Instalação?
- Organização?
- Como criar um Blog?
- Autenticação?
- Multi-utilizador?

Publicada em: Educação
0 comentários
3 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.667
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
53
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Cakephp - framework de desenvolvimento de aplicações Web em PHP

  1. 1. Seminário 2011/2012cakePHPArlindo Santos (acsantos@ipb.pt)
  2. 2. Seminário cakePHP2011/2012 Start!• O CakePHP teve seu desenvolvimento iniciado por Michal Tartarynowicz em 2005.• Baseado nas ideias do framework Ruby on Rails, e a principal meta é ser um framework estruturado que permita programadores PHP de todos os níveis desenvolverem aplicações web robustas e sem perda de flexibilidade.• http://www.cakephp.org• Cookbook - http://book.cakephp.org/2.0/pt/index.html Arlindo Santos 09-05-12 2
  3. 3. Seminário cakePHP2011/2012 Fluxo - funcionamento Arlindo Santos 09-05-12 3
  4. 4. Seminário cakePHP 2011/2012 Características• Baseado em arquitetura MVC – Facilita o desenvolvimento e manutenção de aplicações; – Melhor organização do código-fonte; – Facilita o trabalho em equipe; – Abstrai o programador de tarefas repetitivas e complexas.• Licença Flexível – O CakePHP é licenciado sob a licença MIT, muito mais flexível que a GPL e a própria BSD.• Compatibilidade com PHP4 e PHP5 – Como a maioria dos servidores web usam a versão 4.0 do PHP esta é uma vantagem significativa do CakePHP em relação a outros frameworks PHP, como é o caso do Symfony ou do Zend Framework.• Validação de campos – O CakePHP possui formas de validar dados digitados pelos utilizadores em formulários ou URLs. Isso ajuda o programador a evitar dados incorretos ou problemas de segurança.• Scaffolding – É um recurso que analisa uma tabela na base de dados e cria automaticamente botões e formulários para as operações básicas de inserção, alteração, e eliminação de dados. Arlindo Santos 09-05-12 4
  5. 5. Seminário cakePHP 2011/2012 Características• Listas de controle de acesso (ACL) – Permite a gestão de algo (geralmente utilizadores) – Permite gerir algo que é desejado (aplicações, por exemplo) – Não é autenticação de utilizadores• Componentes para: – Segurança; – Sessões; – Tratamento de requisições – Permite o desenvolvimento de componentes específicos adicionais ao ambiente• Helpers – Existem helpers para auxiliar na geração de HTML, formulários, JavaScript e AJAX. Novos helpers podem ser criados ou reutilizados em outros projetos.• Geração de código-fonte – O CakePHP apresenta uma ferramenta chamada bake, que permite a criação de diretórios da aplicação, além da geração de código CRUD. CRUD é um acrônimo para Create, Retrieve, Update e Delete. Arlindo Santos 09-05-12 5
  6. 6. Seminário cakePHP2011/2012 Requisitos• O CakePHP pode ser utilizado em qualquer plataforma operacional com suporte ao interpretador PHP;• Servidor Web Apache;• PHP 4.3.2 ou superior;• Editor PHP de sua preferência;• DB Designer ou outra ferramenta de modelagem de dados;• Uma base de dados: – A versão estável do framework suporta MySQL, PostgreSQL e camada de abstração de banco de dados chamada ADOdb. Arlindo Santos 09-05-12 6
  7. 7. Seminário cakePHP 2011/2012 Organização dos directórios• /app – Diretório onde ficará a aplicação desenvolvida – /config – Arquivos de configuração, DB, etc.. – /controllers – Controladores da aplicação – /index.php – Página inicial da aplicação – /models – Modelos da aplicação – /plugins – Plugins que podem ser adicionados – /tmp – Usado para cache e logs – /vendors – Bibliotecas de terceiros – /views – Visões da aplicação • /elements – Elementos, pedaços da visão • /errors – Páginas de erros customizadas • /helpers – Ajudantes para gerar código • /layouts – Arquivos de layout • /pages – Visões estáticas – /webroot – DocumentRoot para aplicação • /css – Arquivos css • /files – Arquivos comuns • /img – Imagens • /js – Javascripts (AJAX)• /lib – /cake – Código-fonte do cake• /plugins• /vendors – Bibliotecas de terceiros• index.php – Página inicial do framework Arlindo Santos 09-05-12 7
  8. 8. Seminário cakePHP2011/2012 Passos para a instalação• Descarregar a versão estável da ferramenta em http://www.cakephp.org/downloads• Descompactar/extrair no diretório raiz do seu servidor web• Renomear o diretório para um nome mais usual/curto (cake)• Pronto, já está funcionando: http://localhost/cake Arlindo Santos 09-05-12 8
  9. 9. Seminário cakePHP2011/2012 Instalação• http://book.cakephp.org/2.0/pt/installation.html• Permissões – O diretório /app/tmp com direitos de escrita pelo utilizador. – Executar http://localhost/cake Arlindo Santos 09-05-12 9
  10. 10. Seminário cakePHP2011/2012 Instalação pp/Config/core.php imezone • date_default_timezone_set(UTC); ecurity.salt - texto aleatório utilizado para os metodos de criptografia de segurança. • Alterar para um valor diferente. ecurity.cipherSeed - Uma sequência númerica aleatória (somente dígitos) usada para Arlindo Santos 09-05-12 10
  11. 11. Seminário cakePHP2011/2012 Instalação• Activação do mod::rewrite. – http:// book.cakephp.org/2.0/pt/installation/advanced-installation.html – mod_rewrite é um módulo do apache que é responsável pela reescrita de urls, e tormas estas mais amigáveis para o utilizador – Para que a dica deste post funcione é necessário que este módulo esteja ativo no servidor apache. – Associado a este conceito existe um ficheiro chamado .htaccess onde ´´e possível escrever as reguintes regras: RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)$ index.php?page=$1 Arlindo Santos 09-05-12 11
  12. 12. Seminário cakePHP 2011/2012 Base de dados: considerações• Todas as tabelas devem estar no plural – Ex: Utilizadores, Comentarios• A chave primária para todas as tabelas deve ser o campo “id” – Preferencialmente estes campos devem ter algum mecanismo de geração de códigos-fonte, como a opção auto_increment do MySQL.• Chave estrangeira no singular – Para utilizar chave estrangeira, esta deve possuir nome da tabela no singular acrescido do campo “id”. Exemplo: utilizador_id.• Relacionamento de n-n deve ser organizado em ordem alfabética – Primeiro nome no singular acrescido de um “_” e o nome da segunda tabela no plural. Exemplo: livro_utilizadores. Arlindo Santos 09-05-12 12
  13. 13. Seminário cakePHP2011/2012 Criar um site - BLOG• http://book.cakephp.org/2.0/pt/getting-started.html• MySQL – Criar uma base de dados “blog” – Executar o seguinte código SQL no mysqladmin: -- Primeiro, criamos nossa tabela de posts CREATE TABLE posts ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL ); -- Agora inserimos alguns posts para testar INSERT INTO posts (title, body, created) VALUES (The title, This is the post body., NOW()); INSERT INTO posts (title, body, created) VALUES (A title once again, And the post body follows., NOW()); INSERT INTO posts (title, body, created) VALUES (Title strikes back, This is really exciting! Not., NOW()); Arlindo Santos 09-05-12 13
  14. 14. Seminário cakePHP2011/2012 Criar um site - BLOG• Configuração da base de dados – /app/Config/database.php.default. • Copie este ficheiro no mesmo diretório renomeando-o para database.php. • Configure com os dados corretos. public $default = array( datasource => Database/Mysql, persistent => false, host => localhost, port => , login => ‘?, password => ‘?, database => ‘blog, schema => , prefix => , encoding => ); Veja o que aconteceu ao seu site! Não tem erros! Arlindo Santos 09-05-12 14
  15. 15. Seminário cakePHP2011/2012 Criar um site - BLOG• Crie um Model Post – /app/Model/Post.php • Insira o seguinte código: class Post extends AppModel { public $name = Post; }• A nomenclatura da classe segue uma convenção que é muito importante no CakePHP. – Se o model é Post, o CakePHP pode deduz que será usado um PostsController, e que manipulará os dados de uma tabela da base de dados chamada posts. Arlindo Santos 09-05-12 15
  16. 16. Seminário cakePHP 2011/2012 Criar um site - BLOG• Crie um Controller Post – /app/Controller/PostsController.php • Insira o seguinte código: class PostsController extends AppController { public $helpers = array (Html,Form); public $name = Posts; function index() { $this->set(posts, $this->Post->find(all)); } } • Definindo a função index() em nosso PostsController, os utilizadores podem aceder visitando o endereço www.exemplo.com/posts/index • De maneira semelhante, se definirmos um método chamado foobar() dentro do controller, os utilizadores deveriam ser capazes de acede-lo pelo endereço www.exemplo.com/posts/foobar Arlindo Santos 09-05-12 16
  17. 17. Seminário cakePHP2011/2012 Criar um site - BLOG• Crie um View Post – Os ficheiros de view do Cake são armazenados na pasta /app/View dentro de uma pasta com o mesmo nome do controller. – O nome do ficheiro deve ter o mesmo nome da action. Arlindo Santos 09-05-12 17
  18. 18. Seminário cakePHP 2011/2012 Criar um site - BLOG• Crie um View Post – Insira o seguinte código: <!-- File: /app/View/Posts/index.ctp --> <h1>Posts do Blog</h1> <table> <tr> <th>Id</th> <th>Título</th> <th>Data de Criação</th> </tr> <!-- Aqui é onde nós percorremos nossa matriz $posts, imprimindo as informações dos posts --> <?php foreach ($posts as $post): ?> <tr> <td><?php echo $post[Post][id]; ?></td> <td> <?php echo $this->Html->link($post[Post][title], array(controller => posts, action => view, $post[Post][id])); ?> </td> <td><?php echo $post[Post][created]; ?></td> </tr> <?php endforeach; ?> </table> Arlindo Santos 09-05-12 18
  19. 19. Seminário cakePHP2011/2012 Criar um site - BLOG• Testar: – http://localhost/cake/posts• Clicar no links… – http://localhost/cake/posts/view/1 – Dá erro, pois… resolver… – Está à espera que existe uma action view, e como consequência, uma página view.ctp. Também é enviado um parâmetro com o valor 1.• Importante reconhecer esta sintaxe: – url/{action}/{param1}/{param2}/{param3}/… Arlindo Santos 09-05-12 19
  20. 20. Seminário cakePHP 2011/2012 Criar um site - BLOG• Acrescentar o código no controller public function view($id = null) { $this->Post->id = $id; $this->set(post, $this->Post->read()); }• Criar um novo view <!-- File: /app/View/Posts/view.ctp --> <h1><?php echo $post[Post][title]?></h1> <p><small>Created: <?php echo $post[Post][created]?></small></p> <p><?php echo $post[Post][body]?></p> Arlindo Santos 09-05-12 20
  21. 21. Seminário cakePHP2011/2012 Criar um site - BLOG• Testar: – http://localhost/cake/posts Arlindo Santos 09-05-12 21
  22. 22. Seminário cakePHP2011/2012 Criar um site - BLOG• Adiciona Posts – Controller • Insira o seguinte código: … public function add() { if ($this->request->is(post)) { if ($this->Post->save($this->request->data)) { $this->Session->setFlash(Your post has been saved.); $this->redirect(array(action => index)); } } } – $this->request->data – Dados enviados pelo formulário. Arlindo Santos 09-05-12 22
  23. 23. Seminário cakePHP2011/2012 Criar um site - BLOG• Adiciona Posts – Controller: • Para trabalhar com sessões o componente SessionComponent e o helper SessionHelper são necessários. • O componente Session já inclui tudo! <?php class PostsController extends AppController { public $components = array(Session); … Arlindo Santos 09-05-12 23
  24. 24. Seminário cakePHP2011/2012 Criar um site - BLOG• Crie um View Post - Adicionar um POST – /app/View/Post/add.php • Insira o seguinte código: <!-- File: /app/View/Posts/add.ctp --> <h1>Add Post</h1> <?php //<form id="PostAddForm" method="post" action="/posts/add"> echo $this->Form->create(Post); echo $this->Form->input(title); echo $this->Form->input(body, array(rows => 3)); echo $this->Form->end(Save Post); ?> – /app/View/Post/index.ctp • Insira o seguinte código: <?php echo $this->Html->link(Add Post, array(controller => posts, action => add)); ?> Arlindo Santos 09-05-12 24
  25. 25. Seminário cakePHP 2011/2012 Criar um site - BLOG• Validação dos dados submetidos pelo utilizador – Rules • http://book.cakephp.org/1.3/view/1143/Data-Validation • http://book.cakephp.org/2.0/en/models/data-validation.html – Model • Insira o seguinte código: class Post extends AppModel { public $name = Post; public $validate = array( title => array( rule => notEmpty ), body => array( rule => notEmpty ) ); } Arlindo Santos 09-05-12 25
  26. 26. Seminário cakePHP2011/2012 Criar um site - BLOG• Editar Post – Controller function edit($id = null) { $this->Post->id = $id; if ($this->request->is(get)) { $this->request->data = $this->Post->read(); } else { if ($this->Post->save($this->request->data)) { $this->Session->setFlash(Your post has been updated.); $this->redirect(array(action => index)); } } } Arlindo Santos 09-05-12 26
  27. 27. Seminário cakePHP2011/2012 Criar um site - BLOG• Crie um View Post – Editar um Post – /app/View/Post/edit.php • Insira o seguinte código: <!-- File: /app/View/Posts/edit.ctp --> <h1>Edit Post</h1> <?php echo $this->Form->create(Post, array(action => edit)); echo $this->Form->input(title); echo $this->Form->input(body, array(rows => 3)); echo $this->Form->input(id, array(type => hidden)); //muito importante!!! echo $this->Form->end(Save Post); ?> Arlindo Santos 09-05-12 27
  28. 28. Seminário cakePHP 2011/2012 Criar um site - BLOG• Editar a View Post para permitir que utilizador realize as ações: <!-- File: /app/View/Posts/index.ctp (links para edição adicionados) --> <h1>Blog posts</h1> <p><?php echo $this->Html->link("Add Post", array(action => add)); ?></p> <table> <tr> <th>Id</th> <th>Title</th> <th>Action</th> <th>Created</th> </tr> <!-- Aqui é onde nós percorremos nossa matriz $posts, imprimindo as informações dos posts --> <?php foreach ($posts as $post): ?> <tr> <td><?php echo $post[Post][id]; ?></td> <td> <?php echo $this->Html->link($post[Post][title], array(action => view, $post[Post][id]));?> </td> <td> <?php echo $this->Form->postLink( Delete, array(action => delete, $post[Post][id]), array(confirm => Are you sure?) )?> <?php echo $this->Html->link(Edit, array(action => edit, $post[Post][id]));?> </td> <td><?php echo $post[Post][created]; ?></td> </tr> <?php endforeach; ?> </table> Arlindo Santos 09-05-12 28
  29. 29. Seminário cakePHP2011/2012 Criar um site - BLOG• Apagar o Post – Controller: function delete($id) { if (!$this->request->is(post)) { throw new MethodNotAllowedException(); } if ($this->Post->delete($id)) { $this->Session->setFlash(The post with id: . $id . has been deleted.); $this->redirect(array(action => index)); } } – Se o utilizador tentar apagar usando uma requisição do tipo GET, é criada uma excepção – questões de segurança!!! – O helper FormHelper fornece o método postLink() Arlindo Santos 09-05-12 29
  30. 30. Seminário cakePHP2011/2012 Criar um site - BLOG• Router (redirecionamento) – /app/Config/routes.php Router::connect(/, array(controller => posts, action => index)); – Tornar a URL mais amigável para o utilizador – Neste exemplo, retira-se a necessidade de adicionar “posts” na URL Arlindo Santos 09-05-12 30
  31. 31. Seminário cakePHP2011/2012 Criar um site - BLOG• Testar: – http://localhost/cake – E agora … questões? • E se eu pretender fazer …. Arlindo Santos 09-05-12 31
  32. 32. Seminário cakePHP 2011/2012 Criar um site - BLOG• Exercícios: 1. Criar uma página “Olá mundo” quando o utilizador digita a URL “http://localhost/cake/welcome/ 4. Posts: • Permitir que o utilizador possa introduzir uma tag associadas a cada post. • Permitir que o utilizador possa introduzir várias tags associadas a cada post. Nota: 1. Planear 2. Model 3. Controller 4. View Arlindo Santos 09-05-12 32
  33. 33. Seminário cakePHP2011/2012 Criar um site - BLOG• Autenticação http://book.cakephp.org/2.0/pt/tutorials-and-examples/blog Arlindo Santos 09-05-12 33
  34. 34. Seminário cakePHP2011/2012 Criar um site - BLOG• Autenticação – E se o BLOG permite múltiplos utilizadores? – Então: • Criar a tabela • Criar o model – Validação. • Criar o Controller – Componente Auth – Método beforefilter: será chamado antes de cada ação. – É possível editar o AppController! – Definir regras de autotrização • Criar os Views Arlindo Santos 09-05-12 34
  35. 35. Seminário cakePHP2011/2012 Criar um site - BLOG <?php // app/Controller/UsersController.php class UsersController extends AppController { public function beforeFilter() { parent::beforeFilter(); $this->Auth->allow(register, login); // Letting users register themselves } public function login() { if ($this->Auth->login()) { $this->Session->write(user, $this->Auth->user()); $this->redirect($this->Auth->redirect()); } else { $this->Session->setFlash(__(Invalid username or password, try again)); } } public function logout() { $this->Session->destroy(user); $this->redirect($this->Auth->logout()); } public function register() { if ($this->request->is(post)) { $this->User->create(); if ($this->User->save($this->request->data)) { $this->Session->setFlash(__(The user has been saved)); $this->redirect(array(controller =>posts, action => index)); } else { $this->Session->setFlash(__(The user could not be saved. Please, try again.)); } } } } ?> Arlindo Santos 09-05-12 35
  36. 36. Seminário cakePHP2011/2012 Criar um site - BLOG <?php // app/Model/User.php App::uses(AuthComponent, Controller/Component); class User extends AppModel { public $name = User; public $validate = array( username => array( required => array( rule => array(notEmpty), message => A username is required ) ), password => array( required => array( rule => array(notEmpty), message => A password is required ) ), role => array( valid => array( rule => array(inList, array(admin, author)), message => Please enter a valid role, allowEmpty => false ) ) ); public function beforeSave() { if (isset($this->data[$this->alias][password])) { $this->data[$this->alias][password] = AuthComponent::password($this->data[$this->alias][password]); } return true; } } ?> Arlindo Santos 09-05-12 36
  37. 37. Seminário cakePHP2011/2012 Criar um site - BLOG <!-- File: /app/View/Posts/index.ctp (links para edição adicionados) --> <?php $user = $this->Session->read(user); print_r($user); if(isset($user)) { $user = $this->Session->read(user); echo "Olá ".$user[username] ; echo "<br>"; echo $this->Html->link(Add Post, array(controller => posts, action => add)); echo " | "; echo $this->Html->link(Logout, array(controller => users, action => logout)); } else { echo "Olá anónimo"; echo "<br>"; echo $this->Html->link(Login, array(controller => users, action => login)); echo " | "; echo $this->Html->link(Register, array(controller => users, action => register)); } ?> <h1>Posts do Blog</h1> <table> <tr> <th>Id</th> <th>Título</th> <th>Data de Criação</th> </tr> <!-- Aqui é onde nós percorremos nossa matriz $posts, imprimindo as informações dos posts --> <?php foreach ($posts as $line): print_r($line); ?> <tr> <td><?php echo $line[Post][id]; ?></td> <td> <?php echo $this->Html->link($line[Post][title], array(controller => posts, action => view, $line[Post][id])); ?> ( <?php if(isset($user)) { if($user["id"] == $line[Post][user_id] || strcmp($user["role"], "admin")==0) { echo $this->Html->link("editar",array(controller => posts, action => edit, $line[Post][id])); echo " | "; echo $this->Form->postLink( Delete, array(action => delete, $line[Post][id]), array(confirm => Are you sure?)); } } ?> ) </td> <td><?php echo $line[Post][created]; ?></td> </tr> <?php endforeach; ?> </table> Arlindo Santos 09-05-12 37
  38. 38. Seminário cakePHP2011/2012 Criar um site - BLOG <!-- app/View/Users/register.ctp --> <div class="users form"> <?php echo $this->Form->create(User);?> <fieldset> <legend><?php echo __(Register User); ?></legend> <?php echo $this->Form->input(username); echo $this->Form->input(password); echo $this->Form->input(role, array( options => array(admin => Admin, author => Author) )); ?> </fieldset> <?php echo $this->Form->end(__(Submit));?> </div> Arlindo Santos 09-05-12 38
  39. 39. Seminário cakePHP2011/2012 Criar um site - BLOG <!-- app/View/Users/login.ctp --> <div class="users form"> <?php echo $this->Session->flash(auth); ?> <?php echo $this->Form->create(User);?> <fieldset> <legend><?php echo __(Please enter your username and password); ?></legend> <?php echo $this->Form->input(username); echo $this->Form->input(password); ?> </fieldset> <?php echo $this->Form->end(__(Login));?> </div> Arlindo Santos 09-05-12 39
  40. 40. Seminário cakePHP2011/2012 Layouts• Como alterar o layout? – http://book.cakephp.org/2.0/en/views.html – Temos: • views – Já sabemos como funciona. • elements • layouts • helpers Arlindo Santos 09-05-12 40
  41. 41. Seminário cakePHP 2011/2012 Layouts• Altera o layout – /app/View/Layouts/default.ctp. – É possível ter vários layouts e atribuir os títulos dinamicamente. <?php class UsersController extends AppController { public function view_active() { $this->set(title_for_layout, View Active Users); $this->layout = default_small_ad; } public function view_image() { $this->layout = image; //output user image } } Arlindo Santos 09-05-12 41
  42. 42. Seminário cakePHP 2011/2012 Layouts• Elements – /app/View/Elements – Incluir do views/posts/index.ctp <?php echo $this->element(menu_top); ?> – E criar o Views/Elements/menu_top.ctp <?php $user = $this->Session->read(user); print_r($user); if(isset($user)) { $user = $this->Session->read(user); echo "Olá ".$user[username] ; echo "<br>"; echo $this->Html->link(Add Post, array(controller => posts, action => add)); echo " | "; echo $this->Html->link(Logout, array(controller => users, action => logout)); } else { echo "Olá anónimo"; echo "<br>"; echo $this->Html->link(Login, array(controller => users, action => login)); echo " | "; echo $this->Html->link(Register, array(controller => users, action => register)); } ?> Arlindo Santos 09-05-12 42
  43. 43. Seminário cakePHP2011/2012 Layouts• Elements – Caching Elements <?php echo $this->element(‘menu_top, array(), array(cache => true)); ?> – E podem ser passadas variáveis! Ex: <?php echo $this->element(‘menu_top, array( "text" => “olá." )); Arlindo Santos 09-05-12 43
  44. 44. Seminário cakePHP2011/2012 Layouts• Extender views – Caching Elements <!-- File: /app/View/Common/view.ctp --> <h1>Title: <?php echo $this->fetch(title); ?></h1> <?php echo $this->fetch(content); ?> <div class="actions"> <h3>Related actions</h3> <ul> <?php echo $this->fetch(sidebar); ?> </ul> </div> Arlindo Santos 09-05-12 44
  45. 45. Seminário cakePHP 2011/2012 Layouts• Extender views – Caching Elements <!-- File: /app/View/Posts/view.ctp --> <?php $this->extend(/Common/view); $this->assign(title, $post[Post][title]); $this->start(sidebar); ?> <li><?php echo $this->Html->link(edit, array( action => edit, $post[Post][id] )); ?> </li> <?php $this->end(); ?> <p><small>Created: <?php echo $post[Post][created]?></small></p> <p><?php echo $post[Post][body]?></p> Arlindo Santos 09-05-12 45
  46. 46. Seminário cakePHP 2011/2012 Layouts• Substituir blocos … – no view <?php /$this->Html->script(carousel, array(inline => false)); $this->Html->css(carousel, null, array(inline => false)); ?> – no layout <!DOCTYPE html> <html lang="en"> <head> <title><?php echo $this->fetch(title); ?></title> <?php echo $this->fetch(script); ?> <?php echo $this->fetch(css); ?> </head> // … Arlindo Santos 09-05-12 46
  47. 47. Seminário cakePHP 2011/2012 Criar um site - BLOG• Exercícios: 1. Não permitir o registo duplicado de utilizadores 3. Cada utilizador poderá consultar informação sobre os outros utilizadores 5. Alterar completamente o layout da página Arlindo Santos 09-05-12 47

×