SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
Seminário 2011/2012
cakePHP
Arlindo Santos (acsantos@ipb.pt)
Seminário   cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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     cakePHP
2011/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                 cakePHP
2011/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    cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/2012
            Criar um site - BLOG

• Testar:
  – http://localhost/cake/posts




                                  Arlindo Santos   09-05-12   21
Seminário    cakePHP
2011/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   cakePHP
2011/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       cakePHP
2011/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   cakePHP
2011/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    cakePHP
2011/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       cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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       cakePHP
2011/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                  cakePHP
2011/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                cakePHP
2011/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                                    cakePHP
2011/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      cakePHP
2011/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     cakePHP
2011/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    cakePHP
2011/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   cakePHP
2011/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   cakePHP
2011/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

Mais conteúdo relacionado

Mais procurados

Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLFabio Moura Pereira
 
CakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloCakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloelliando dias
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpRodrigo Aramburu
 
Apresentando o Yii Framework
Apresentando o Yii FrameworkApresentando o Yii Framework
Apresentando o Yii Frameworkangellicacardozo
 
Desenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsDesenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsIgo Coelho
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend FrameworkJaime Neto
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...Aryel Tupinambá
 
Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...
Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...
Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...Anyssa Ferreira
 
Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2Thyago Maia
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLtarginosilveira
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetosFrancisco Santos
 

Mais procurados (20)

Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTML
 
CakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloCakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro bolo
 
Html5 Aula 5
Html5 Aula 5Html5 Aula 5
Html5 Aula 5
 
Aula Ruby
Aula RubyAula Ruby
Aula Ruby
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 
Apresentando o Yii Framework
Apresentando o Yii FrameworkApresentando o Yii Framework
Apresentando o Yii Framework
 
Desenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsDesenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e Servlets
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend Framework
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
 
Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...
Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...
Instalando o WordPress local em qualquer sistema operacional - Anyssa Ferreir...
 
Framework Yii
Framework YiiFramework Yii
Framework Yii
 
HTML5 & CSS3
HTML5 & CSS3HTML5 & CSS3
HTML5 & CSS3
 
Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
Web Sphere
Web SphereWeb Sphere
Web Sphere
 
Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOL
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetos
 

Destaque

Scrum en quelques minutes
Scrum en quelques minutesScrum en quelques minutes
Scrum en quelques minutesFabrice Aimetti
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T IIHerdwangerSV
 
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaSemana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaManuel Menezes de Sequeira
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Daniel Rehn
 
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Daniel Rehn
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27domidp
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipmanjonesshipman
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tFrancois Ostyn
 
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...dbi services
 
Presentació assamblea
Presentació assamblea Presentació assamblea
Presentació assamblea FC Barcelona
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2dmc digital media center GmbH
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxElton Minetto
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.MongoDB
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?iniciativaverds
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Daniel Rehn
 

Destaque (20)

Scrum en quelques minutes
Scrum en quelques minutesScrum en quelques minutes
Scrum en quelques minutes
 
NotORM
NotORMNotORM
NotORM
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T II
 
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaSemana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
 
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
 
Einführung in SCRUM
Einführung in SCRUMEinführung in SCRUM
Einführung in SCRUM
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
 
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
 
Presentació assamblea
Presentació assamblea Presentació assamblea
Presentació assamblea
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
 
MySQL Query Optimization
MySQL Query OptimizationMySQL Query Optimization
MySQL Query Optimization
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
 
Digitale Mentalität II
Digitale Mentalität IIDigitale Mentalität II
Digitale Mentalität II
 
Tutorialphpmyadmin
TutorialphpmyadminTutorialphpmyadmin
Tutorialphpmyadmin
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
 

Semelhante a CakePHP seminário sobre o framework

Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraDavid O'Keefe
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorAllyson Barros
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 
Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPelliando dias
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkFlávio Lisboa
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPMarcelo Andrade
 
4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdf4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdfRubenManhia
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Linguagem PHP para principiantes
Linguagem PHP para principiantesLinguagem PHP para principiantes
Linguagem PHP para principiantesMarco Pinheiro
 

Semelhante a CakePHP seminário sobre o framework (20)

Cake Php
Cake PhpCake Php
Cake Php
 
CakePHP
CakePHPCakePHP
CakePHP
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 Palestra
 
Crud
CrudCrud
Crud
 
