3.8.1 Utiliser les Comportements
Les Comportements sont attachés aux modèles grâce à la variable $actsAs des classes modèle :
<?php
class Categorie extends AppModel {
var $name = 'Categorie';
var $actsAs = array('Tree');
}
?>
<?phpclass Categorie extends AppModel {var $name = 'Categorie';var $actsAs = array('Tree');}?>
Cette exemple montre comme un modèle Catégorie pourrait être gérer dans une structure en arbre en utilisant le comportement Tree. Une fois qu'un comportement a été spécifié, utilisez les méthodes qu'il ajoute comme si elles avaient toujours existé et fait partie du modèle original :
// Définir ID $this->Categorie->id = 42; // Utiliser la méthode children() du comportement : $enfants = $this->Categorie->children();
// Définir ID$this->Categorie->id = 42;// Utiliser la méthode children() du comportement :$enfants = $this->Categorie->children();
Quelques comportements peuvent nécessiter ou permettre des réglages quand ils sont attachés au modèle. Ici, nous indiquons à notre comportement Tree les noms des champs "left" et "right" de la table sous-jacente :
<?php
class Categorie extends AppModel {
var $name = 'Categorie';
var $actsAs = array('Tree' => array(
'left' => 'noeud_gauche',
'right' => 'noeud_droit'
));
}
?>
<?phpclass Categorie extends AppModel {var $name = 'Categorie';var $actsAs = array('Tree' => array('left' => 'noeud_gauche','right' => 'noeud_droit'));}?>
Nous pouvons aussi attacher plusieurs comportements à un modèle. Il n'y aucune raison pour que, par exemple, notre modèle Categorie se comporte seulement comme un arbre, il pourrait aussi supporter l'internationalisation :
<?php
class Categorie extends AppModel {
var $name = 'Categorie';
var $actsAs = array(
'Tree' => array(
'left' => 'noeud_gauche',
'right' => 'noeud_droit'
),
'Translate'
);
}
?>
<?phpclass Categorie extends AppModel {var $name = 'Categorie';var $actsAs = array('Tree' => array('left' => 'noeud_gauche','right' => 'noeud_droit'),'Translate');}?>
Jusqu'à présent, nous avons ajouter les comportements aux modèles en utilisant une variable de classe. Cela signifie que nos comportements seront attachés à nos modèles de tout au long de leur durée vie. Pourtant, nous pourrions avoir besoin de "détacher" les comportements des modèles à l'exécution. Considérons que dans notre précédent modèle Catégorie, lequel agit comme un modèle Tree et Translate, nous ayons besoin pour quelque raison de le forcer à ne plus agir comme un modèle Translate :
// Détache un comportement de notre modèle :
$this->Categorie->Behaviors->detach('Translate');
// Détache un comportement de notre modèle :$this->Categorie->Behaviors->detach('Translate');
Cela fera que notre modèle Categorie arrêtera dorénavant de se comporter comme un modèle Translate. Nous pourrions avoir besoin, sinon, de désactiver simplement le comportement Translate pour qu'il n'agisse pas sur les opérations normales de notre modèle : nos finds, nos saves, etc. En fait, nous cherchons à désactiver le comportement qui agit sur nos callbacks de modèle CakePHP. Au lieu de détacher le comportement, nous allons dire à notre modèle d'arrêter d'informer ses callbacks du comportement Translate :
// Empêcher le comportement de manipuler nos callbacks de modèle
$this->Categorie->Behaviors->disable('Translate');
// Empêcher le comportement de manipuler nos callbacks de modèle$this->Categorie->Behaviors->disable('Translate');
Nous pourrions également avoir besoin de chercher si notre comportement manipule ces callbacks de modèle et si ce n'est pas le cas, alors de restaurer sa capacité à réagir avec eux :
// Si notre comportement ne manipule pas nos callbacks de modèle
if (!$this->Categorie->Behaviors->enabled('Translate')) {
// Disons lui de le faire maintenant !
$this->Category->Behaviors->enable('Translate');
}
// Si notre comportement ne manipule pas nos callbacks de modèleif (!$this->Categorie->Behaviors->enabled('Translate')) {// Disons lui de le faire maintenant !$this->Category->Behaviors->enable('Translate');}
De la même manière que nous pouvons détacher complètement un comportement d'un modèle à l'exécution, nous pouvons aussi attacher de nouveaux comportements. Disons que notre modèle familier Categorie nécessite de se comporter comme un modèle de Noël, mais seulement le jour de Noël :
// Si nous sommes le 25 déc
if (date('m/d') == '12/25') {
// Notre modèle nécessite de se comporter comme un modèle de Noël
$this->Category->Behaviors->attach('Christmas');
}
// Si nous sommes le 25 décif (date('m/d') == '12/25') {// Notre modèle nécessite de se comporter comme un modèle de Noël$this->Category->Behaviors->attach('Christmas');}
Nous pouvons aussi utiliser la méthode attach pour réécrire les réglages du comportement :
// Nous changerons un réglage de notre comportement déjà attaché
$this->Categorie->Behaviors->attach('Tree', array('left' => 'nouveau_noeud_gauche'));
// Nous changerons un réglage de notre comportement déjà attaché$this->Categorie->Behaviors->attach('Tree', array('left' => 'nouveau_noeud_gauche'));
Il y a aussi une méthode pour obtenir la liste des comportements qui sont attachés à un modèle. Si nous passons le nom d'un comportement à une méthode, elle nous dira si ce comportement est attaché au modèle, sinon elle nous donnera la liste des comportements attachés :
// Si le comportement Translate n'est pas attaché
if (!$this->Categorie->Behaviors->attached('Translate')) {
// Obtenir la liste de tous les comportements qui sont attachés au modèle
$comportements = $this->Categorie->Behaviors->attached();
}
// Si le comportement Translate n'est pas attachéif (!$this->Categorie->Behaviors->attached('Translate')) {// Obtenir la liste de tous les comportements qui sont attachés au modèle$comportements = $this->Categorie->Behaviors->attached();}


























