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 ...

Était-ce utile?

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

  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top