2010-07-16 17 views
2

Je suis en train d'exécuter une logique avant de supprimer un champ. J'ai certains modèles qui dépendent du modèle en cours de suppression, et je veux m'assurer que les fichiers image liés à ces modèles dépendants sont également supprimés, mais je suis un peu confus sur la façon dont les callbacks fonctionnent.CakePHP Modèle Callback, plus précisément beforeDelete

Je sais que je l'avant Supprimer définir la fonction de la classe de modèle, mais comment puis-je accéder aux données dans le modèle actuel ou les modèles dépendants d'être supprimés?

function beforeDelete() { 

} 

Je suis juste un peu confus que l'utilisation de ces callbacks, et je n'ai pas vu une grande documentation là-bas. Après avoir ajouté ceci au modèle parent, il semble toujours retourner false.

function beforeDelete() { 
    if ($this->DependentModel->find('count', array('conditions' => array('DependentModel.parent_id' => $this->id))) == 1){ 
     return true; 
    } else{ 
     return false; 
    } 
} 

Devrait être évident ce que j'essaie de faire ici. Si une entrée du modèle dépendant est présente dans la table, renvoyez true et poursuivez la suppression. J'ai fait en sorte qu'il y ait en fait une entrée de table qui dépend de l'objet à supprimer. Lorsque j'exécute l'action de suppression, elle renvoie toujours false. Que se passe t-il ici?

Répondre

9

Lorsque vous utilisez callbacks, vous pouvez vous référer à la API pour la classe que vous étendez pour vérifier les paramètres qu'il accepte. Votre implémentation doit accepter, au minimum, les mêmes paramètres que les méthodes que vous utilisez.

Par exemple, Model::beforeDelete est mis en oeuvre comme ceci:

/** 
* Called before every deletion operation. 
* 
* @param boolean $cascade If true records that depend on this record will also be deleted 
* @return boolean True if the operation should continue, false if it should abort 
* @link http://book.cakephp.org/2.0/en/models/callback-methods.html#beforedelete 
*/ 
    public function beforeDelete($cascade = true) { 
     return true; 
    } 

Et aussi, ModelBehavior::beforeDelete est mis en œuvre comme celui-ci (par exemple lors d'un comportement.):

/** 
* Before delete is called before any delete occurs on the attached model, but after the model's 
* beforeDelete is called. Returning false from a beforeDelete will abort the delete. 
* 
* @param Model $model Model using this behavior 
* @param boolean $cascade If true records that depend on this record will also be deleted 
* @return mixed False if the operation should abort. Any other result will continue. 
*/ 
    public function beforeDelete(Model $model, $cascade = true) { 
     return true; 
    } 

Ensuite, il est utile de savoir que lors de l'enregistrement d'un modèle et en passant dans les données du contrôleur (ie. $this->data dans le contrôleur) que les données sont set to the model (ie. $this->data dans le modèle). [Cela se produit au cours de Model::save(), actuellement sur line 1225.]

Dans le cas du premier exemple, vous pouvez accéder au modèle à l'aide $this et dans le second exemple, vous pouvez accéder au modèle à l'aide $model (comme $this serait le comportement dans ce le contexte). Donc, pour obtenir les données, vous voulez utiliser $this->data ou $model->data. Vous pouvez également accéder aux modèles associés de ce modèle en utilisant le chaînage (c'est-à-dire $this->RelatedModel ou $model->RelatedModel).

Comme l'état des commentaires PHPDoc, $cascade devrait vous permettre de savoir si cela est une suppression en cascade qui se passe (true par défaut) dans le cas où votre code doit prendre différentes actions lorsque cela est ou non le cas; et votre implémentation de la méthode devrait renvoyer false si vous voulez annuler l'opération de sauvegarde (sinon, renvoyez true lorsque vous avez terminé). Il existe un Media plugin pour CakePHP qui implémente this exact functionality et peut être utilisé comme référence.

+0

Merci beaucoup, ce qui est excellent info! – wcolbert

+0

Pas de problème. En réponse à votre modification, j'ai testé votre code à cette fin (sur 1.3) et je n'ai pas trouvé de défaut. Cela a fonctionné comme prévu, en supprimant seulement quand il y avait un seul enregistrement dépendant.J'attribuerais votre appel 'find ('count')' à une variable '$ count' puis' debug ($ count); die; 'pour déterminer si vous obtenez la valeur de retour attendue. – deizel