De 1 a 1.000.00 de usuários
De 1 a 1.000.00 de usuáriosDe 1 a 1.000.00 de usuários
De 1 a 1.000.00 de usuários
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Tema 1 | Introdução a PHP
Tema 1 | Introdução a PHPTema 1 | Introdução a PHP
Tema 1 | Introdução a PHP
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 
Python 08
Python 08Python 08
Python 08
 
Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHP
 
Desafio Rest API
Desafio Rest APIDesafio Rest API
Desafio Rest API
 
PHP 5.3 - Introdução
PHP 5.3 - IntroduçãoPHP 5.3 - Introdução
PHP 5.3 - Introdução
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 
4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdf4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdf
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Linguagem PHP para principiantes
Linguagem PHP para principiantesLinguagem PHP para principiantes
Linguagem PHP para principiantes
 

Mais de Arlindo Santos

Marketing Digital: tendências e estratégias
Marketing Digital: tendências e estratégiasMarketing Digital: tendências e estratégias
Marketing Digital: tendências e estratégiasArlindo Santos
 
Temas dos trabalhos práticos
Temas dos trabalhos práticosTemas dos trabalhos práticos
Temas dos trabalhos práticosArlindo Santos
 
Documento sobre o curso técnico superior profissional de Comunicação Digital
Documento sobre o curso técnico superior profissional de Comunicação DigitalDocumento sobre o curso técnico superior profissional de Comunicação Digital
Documento sobre o curso técnico superior profissional de Comunicação DigitalArlindo Santos
 
Conhecer os clientes e influenciadores
Conhecer os clientes e influenciadoresConhecer os clientes e influenciadores
Conhecer os clientes e influenciadoresArlindo Santos
 
Workshop sobre o Prezi na Escola Secundária de Valpaços
Workshop sobre o Prezi na Escola Secundária de ValpaçosWorkshop sobre o Prezi na Escola Secundária de Valpaços
Workshop sobre o Prezi na Escola Secundária de ValpaçosArlindo Santos
 
Gestão web sites - visão para além das questões técnicas
Gestão web sites  - visão para além das questões técnicasGestão web sites  - visão para além das questões técnicas
Gestão web sites - visão para além das questões técnicasArlindo Santos
 
Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento webArlindo Santos
 
Motivação para a multimédia
Motivação para a multimédiaMotivação para a multimédia
Motivação para a multimédiaArlindo Santos
 
Guia da Gestão de Projectos Web
Guia da Gestão de Projectos WebGuia da Gestão de Projectos Web
Guia da Gestão de Projectos WebArlindo Santos
 

Mais de Arlindo Santos (12)

Marketing Digital: tendências e estratégias
Marketing Digital: tendências e estratégiasMarketing Digital: tendências e estratégias
Marketing Digital: tendências e estratégias
 
Mobile marketing
Mobile marketingMobile marketing
Mobile marketing
 
Temas dos trabalhos práticos
Temas dos trabalhos práticosTemas dos trabalhos práticos
Temas dos trabalhos práticos
 
Documento sobre o curso técnico superior profissional de Comunicação Digital
Documento sobre o curso técnico superior profissional de Comunicação DigitalDocumento sobre o curso técnico superior profissional de Comunicação Digital
Documento sobre o curso técnico superior profissional de Comunicação Digital
 
Conhecer os clientes e influenciadores
Conhecer os clientes e influenciadoresConhecer os clientes e influenciadores
Conhecer os clientes e influenciadores
 
Workshop sobre o Prezi na Escola Secundária de Valpaços
Workshop sobre o Prezi na Escola Secundária de ValpaçosWorkshop sobre o Prezi na Escola Secundária de Valpaços
Workshop sobre o Prezi na Escola Secundária de Valpaços
 
Dtd
DtdDtd
Dtd
 
Gestão web sites - visão para além das questões técnicas
Gestão web sites  - visão para além das questões técnicasGestão web sites  - visão para além das questões técnicas
Gestão web sites - visão para além das questões técnicas
 
Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento web
 
Motivação para a multimédia
Motivação para a multimédiaMotivação para a multimédia
Motivação para a multimédia
 
Arduino
ArduinoArduino
Arduino
 
Guia da Gestão de Projectos Web
Guia da Gestão de Projectos WebGuia da Gestão de Projectos Web
Guia da Gestão de Projectos Web
 

Último

