Doctrine nestedset supprimer
-
20-09-2019 - |
Question
J'ai une sorcière modèles utilisent Doctrine fonction nestedset. Je veux ajouter des éléments de suppression functionaly de l'arbre depuis ce qui est requis dans ma demande. J'ai essayé avec des extraits de documents mais je reçois une erreur très étrange avec ce code.
YAML est ici: http://pastie.org/820978
Je suis en train avec ce code dans ma sorcière de classe Menu classe abstraite générée étend BaseMenu et BaseMenu étend Doctrine_Record:)
En tout cas mon code:
public function getMenuItem($id)
{
return Doctrine::getTable('Menu')->find($id);
}
public function delete($id)
{
$item = $this->getMenuItem($id);
//echo get_class($item); will return Menu so object exists !?
$item->getNode()->delete();
}
Et je reçois cette erreur:
Erreur fatale: Appel à une fonction de membre GetNode () sur un non-objet
Je viens de remarquer que get_class ($ item) est trowing une guerre (si c'est probabbly raison de ce comportement étrange):
Avertissement: get_class () paramètre attend 1 pour être l'objet, en booléenne donnée ...
Cependant, je besoin d'une solution pour cela et tous les conseils sont les bienvenus ...
La solution
GetNode () retourne une Doctrine_Node, pas un Doctrine_Record.
Un Doctrine_Record peut être supprimé, mais un Doctrine_Node ne peut pas être supprimé -. Car il ne persiste pas de toute façon
La logique serait tout simplement correcte est:
$item = $this->getMenuItem($id)->delete();
En outre, ne nommez pas une méthode dans votre modèle « supprimer » !! Ceci remplacera la méthode de suppression () de Doctrine_Record, qui va vous rendre fou à essayer de le déboguer.
Autres conseils
Personnellement, je n'aime pas utiliser Doctrine :: getTable ( « nom_table ») parce qu'il ne fait pas le code très sec. Si pour une raison quelconque « nom_table » ne change jamais, vous devrez changer dans beaucoup d'endroits.
je doctrine dans les applications Zend Framework, donc mon modèle typique d'utilisation implique l'instanciation d'une instance protégée de chaque modèle dans mon module.
En utilisant ce modèle, je voudrais juste faire cela dans mon contrôleur
$this->_Menu
->getTable()
->find($id)
->getNode()
->delete();
Si vous voulez vraiment garder vos fonctions similaires, je voudrais utiliser quelque chose comme ceci
public function getMenuItem($id)
{
if (empty($id))
{
throw new Exception ("A parameter of id is required to retrieve a menu item".);
}
return $this->getTable()->find($id);
}
public function delete($id)
{
$item = $this->getMenuItem($id);
if ($item instanceof Doctrine_Record == false)
{
throw new Exception("Item is not a valid Menu Record.");
}
$item->getNode()->delete();
}
La réponse est dans votre question: $ article est pas objet (je suppose que sa valeur est fausse, mais vous pouvez utiliser var_dump (poste $)), parce qu'il n'y a pas de ligne avec un tel id dans DB (aussi je suppose que votre $ id est nul)
Avertissement: get_class () 1 à paramètre prévoit faire l'objet, booléen donné ...
Fatal error: Appel à une fonction membre GetNode () sur un non-objet