cakephp - framework de desenvolvimento de aplicações web em php
DESCRIPTION
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?TRANSCRIPT
Seminário 2011/2012
cakePHPArlindo Santos ([email protected])
cakePHPSeminário2011/2012
• 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
Start!
12-04-23Arlindo Santos 2
cakePHPSeminário2011/2012
Fluxo - funcionamento
12-04-23Arlindo Santos 3
cakePHPSeminário2011/2012
• 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.
Características
12-04-23Arlindo Santos 4
cakePHPSeminário2011/2012
• 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.
Características
12-04-23Arlindo Santos 5
cakePHPSeminário2011/2012
• 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.
Requisitos
12-04-23Arlindo Santos 6
cakePHPSeminário2011/2012
• /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
Organização dos directórios
12-04-23Arlindo Santos 7
cakePHPSeminário2011/2012
• 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
Passos para a instalação
12-04-23Arlindo Santos 8
cakePHPSeminário2011/2012
• 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
Instalação
12-04-23Arlindo Santos 9
cakePHPSeminário2011/2012
– app/Config/core.php– Timezone
• date_default_timezone_set('UTC');
– Security.salt - texto aleatório utilizado para os metodos de criptografia de segurança.
• Alterar para um valor diferente.
– Security.cipherSeed - Uma sequência númerica aleatória (somente dígitos) usada para criptografar/descriptografar strings.
• Alterar para um valor diferente.
Instalação
12-04-23Arlindo Santos 10
cakePHPSeminário2011/2012
• 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 OnRewriteCond %{SCRIPT_FILENAME} !-fRewriteCond %{SCRIPT_FILENAME} !-dRewriteRule ^(.*)$ index.php?page=$1
Instalação
12-04-23Arlindo Santos 11
cakePHPSeminário2011/2012
• 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.
Base de dados: considerações
12-04-23Arlindo Santos 12
cakePHPSeminário2011/2012
• 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 postsCREATE 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 testarINSERT 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());
Criar um site - BLOG
12-04-23Arlindo Santos 13
cakePHPSeminário2011/2012
• 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!
Criar um site - BLOG
12-04-23Arlindo Santos 14
cakePHPSeminário2011/2012
• 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.
Criar um site - BLOG
12-04-23Arlindo Santos 15
cakePHPSeminário2011/2012
• 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
Criar um site - BLOG
12-04-23Arlindo Santos 16
cakePHPSeminário2011/2012
• 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.
Criar um site - BLOG
12-04-23Arlindo Santos 17
cakePHPSeminário2011/2012
• 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>
Criar um site - BLOG
12-04-23Arlindo Santos 18
cakePHPSeminário2011/2012
• 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}/…
Criar um site - BLOG
12-04-23Arlindo Santos 19
cakePHPSeminário2011/2012
• 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>
Criar um site - BLOG
12-04-23Arlindo Santos 20
cakePHPSeminário2011/2012
• Testar:– http://localhost/cake/posts
Criar um site - BLOG
12-04-23Arlindo Santos 21
cakePHPSeminário2011/2012
• 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.
Criar um site - BLOG
12-04-23Arlindo Santos 22
cakePHPSeminário2011/2012
• 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!
<?phpclass PostsController extends AppController {
public $components = array('Session');…
Criar um site - BLOG
12-04-23Arlindo Santos 23
cakePHPSeminário2011/2012
• 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')); ?>
Criar um site - BLOG
12-04-23Arlindo Santos 24
cakePHPSeminário2011/2012
• 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' ) );}
Criar um site - BLOG
12-04-23Arlindo Santos 25
cakePHPSeminário2011/2012
• 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')); } }}
Criar um site - BLOG
12-04-23Arlindo Santos 26
cakePHPSeminário2011/2012
• 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');?>
Criar um site - BLOG
12-04-23Arlindo Santos 27
cakePHPSeminário2011/2012
• 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, imprimindoas 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>
Criar um site - BLOG
12-04-23Arlindo Santos 28
cakePHPSeminário2011/2012
• 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()
Criar um site - BLOG
12-04-23Arlindo Santos 29
cakePHPSeminário2011/2012
• 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
Criar um site - BLOG
12-04-23Arlindo Santos 30
cakePHPSeminário2011/2012
• Testar:– http://localhost/cake
– E agora … questões?• E se eu pretender fazer ….
Criar um site - BLOG
12-04-23Arlindo Santos 31
cakePHPSeminário2011/2012
• Exercícios:1. Criar uma página “Olá mundo” quando o utilizador digita a
URL “http://localhost/cake/welcome/
2. Posts:1. Permitir que o utilizador possa introduzir uma tag associadas a cada
post.2. Permitir que o utilizador possa introduzir várias tags associadas a
cada post.
Nota:1. Planear2. Model3. Controller4. View
Criar um site - BLOG
12-04-23Arlindo Santos 32
cakePHPSeminário2011/2012
• Autenticaçãohttp://book.cakephp.org/2.0/pt/tutorials-and-examples/blog-auth-example/auth.html
Criar um site - BLOG
12-04-23Arlindo Santos 33
cakePHPSeminário2011/2012
• 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
Criar um site - BLOG
12-04-23Arlindo Santos 34
cakePHPSeminário2011/2012
<?php// app/Controller/UsersController.phpclass 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.')); } } }}?>
Criar um site - BLOG
12-04-23Arlindo Santos 35
cakePHPSeminário2011/2012
<?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;
}
}?>
Criar um site - BLOG
12-04-23Arlindo Santos 36
cakePHPSeminário2011/2012
<!-- 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>
Criar um site - BLOG
12-04-23Arlindo Santos 37
cakePHPSeminário2011/2012
<!-- 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>
Criar um site - BLOG
12-04-23Arlindo Santos 38
cakePHPSeminário2011/2012
<!-- 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>
Criar um site - BLOG
12-04-23Arlindo Santos 39
cakePHPSeminário2011/2012
• Como alterar o layout?– http://book.cakephp.org/2.0/en/views.html
– Temos:• views – Já sabemos como funciona.• elements• layouts • helpers
Layouts
12-04-23Arlindo Santos 40
cakePHPSeminário2011/2012
• Altera o layout– /app/View/Layouts/default.ctp.– É possível ter vários layouts e atribuir os títulos dinamicamente.
<?phpclass 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 }}
Layouts
12-04-23Arlindo Santos 41
cakePHPSeminário2011/2012
• 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'));
}?>
Layouts
12-04-23Arlindo Santos 42
cakePHPSeminário2011/2012
• Elements– Caching Elements
<?php echo $this->element(‘menu_top', array(), array('cache' => true)); ?>
– E podem ser passadas variáveis! Ex:<?phpecho $this->element(‘menu_top', array( "text" => “olá."));
Layouts
12-04-23Arlindo Santos 43
cakePHPSeminário2011/2012
• 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>
Layouts
12-04-23Arlindo Santos 44
cakePHPSeminário2011/2012
• 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><?phpecho $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>
Layouts
12-04-23Arlindo Santos 45
cakePHPSeminário2011/2012
• 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> // …
Layouts
12-04-23Arlindo Santos 46
cakePHPSeminário2011/2012
• Exercícios:1. Não permitir o registo duplicado de utilizadores
2. Cada utilizador poderá consultar informação sobre os outros utilizadores
3. Alterar completamente o layout da página
Criar um site - BLOG
12-04-23Arlindo Santos 47