organizaao-do-clube-de-lideres-ctd-aamar_compress.pdf
organizaao-do-clube-de-lideres-ctd-aamar_compress.pdforganizaao-do-clube-de-lideres-ctd-aamar_compress.pdf
organizaao-do-clube-de-lideres-ctd-aamar_compress.pdfCarlosRodrigues832670
 
POETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptx
POETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptxPOETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptx
POETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptxJMTCS
 
6°ano Uso de pontuação e acentuação.pptx
6°ano Uso de pontuação e acentuação.pptx6°ano Uso de pontuação e acentuação.pptx
6°ano Uso de pontuação e acentuação.pptxErivaldoLima15
 
Dança Contemporânea na arte da dança primeira parte
Dança Contemporânea na arte da dança primeira parteDança Contemporânea na arte da dança primeira parte
Dança Contemporânea na arte da dança primeira partecoletivoddois
 
Apresentação sobre o Combate a Dengue 2024
Apresentação sobre o Combate a Dengue 2024Apresentação sobre o Combate a Dengue 2024
Apresentação sobre o Combate a Dengue 2024GleyceMoreiraXWeslle
 
parte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
parte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzparte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
parte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzAlexandrePereira818171
 
Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...
Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...
Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...nexocan937
 
Junto ao poço estava eu Quando um homem judeu Viu a sede que havia em mim
Junto ao poço estava eu Quando um homem judeu Viu a sede que havia em mimJunto ao poço estava eu Quando um homem judeu Viu a sede que havia em mim
Junto ao poço estava eu Quando um homem judeu Viu a sede que havia em mimWashingtonSampaio5
 
Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...
Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...
Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...LuizHenriquedeAlmeid6
 
Aula 1, 2 Bacterias Características e Morfologia.pptx
Aula 1, 2  Bacterias Características e Morfologia.pptxAula 1, 2  Bacterias Características e Morfologia.pptx
Aula 1, 2 Bacterias Características e Morfologia.pptxpamelacastro71
 
DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...
DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...
DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...Martin M Flynn
 
Geometria 5to Educacion Primaria EDU Ccesa007.pdf
Geometria  5to Educacion Primaria EDU  Ccesa007.pdfGeometria  5to Educacion Primaria EDU  Ccesa007.pdf
Geometria 5to Educacion Primaria EDU Ccesa007.pdfDemetrio Ccesa Rayme
 
Linguagem verbal , não verbal e mista.pdf
Linguagem verbal , não verbal e mista.pdfLinguagem verbal , não verbal e mista.pdf
Linguagem verbal , não verbal e mista.pdfLaseVasconcelos1
 
PLANEJAMENTO anual do 3ANO fundamental 1 MG.pdf
PLANEJAMENTO anual do  3ANO fundamental 1 MG.pdfPLANEJAMENTO anual do  3ANO fundamental 1 MG.pdf
PLANEJAMENTO anual do 3ANO fundamental 1 MG.pdfProfGleide
 
A população Brasileira e diferença de populoso e povoado
A população Brasileira e diferença de populoso e povoadoA população Brasileira e diferença de populoso e povoado
A população Brasileira e diferença de populoso e povoadodanieligomes4
 
Revolução Industrial - Revolução Industrial .pptx
Revolução Industrial - Revolução Industrial .pptxRevolução Industrial - Revolução Industrial .pptx
Revolução Industrial - Revolução Industrial .pptxHlioMachado1
 
O guia definitivo para conquistar a aprovação em concurso público.pdf
O guia definitivo para conquistar a aprovação em concurso público.pdfO guia definitivo para conquistar a aprovação em concurso público.pdf
O guia definitivo para conquistar a aprovação em concurso público.pdfErasmo Portavoz
 
TREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.ppt
TREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.pptTREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.ppt
TREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.pptAlineSilvaPotuk
 
atividades diversas 1° ano alfabetização
atividades diversas 1° ano alfabetizaçãoatividades diversas 1° ano alfabetização
atividades diversas 1° ano alfabetizaçãodanielagracia9
 

Último (20)

organizaao-do-clube-de-lideres-ctd-aamar_compress.pdf
organizaao-do-clube-de-lideres-ctd-aamar_compress.pdforganizaao-do-clube-de-lideres-ctd-aamar_compress.pdf
organizaao-do-clube-de-lideres-ctd-aamar_compress.pdf
 
