Neden ben üst sınıfı yeniden yazamazlar?

2 Cevap php

Ben çekirdek / adminhtml / blok / satış / sipariş / view / tabs.php sınıfı için süper bir sınıf çekirdek / adminthtml / blok / widget / tabs.php sınıfını yeniden yazmak istiyorum.

İşte her iki senaryo için yapılandırma kodu:

 <blocks>  
  <adminhtml>  
     <rewrite>
       <sales_order_view_tabs>Jimmy_SalesAffil_Block_Widget_Tabs</sales_order_view_tabs>  
       <widget_tabs>Jimmy_SalesAffil_Block_Widget_Tabs</widget_tabs>  
        .....
     </rewrite>  
  </adminhtml>  
 </blocks> 

Ben yeniden mümkün pm ...view/tabs.php, ben süper sınıfını yeniden yazmak mümkün değilim. Neden? Bu mümkün mü? Nasıl?

2 Cevap

Sen ana sınıfını yazabilirsiniz, ama yalnızca o sınıfın kendisi için aramalar için geçerli olacaktır. Yani bu çağrı doğru geçersiz sınıf alır:

Mage::getBlock("adminhtml/widget_tabs");

Gerçek classname XML / geçersiz kılar sistemi kullanılarak Magento tarafından yüklenen olmasıdır. Eğer çocuğun sınıf geçersiz yoksa beklediğiniz gibi Ancak, bu çağrı çalışmaz:

Mage::getBlock("admihtml/sales_order_view_tabs");

Üst sınıf Magento'nın sistemini kullanarak, ancak düzenli PHP kullanarak belirtilmemiş olmasıdır:

class Mage_Adminhtml_Block_Sales_Order_View_Tabs extends Mage_Adminhtml_Block_Widget_Tabs

Eğer üst sınıf geçersiz kılmak istiyorsanız, XML tabanlı geçersiz kılma sistem size yardımcı olamaz. Ancak, yerel uzaya Widget_Tabs sınıf kopyalamak ve Magento orada yükleyecektir. Onun içine bir dizin yolunu app/code/local/Mage/Adminhtml/Block/Widget/ ve kopya Tabs.php yapmak ve gerekli değişiklikleri yapabilirsiniz.

Umut olur.

Thanks, Joe

Sen yapamazsın, haklısın, ve geçersiz kılma işlevselliği oluşturulduğu yolu ile ilgisi vardır. PHP (yakut, diyelim aksine) size sınıfları geçersiz kılmak için hiçbir yerli bir yol sunar. Magento (geçersiz kılınabilir sınıflar için) new anahtar sözcüğünü kullanarak asla bu geçici çalışır

new ClassName

bir sınıf oluşturmak için

Bunun yerine bir statik factoryish yöntemi kullanmak

$object = Mage::getModel('/adminhtml/sales_order_view_tabs');

Ne modeli yapar olsun dize /adminhtml/sales_order_view_tabs bakmak, ve sonra see which class it should instantiate için yapılandırma dosyalarını başvurmak olduğunu.

Ana sınıfları örneği asla Çünkü, bunlar geçersiz olamaz.