Pregunta

Tengo algunos modelos bruja utiliza la función nestedset Doctrina. Quiero añadir functionaly de eliminación de elementos del árbol, ya que se requiere en mi solicitud. Yo estaba tratando con fragmentos de documentación, pero estoy recibiendo un error muy extraño con ese código.

YAML está aquí: http://pastie.org/820978

Y estoy tratando con este código en mi bruja clase Menu extiende generada clase abstracta MenuBase y MenuBase extiende Doctrine_Record:)

De todas formas mi código:

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

Y me sale este error:

  

Fatal error: Llamada a una función miembro   getNode () en un no-objeto

Y me he dado cuenta de que get_class ($ item) se trowing una guerra (de modo que es probabbly razón de este comportamiento extraño):

  

Advertencia: get_class () espera parámetro   1 para ser objeto, boolean dada en ...

Sin embargo Necesito una solución para esto y todos los consejos son bienvenidos ...

¿Fue útil?

Solución

getNode () devuelve un Doctrine_Node, no un Doctrine_Record.

A Doctrine_Record se puede eliminar, pero una Doctrine_Node no se puede borrar -. Porque no es persistente de todos modos

La lógica correcta sería simplemente:

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

Además, no nombrar a un método en el modelo de 'eliminar' !! Esto anulará el método de eliminación de Doctrine_Record (), que te volverá loco tratando de depurarlo.

Otros consejos

Yo personalmente no me gusta usar Doctrina :: getTable ( "nombre_tabla"), ya que no hace que el código muy seco. Si por alguna razón "nombre_tabla" cambia nunca, vas a tener que cambiarlo en un montón de lugares.

utilicé doctrina en aplicaciones Zend Framework, así que mi patrón típico de uso implica instanciar una instancia protegida de cada modelo en mi módulo.

El uso de este patrón, me acaba de hacer esto en mi controlador

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

Si realmente quiere mantener sus funciones similares, me gustaría utilizar algo como esto

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

respuesta está en tu pregunta: $ artículo no se opone (supongo que su valor es falso, pero se puede utilizar var_dump ($ item)), porque no hay una fila con tal id en DB (también supongo que el $ id es null)

  
    

Advertencia: get_class () espera parámetro de 1 a ser objeto, boolean dada en ...

         

Fatal error: Llamada a un getNode función miembro () en un no-objeto

  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top