Gestion automatique d’une colonne de tri avec un Comportement
Nous avons souvent besoin d’une colonne de tri numérique dans une table, lorsque les données de cette table ne peuvent être classées selon un ordre standard, comme l’ordre alphabétique ou la date de création. C’est pourquoi nous avons créé un Comportement (Behavior) pour gérer automatiquement les opérations de maintenance de l’index de tri en cas d’ajout, modification ou suppression de données. Le Comportement ajoute également deux méthodes au Modèle associé, moveUp et moveDown, pour monter ou descendre un enregistrement de la table.
1. Installation
Pour installer le Comportement, il suffit de télécharger le fichier ci-dessous dans le répertoire {app}/models/behaviors/ et de le renommer en ordonnable.php.
Télécharger le Comportement OrdonnableBehavior
2. Mise en pratique
Nous allons voir maintenant un exemple concret de l’utilisation de notre Comportement. Imaginons une gestion de diplômes : lorsque nous les affichons, nous souhaitons bien sûr les classer par ordre de niveau d’études, ce qui ne correspond ni à l’ordre de saisie ni à l’ordre alphabétique. Nous ajoutons donc une colonne de type numérique à notre table pour gérer l’ordre comme nous le souhaitons.
2.1. La table
Nous créons la table diplomes avec trois colonnes :
id: la clé primaire ;libelle: le nom du diplôme ;ordre: nombre entier non signé qui va servir à conserver la liste des diplômes dans l’ordre voulu.
CREATE TABLE `diplomes` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `libelle` varchar(50) NOT NULL, `ordre` int(10) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`) )
2.2. Le Modèle
Nous créons le fichier {app}/models/diplome.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // {app}/models/diplome.php class Diplome extends AppModel { var $name = 'Diplome'; var $displayField = 'libelle'; var $actsAs = array( 'Ordonnable' => array( 'field' => 'ordre', 'addToEnd' => true ) ); } |
La variable $actsAs nous permet de dire au Modèle Diplome de se comporter comme étant “Ordonnable”, et ce avec deux options :
field: la colonne de la table qui va conserver l’index de classement, ici notre colonne ‘ordre’. Vaut ‘ordre’ par défaut.addToEnd: si vrai, un nouvel enregistrement sera placé à la fin, si faux il sera placé au début. Vrai par défaut.
2.3. Le Controller
Voyons les trois actions qui nous intéressent : index (liste des diplômes par ordre voulu), monter (monter un diplôme d’un cran dans la liste) et descendre (descendre un diplôme d’un cran dans la liste) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // {app}/controllers/diplomes_controller.php class DiplomesController extends AppController { var $name = 'Diplomes'; function index() { $diplomes = $this->Diplome->find( 'all', array('order' => 'Diplome.ordre ASC') ); $this->set(compact('diplomes')); } function monter($id = null) { if($id) { $this->Diplome->moveUp($id); $this->redirect('index'); } } function descendre($id = null) { if($id) { $this->Diplome->moveDown($id); $this->redirect('index'); } } } |
Les méthodes monter et descendre appellent deux méthodes du Comportement OrdonnableBehavior, accessibles depuis le Modèle Diplome associé.
Il ne reste au lecteur qu’à créer les actions d’ajout, d’édition et de suppression d’un diplôme, mais ces actions sont tout à fait classiques et nous ne les présenterons pas ici.
Le Comportement se chargera automatiquement de maintenir l’index d’ordre à jour en cas d’ajout ou de suppression d’un enregistrement.
2.4. La Vue index
Finissons par la vue correspondant à l’action index du Contrôleur :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // {app}/views/diplomes/index.ctp <?php e($html->tableHeaders('Ordre', 'Libellé', 'Actions')); foreach ($diplomes as $row): ?> <tr> <td><?php e($row['Diplome']['ordre']); ?></td> <td><?php e($row['Diplome']['libelle']); ?></td> <td> <?php e($html->link("Monter", 'monter/'.$row['Diplome']['id'])); e($html->link("Descendre", 'descendre/'.$row['Diplome']['id'])); ?> </td> </tr> <?php endforeach; ?> </table> |
Pierre-Emmanuel Fringant