“O AMANHÃ EXIGE O MELHOR DE HOJE” _
“O AMANHÃ EXIGE O MELHOR DE HOJE”       _“O AMANHÃ EXIGE O MELHOR DE HOJE”       _
“O AMANHÃ EXIGE O MELHOR DE HOJE” _
 
POETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptx
POETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptxPOETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptx
POETAS CONTEMPORANEOS_TEMATICAS_explicacao.pptx
 
6°ano Uso de pontuação e acentuação.pptx
6°ano Uso de pontuação e acentuação.pptx6°ano Uso de pontuação e acentuação.pptx
6°ano Uso de pontuação e acentuação.pptx
 
Dança Contemporânea na arte da dança primeira parte
Dança Contemporânea na arte da dança primeira parteDança Contemporânea na arte da dança primeira parte
Dança Contemporânea na arte da dança primeira parte
 
Apresentação sobre o Combate a Dengue 2024
Apresentação sobre o Combate a Dengue 2024Apresentação sobre o Combate a Dengue 2024
Apresentação sobre o Combate a Dengue 2024
 
parte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
parte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzparte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
parte indígena.pptxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
 
Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...
Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...
Minha Luta (Mein Kampf), A História do País que Lutou contra a União Soviétic...
 
Junto ao poço estava eu Quando um homem judeu Viu a sede que havia em mim
Junto ao poço estava eu Quando um homem judeu Viu a sede que havia em mimJunto ao poço estava eu Quando um homem judeu Viu a sede que havia em mim
Junto ao poço estava eu Quando um homem judeu Viu a sede que havia em mim
 
Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...
Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...
Slides Lição 3, Betel, Ordenança para congregar e prestar culto racional, 2Tr...
 
Aula 1, 2 Bacterias Características e Morfologia.pptx
Aula 1, 2  Bacterias Características e Morfologia.pptxAula 1, 2  Bacterias Características e Morfologia.pptx
Aula 1, 2 Bacterias Características e Morfologia.pptx
 
DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...
DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...
DIGNITAS INFINITA - DIGNIDADE HUMANA -Declaração do Dicastério para a Doutrin...
 
Geometria 5to Educacion Primaria EDU Ccesa007.pdf
Geometria  5to Educacion Primaria EDU  Ccesa007.pdfGeometria  5to Educacion Primaria EDU  Ccesa007.pdf
Geometria 5to Educacion Primaria EDU Ccesa007.pdf
 
Linguagem verbal , não verbal e mista.pdf
Linguagem verbal , não verbal e mista.pdfLinguagem verbal , não verbal e mista.pdf
Linguagem verbal , não verbal e mista.pdf
 
PLANEJAMENTO anual do 3ANO fundamental 1 MG.pdf
PLANEJAMENTO anual do  3ANO fundamental 1 MG.pdfPLANEJAMENTO anual do  3ANO fundamental 1 MG.pdf
PLANEJAMENTO anual do 3ANO fundamental 1 MG.pdf
 
A população Brasileira e diferença de populoso e povoado
A população Brasileira e diferença de populoso e povoadoA população Brasileira e diferença de populoso e povoado
A população Brasileira e diferença de populoso e povoado
 
Revolução Industrial - Revolução Industrial .pptx
Revolução Industrial - Revolução Industrial .pptxRevolução Industrial - Revolução Industrial .pptx
Revolução Industrial - Revolução Industrial .pptx
 
O guia definitivo para conquistar a aprovação em concurso público.pdf
O guia definitivo para conquistar a aprovação em concurso público.pdfO guia definitivo para conquistar a aprovação em concurso público.pdf
O guia definitivo para conquistar a aprovação em concurso público.pdf
 
TREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.ppt
TREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.pptTREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.ppt
TREINAMENTO - BOAS PRATICAS DE HIGIENE NA COZINHA.ppt
 
atividades diversas 1° ano alfabetização
atividades diversas 1° ano alfabetizaçãoatividades diversas 1° ano alfabetização
atividades diversas 1° ano alfabetização
 

CakePHP seminário sobre o framework

  • 2. Seminário cakePHP 2011/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. Seminário cakePHP 2011/2012 Fluxo - funcionamento Arlindo Santos 09-05-12 3
  • 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. 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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/2012 Criar um site - BLOG • Testar: – http://localhost/cake/posts Arlindo Santos 09-05-12 21
  • 22. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. 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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. 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. 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. Seminário cakePHP 2011/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. Seminário cakePHP 2011/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. 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. 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. 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