• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 

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

on

  • 3,034 views

Apresentação da framework de desenvolvimento de aplicações web - cakePHP. ...

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?

Statistics

Views

Total Views
3,034
Views on SlideShare
3,034
Embed Views
0

Actions

Likes
2
Downloads
43
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Seminário 2011/2012cakePHPArlindo Santos (acsantos@ipb.pt)
    • 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
    • Seminário cakePHP2011/2012 Fluxo - funcionamento Arlindo Santos 09-05-12 3
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • Seminário cakePHP2011/2012 Criar um site - BLOG• Testar: – http://localhost/cake/posts Arlindo Santos 09-05-12 21
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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