belongsTo : génération de la liste déroulante des données du modèle associé
Imaginons un classement de documents par type de document : le formulaire de création / édition d’un document doit faire apparaître la liste déroulante des types de document disponibles. Pour ce faire, nous utilisions la méthode generateList, mais celle-ci est dépréciée dans la version 1.2.0.6311-beta. Voyons comment générer la liste déroulante avec la méthode find('list').
Soit le modèle de données suivant :
Type hasMany Document
Document belongsTo Type
1. Les tables
1.1 Table types
CREATE TABLE `types` ( `id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT, `libelle` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM;
1.2 Table documents
CREATE TABLE `documents` ( `id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT, `type_id` mediumint(8) UNSIGNED NOT NULL, `titre` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `type_id` (`type_id`), ) ENGINE=MyISAM;
2. Les modèles et leurs relations
21. Modèle Type
1 2 3 4 5 6 7 8 | // {app}/models/type.php class Type extends AppModel { var $name = 'Type'; var $useTable = 'types'; var $displayField = 'libelle'; var $hasMany = 'Document'; } |
Notez la définition de la variable $displayField, qui va être utilisée par la méthode Model::find('list') pour savoir quel champ afficher dans la liste déroulante. Si cette variable n’est pas définie, CakePHP va chercher un champ title ou name (qui n’existent pas dans notre définition de table en français) et en dernier recours affiche simplement l’id du type.
2.2 Modèle Document
1 2 3 4 5 6 7 | // {app}/models/document.php class Document extends AppModel { var $name = 'Document'; var $useTable = 'documents'; var $belongsTo = 'Type'; } |
3. Le Contrôleur DocumentsController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // {app}/controllers/documents_controller.php class DocumentsController extends AppController { function edit($id = null) { if(isset($this->data)) { $this->Document->set($this->data); $this->Document->save(); $this->redirect(array('action' => 'index')); } $this->data = $this->Document->read(null, $id); // Génération de la liste de types de document : $types = $this->Document->Type->find('list'); // Passage de la liste à la Vue : this->set('types', $types); } } |
Pas besoin d’en dire plus, CakePHP se charge du reste !
4. La vue edit
Voyons maintenant la vue correspondant à l’action edit du Contrôleur DocumentsController.
1 2 3 4 5 6 7 8 9 | // {app}/views/documents/edit.ctp <?php e($form->create('Document', array('action' => 'edit'))); ?> <div class="input"> <label>Type :</label> <?php e($form->select('type_id', $types, null, null, false)); ?> </div> // Puis le champ titre, le bouton submit, etc. |
Nous constatons que la liste déroulante des types disponibles est bien présente et correctement remplie. Si nous sommes en train d’éditer un document existant, le type du document est préselectionné dans la liste.
Pierre-Emmanuel Fringant
Eh bien si il faudrait peut-être en dire plus. Quelle est la méthode qui retourne la liste des éléments dans le contrôleur ?
Quel est l’effet de la fonction e() ?
12 février 2008 à 12:03
Auteur : kazhar