jan
30

Modifier les Modèles dans Yii

Author Nico    Category Frameworks, PHP     Tags , ,

Modifier les Modèles dans Yii

Nous voici à nouveau ensemble pour la traduction en français du sixième épisode de la série Learning the Yii Framework de Larry Ullman. Vous pouvez trouver l’article original en anglais sur le site de l’auteur : Basic Model Edits in Yii.

Je ne reviens pas sur le contenu des articles précédents. Vous retrouverez les liens vers l’ensemble des articles de la série dans le bandeau, à droite de cet article.

Cet article présente les modifications que vous pourrez apporter aux Modèles après leur génération automatique par les outils en ligne de commande de Yii. Ceci constituera une bonne introduction au concept de Modèle dans Yii. Comme précédemment, j’utiliserai l’exemple des employé et des services pour illustrer ces notions.

Le Modèle représente les données utilisées par l’application. Généralement, ces données proviennent d’une base de données, mais elles peuvent également provenir d’un formulaire (destiné à être envoyé par mail, pas stocké. C’est le cas pour le Modèle ContactForm dans l’application de démarrage de Yii). Dans Yii, un Modèle basé sur une table d’une base de données est défini dans une classe qui hérite de Active Record. Active Record est un modèle de conception (NDT : autrement dit, un Design Pattern) populaire qui est également utilisé par le framework Ruby on Rails. Cela signifie que la plupart des fonctionnalités du Modèle ne sont en fait pas définies dans notre Modèle, mais dans la classe parente Active Record. Par conséquent, lorsque vous consultez le code de votre Modèle, ne soyez pas étonné de ne pas trouver de méthode pour créer ou mettre à jour des enregistrements (c’est-à-dire l’enregistrement du Modèle), car ces méthodes sont héritées. Comme ces fonctionnalités sont définies pour vous, la fonction principale du Modèle est d’étendre ces fonctions de base pour les adapter à vos besoins.

A l’intérieur d’un Modèle, vous trouverez certaines méthodes spécifiques (les méthodes de classe) que vous utiliserez couramment. Certaines d’entre elles sont créées lors de la génération du Modèle avec Gii, tandis que d’autres peuvent être ajoutées à un quelconque moment. Je vais donc me focaliserai sur ces méthodes propres à Yii, puisqu’elles sont communes à la plupart des Modèles. Dans les articles suivants de cette série, je décrirai cependant quelques exemples de méthodes personnalisées qui pourront être ajoutées au Modèle.

L’une des méthodes les plus importantes est rules(), qui liste les règles que doivent respecter les données du Modèle. Une partie essentielle de la sécurité et de la fiabilité de votre application repose sur cette méthode. Cette méthode illustre en fait l’un des avantages majeurs d’utiliser un framework : la validation des données. Que vous soyez en train de créer un enregistrement ou d’en mettre un à jour, vous ‘aurez pas besoin d’écrire , dupliquer ou tester les routines de validation des données : Yii le fera pour vous. Comme l’indique l’un des commentaires dans le Modèle, vous ne créerez des règles par vous-même que pour les champs (autrement dit, les attributs du Modèle) dont les données sont renseignées par les utilisateurs. Par exemple, vous ne créerez pas de règle pour le champ id de la table Employee, qui est une clé primaire générée par MySQL.

La méthode rules(), comme la majorité des méthodes de Yii, retourne un tableau de données :

public function rules()
{
return array(/* actual rules */);
}

En ce qui concerne les règles en elles-mêmes, la documentation de Yii couvre le sujet de façon exhaustive (ici et ici). Je mettrai l’accent sur les principales. Comme vous allez le constater, chaque règle est écrite de manière à retourner aussi un tableau.

La première contrainte, qui est aussi la plus évidente, est d’indiquer qu’un champ est obligatoire. Dans le premier élément du tableau, listez simplement dans une chaîne les noms des champs à rendre obligatoires, séparés par des virgules et ajoutez ensuite le mot required comme deuxième élément du tableau :

array('name, email, subject, body', 'required'),

Vous pouvez aussi indiquer qu’une valeur doit être un nombre ou, plus précisément, un entier. Cette syntaxe est légèrement différente de la précédente. Dans l’exemple qui suit, j’indique que le champ ext doit être un entier :

array('ext', 'numerical', 'integerOnly'=>true),

Pour les chaînes de caractères, vous pouvez contraindre la longueur de cette chaîne à une valeur maximale:

array('name','length','max'=>40),

Ou bien à une valeur minimale :

array('name','length','min'=>6),

Ou bien les deux à la fois :

array('name','length','min'=>6, 'max'=>40),

Vous trouverez pratique de pouvoir vérifier qu’une chaîne est une adresse mail. Dans l’exemple suivant, je vérifie que le champ userMail est un email :

array('userEmail', 'email'),

Pour signaler qu’une chaîne doit être une URL, faites comme ceci :

array('link', 'url'),

Les comparaisons sont également très utiles. Par exemple, lorsqu’un utilisateur s’inscrit (NDT : remarquez la présence du ‘on’=>’register’, qui indique dans quel scénario la règle s’applique), vous devez vérifier que la confirmation du mot de passe est identique au mot de passe :

array('password1', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),

