Doktrin nestedset silmek

3 Cevap php

I have some models witch are using Doctrine nestedset feature. I want to add delete functionaly of elements from tree since that is required in my application. I was trying with snippets from documentation but I am getting a very strange error with that code.

YAML burada: http://pastie.org/820978

Ve benim Menüsü sınıf cadı bu kod ile çalışıyorum oluşturulan soyut sınıf BaseMenu ve BaseMenu Doctrine_Record extends :)

Neyse benim kod:

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

Ve ben bu bir hata alıyorum:

Fatal error: Call to a member function getNode() on a non-object

Ve ben sadece get_class ($ item) (böylece Probabbly bu garip davranışın nedeni) bir savaşan trowing olduğunu fark ettim:

Warning: get_class() expects parameter 1 to be object, boolean given in...

Ancak bunun için bir çözüm gerekiyor ve tüm ipuçları bekliyoruz ...

3 Cevap

getNode () bir Doctrine_Node değil, bir Doctrine_Record döndürür.

Bir Doctrine_Record silinebilir, ancak bir Doctrine_Node silinemez - zaten kalıcı değil çünkü.

Doğru mantık basit olacaktır:

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

Ayrıca, 'delete' senin model bir yöntem adı yok! Bu hata ayıklamak için çalışıyor deli sürücü Doctrine_Record en silme () yöntemini geçersiz kılar.

Bu kod çok kuru yapmaz, çünkü ben şahsen Doktrin :: gettable ("table_name") kullanarak sevmiyorum. Nedense "table_name" şimdiye kadar değiştirirse, yerlerde bir sürü içinde değiştirmek gerekecek.

Ben Zend Framework apps Doktrini kullanılan, böylece kullanım benim tipik bir model benim modülünde her modelin bir korumalı örneğini başlatmasını içerir.

Bu desen kullanarak, ben sadece benim denetleyicisi bu yapardın

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

Gerçekten benzer fonksiyonlarınızı tutmak istiyorsanız, ben böyle bir şey kullanmak istiyorsunuz

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

Cevabı söz konusudur: DB böyle kimliği ile hiçbir satır olduğundan $ madde, (i değer false sanırım, ama var_dump ($ item) kullanabilirsiniz) nesne değildir (Ayrıca ben senin $ id null sanırım)

Uyarı: get_class () parametre 1 nesne, içeri verilen boolean olmasını bekliyor ..

Ölümcül hata: olmayan bir nesne üzerinde bir üye işlev getNode () Çağrı