Domanda

Ho un po 'strega modelli stanno usando funzione nestedset Dottrina. Voglio aggiungere functionaly eliminazione di elementi da un albero in quanto ciò che è richiesto nella mia applicazione. Stavo cercando con frammenti di documentazione, ma io sono sempre un errore molto strano con quel codice.

YAML è qui: http://pastie.org/820978

classe astratta

E io sto cercando con questo codice nel mio strega classe Menu estende generata BaseMenu e BaseMenu estende Doctrine_Record:)

In ogni caso il mio codice:

 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();
 }

E ottengo questo errore:

  

Fatal error: Call to una funzione membro   getNode () su un non-oggetto

E ho appena notato che get_class ($ item) è trowing una guerra (in modo che probabbly è motivo di questo strano comportamento):

  

Attenzione: get_class () si aspetta parametro   1 di essere oggetto, boolean given in ...

Comunque ho bisogno di una soluzione per questo e tutti i suggerimenti sono i benvenuti ...

È stato utile?

Soluzione

getNode () restituisce un Doctrine_Node, non un Doctrine_Record.

Un Doctrine_Record può essere cancellato, ma un Doctrine_Node non può essere eliminato -. Perché non è persistente in ogni caso

La logica corretta sarebbe semplicemente:

$item = $this->getMenuItem($id)->delete();

Inoltre, non nominare un metodo nel modello 'cancella' !! In questo modo l'override del metodo delete Doctrine_Record (), che ti faranno impazzire cercando di eseguire il debug di esso.

Altri suggerimenti

io personalmente non mi piace usare Doctrine :: getTable ( "table_name"), perché non rende il codice molto secca. Se per qualche motivo "table_name" cambia mai, dovrete modificarlo in un sacco di posti.

Ho usato Dottrina nelle applicazioni Zend Framework, quindi il mio modello tipico di utilizzo comporta istanziare un'istanza protetta di ogni modello nel mio modulo.

Utilizzando tale modello, vorrei solo fare questo in mio controller

$this->_Menu
     ->getTable()
     ->find($id)
     ->getNode()
     ->delete();

Se si vuole veramente per mantenere le funzioni simili, vorrei usare qualcosa di simile

 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 risposta è nella tua domanda: $ oggetto non è oggetto (i indovinare il suo valore è falso, ma è possibile utilizzare var_dump ($ item)), perché non c'è fila con tale id nel DB (anche immagino il vostro $ id è nullo)

  
    

Attenzione: get_class () si aspetta parametro 1 per essere oggetto, boolean given in ...

         

Fatal error: Call to un getNode funzione membro () su un non-oggetto

  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top