Il y a également la règle « safe ». Cette règle est utilisée pour autoriser un accès à des données qui ne seront pas validées par ailleurs. Par exemple, l’adresse mail est déjà considérée comme « sûre » (« safe« ) car elle est déjà conforme à la règle email. En revanche, le Modèle Employee a un attribut leaveDate qui ne se voit appliquer aucune règle de validation (en partie parce qu’il n’y a pas de règles spécifiques au dates, et aussi parce qu’il accepte la valeur NULL). Pour pouvoir accéder à cette valeur, elle doit être déclarée comme safe :

array('leaveDate', 'safe'),

Si plusieurs champs doivent être définis comme safe, séparez-les juste par des virgules.

Il existe également une règle qui indique les champs sur lesquels on autorise la recherche. Par défaut, il est possible de faire une recherche sur tous les champs, mais vous pouvez vouloir changer ce comportement et retirer des champs de la liste :

array('id, departmentId, firstName, lastName, email, ext, hireDate, leaveDate', 'safe', 'on'=>'search'),

Voicila liste complète des règles que nous venons de définir pour le Modèle Employee :

public function rules()
{
return array(
array('departmentId, firstName, lastName, email, hireDate', 'required'),
array('departmentId, ext', 'numerical', 'integerOnly'=>true),
array('firstName', 'length', 'max'=>20),
array('lastName', 'length', 'max'=>40),
array('email', 'length', 'max'=>60),
array('email', 'email'),
array('leaveDate', 'safe'),
array( 'id, departmentId, firstName, lastName, email, ext, hireDate, leaveDate', 'safe', 'on'=>'search'),
);
}

Passons à la suite. Une autre méthode essentielle dans le Modèle est relations(), qui représente les relations entre plusieurs Modèles. Si votre base de données est correctement définie (NDT : c’est-à-dire, si vous avez correctement défini vos clés étrangères), cette méthode sera renseignée automatiquement, une fois encore grâce à Gii. Voici la méthode relations() du Modèle Employee :

public function relations()
{
return array('department' => array(self::BELONGS_TO, 'Department', 'departmentId') );
}

Un nom est attribué à la relation, ici department. Cette relation indique que la colonne departmentId du Modèle Employee appartient au Modèle Department. Voici dans quel cas cela sera important : lorsque vous chargerez les informations relatives à un employé, vous pourrez aussi charger aussi celles de ses relations. Par ce biais, les références à department correspondront à l’enregistrement du Modèle Department auquel appartient l’employé. Par conséquent, si l’objet $model représente l’Employee affiché, alors $model->department->name sera le nom du service auquel est rattaché cet employé.

Dans le Modèle Department, cette relation est définie ainsi :

public function relations()
{
return array('employees' => array(self::HAS_MANY, 'Employee', 'departmentId') );
}

Donc, si $model est un Department spécifique, alors $model->employees est un tableau d’objets de la classe Employee, chacun d’entre eux correspondant à un employé de ce service.

Les relations entre les Modèles constituent une fonction clé des sites complexes en MVC. En définissant correctement les relations, le contenu associé peut être récupéré facilement. Vous en apprendrez davantage à ce sujet dans les articles qui suivent.

Une méthode moins fondamentale, mais cependant pratique, est la méthode attributeLabels(). Cette méthode retourne un tableau associatif contenant les champs et les libellés qui leurs sont associés dans les formulaires, les messages d’erreur, … Yii Framework fait un travail très appréciable lorsqu’il s’agit de transformer, par exemple, le champ firstname en First Name, ou encore departmentId en Department. Vous pouvez personnaliser ces libellés. Pour le Modèle Employee, voici le contenu de cette méthode :

public function attributeLabels()
{
return array(
'id' => 'Employee ID',
'departmentId' => 'Department',
'firstName' => 'First Name',
'lastName' => 'Last Name',
'email' => 'Email',
'ext' => 'Ext',
'hireDate' => 'Hire Date',
'leaveDate' => 'Leave Date',
);
}

Voici donc quelques unes des choses que vous pourrez personnaliser dans vos Modèles pour démarrer votre projet. Comme je l’ai évoqué précédemment, vous pourrez également ajouter vos propres méthodes par la suite. Sachez aussi qu’il existe d’autres méthodes propres à Yii que j’utilise assez souvent, comme beforeSave(), qui vous permet d’exécuter du code juste avant l’enregistrement de votre Modèle, ou beforeValidate(), qui est exécutée avant que ne s’effectue la validation. Cette dernière méthode est utile si vous voulez effectuer des opérations sur les données en arrière-plan avant que l’ensemble des données ne vérifie les contraintes de validation. Enfin, il y a la méthode search(), qui pourra faire l’objet d’un article séparé. Gardez simplement à l’esprit que les méthodes essentielles sont rules() et relations().

C’est fini pour cet épisode. Je vous remercie de votre fidélité et vous rappelle que vous pouvez retrouver l’article original Basic Model Edits in Yii sur le site de Larry Ullman.

Chapitre suivant : Modifier les Vues dans Yii »



Poster un commentaire

Edito

Bienvenue sur Mémorandom.

Mémorandom est le blog de 2 développeurs web, Appo et Nico.

Vous y trouverez des informations sur différents domaines touchant de près ou de loin au développement web

Tutoriels Yii Framework

Nos derniers articles

Blogs Dev

Liens

Mots-clefs