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 :

  1. 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.)
  2. Modifier le fichier app/config/routes.php et ajouter :
    Router::connect('/posts/:title_url', array('controller' => 'posts', 'action' => 'view'), array('pass'=>array('title_url')));
  3. Après, dans le controleur Posts, ajouter la fonction view :
    public function view($title_url = null) {
        $this->set('post', $this->Post->findByTitleUrl($title_url));
    }
  4. Maintenant on peut créer les liens dans le style :
    echo $html->link($post['Post']['title'], array('controller'=>'posts', 'action'=>'view', $post['Post']['title_url']));
  5. 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

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 $return3).

$this->Session->setFlash(__('Le billet a été sauvegardé.', true)); 

Ressources