Table des matières
CakePHP 1.3
Cette page contient de l'information à propos de CakePHP 1.3.
Création d'un MVC
Modèle
Nom du fichier | nomdumodele.php | Au singulier, exemple pour le modèle User sera user.php |
---|---|---|
Répertoire | /app/models |
<?php class User extends AppModel { var $name = 'User'; var $validate = array( 'firstname' => array( 'rule' => 'notEmpty' ), 'lastname' => array( 'rule' => 'notEmpty' ) ); } ?>
Controller
Nom du fichier | nomdumodeles_controller.php | Au pluriel, exemple pour le modèle User sera users_controller.php |
---|---|---|
Répertoire | /app/controllers |
Actions
<?php class UsersController extends AppController { var $helpers = array ('Html','Form'); var $name = 'Users'; function index() { $this->set('users', $this->User->find('all')); } function view($id = null) { $this->User->id = $id; $this->set('user', $this->User->read()); } function add() { if (!empty($this->data)) { if ($this->User->save($this->data)) { $this->Session->setFlash('The user has been saved.'); $this->redirect(array('action' => 'index')); } } } function delete($id) { if ($this->User->delete($id)) { $this->Session->setFlash('The user with id: ' . $id . ' has been deleted.'); $this->redirect(array('action' => 'index')); } } function edit($id = null) { $this->User->id = $id; if (empty($this->data)) { $this->data = $this->User->read(); } else { if ($this->User->save($this->data)) { $this->Session->setFlash('Your user has been updated.'); $this->redirect(array('action' => 'index')); } } } } ?>
Supprimer
Marquer un enregistrement « supprimé » sans le supprimer :
function supprimer($id = null) { $this->Membre->id = $id; $membre = $this->Membre->read(); $membre['Membre']['supprime'] = true; if ($this->Membre->save($membre)) { $this->Session->setFlash('Le membre a été supprimé.'); $this->redirect(array('action' => 'index')); } }
Vues
Nom du fichier | nomdumodele.php | Au singulier, exemple pour le modèle User sera user.php |
---|---|---|
Répertoire | /app/views/nomdumodeles |
Index
<!-- File: /app/views/users/index.ctp --> <h1>User Lists</h1> <table> <tr> <th>Id</th> <th>Name</th> <th>Action</th> <th>Created</th> </tr> <!-- Here is where we loop through our $posts array, printing out post info --> <?php foreach ($users as $user): ?> <tr> <td><?php echo $user['User']['id']; ?></td> <td><?php echo $this->Html->link($user['User']['firstname'], array('controller' => 'users', 'action' => 'view', $user['User']['id'])); ?></td> <td><?php echo $this->Html->link('Delete', array('action' => 'delete', $user['User']['id']), null, 'Are you sure?')?><?php echo $this->Html->link('Edit', array('action' => 'edit', $user['User']['id']));?></td> <td><?php echo $user['User']['created']; ?></td> </tr> <?php endforeach; ?> </table>
View
<!-- File: /app/views/users/view.ctp --> <h1><?php echo $user['User']['firstname']?></h1> <p><small>Created: <?php echo $user['User']['created']?></small></p> <p><?php echo $user['User']['lastname']?></p>
Ajouter
<!-- File: /app/views/users/add.ctp --> <h1>Add User</h1> <?php echo $this->Form->create('User'); echo $this->Form->input('firstname'); echo $this->Form->input('lastname'); echo $this->Form->end('Save Post'); ?>
Supprimer
Pas besoin de vue, peut se faire à partir d'une liste des modèles (index.ctp
).
Éditer
<!-- File: /app/views/users/edit.ctp --> <h1>Edit User</h1> <?php echo $this->Form->create('User', array('action' => 'edit')); echo $this->Form->input('firstname'); echo $this->Form->input('lastname'); echo $this->Form->input('id', array('type' => 'hidden')); echo $this->Form->end('Save User'); ?>
CSS
Pour un fichier CSS qui se trouve dans /app/webroot/css/style.css
, insérer dans le layout :
<?php echo $this->Html->css('style'); ?>
Vue détaillée avec URL d'une chaine
Au lieu d'avoir un URL dans le style posts/view/1
, il serait mieux d'avoir un URL dans la forme posts/view/titre_du_post
pour les engins de recherche.
Pour se faire :
- Ajouter un champ dans la table
posts
de la base de données qui sera appelétitle_url
.- Note :
title_url
est le titre formaté pour les URLs (on enlève les espaces, les accents, etc.)
- Après, dans le controleur
Posts
, ajouter la fonctionview
:public function view($title_url = null) { $this->set('post', $this->Post->findByTitleUrl($title_url)); }
- Il ne reste plus qu'à créer la vue
view.ctp
, si ce n'est pas déjà fait.
Components
Auth
Session
$session->read('Auth.User') $session->read('Auth.User.username')
Helpers
Session
setFlash()
Depuis la version 1.3, il faut faire un echo
et appeler la fonction flash()
qui retournera une chaîne dans la vue (layout
) :
echo $session->flash();
Core Helpers
HTML
Liens et images
echo $html->link( $html->image('beers/beer_no_image_186.png', array('class' => 'beer-view-image', 'alt' => 'Beer image', 'width'=>'93','height'=>'155') ), array('controller'=>'images', 'action' => 'add/Beer/'.$beer['Beer']['id']), array('escape' => false) );
L'option 'escape' => false
est nécessaire parce que c'est ce qui permet de laisser le code HTML, celui de l'image, dans le titre du lien.
Le code suivant est préférable (pris de book.cakephp.org
) :
<?php echo $this->Html->image("recipes/6.jpg", array( "alt" => "Brownies", 'url' => array('controller' => 'recipes', 'action' => 'view', 6) )); ?>
Time
$time->timeAgoInWords($post['Post']['created']);
Core Utility Library
Strings
Pour les chaines avec mots clés en plus de la localisation :
String::insert(__('Information for :username', true), array('username' => $user['User']['username']));
Encodage
Si les vues ont l'UTF-8 par défaut, que la base de données utilise l'UTF-8 aussi, et que les caractères accentués ne s'affichent pas correctement, il suffit d'ajouter1) dans app/config/database.php
:
'encoding' => 'utf8'
dans la configuration de la base de données.
Notes intéressantes
Classe de configuration
On peut créer une classe de configuration pour y déposer des constantes et qui soit accessible de partout.
<?php Configure::read('debug'); ?>
Problèmes
Pages d'erreur
app/View/Errors/pdo_error.ctp
app/View/Errors/missing_view.ctp
Redirection erronée
S'il y a une erreur suite à la soumission d'un formulaire, par exemple :
Warning (2): Cannot modify header information - headers already sent by (output started at /var/www/app/cake/basics.php:655) [CORE/cake/libs/controller/controller.php, line 746]
il se peut que ce soit un problème avec la fonction de traduction __()
2). Il faut alors spécifier false
pour le paramètre $return
3).
$this->Session->setFlash(__('Le billet a été sauvegardé.', true));