Почему я не могу переписать родительский класс? - PullRequest
2 голосов
/ 08 апреля 2010

Я хочу переписать класс core / adminthtml / block / widget / tabs.php, который является суперклассом для класса core / adminhtml / block / sales / order / view / tabs.php.

Вот код конфигурации для обоих сценариев:

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

Хотя я могу переписать ...view/tabs.php, я не могу переписать суперкласс.Зачем?Является ли это возможным?Как?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2010

Вы можете переписать родительский класс, но это будет применяться только к вызовам самого класса. Таким образом, этот вызов вернет правильно переопределенный класс:

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

Это потому, что настоящее имя класса загружается Magento с использованием системы XML / overrides. Однако, если вы не переопределите дочерний класс, этот вызов не будет работать так, как вы ожидаете:

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

Это потому, что родительский класс не указан с использованием системы Magento, но использует обычный PHP:

class Mage_Adminhtml_Block_Sales_Order_View_Tabs extends Mage_Adminhtml_Block_Widget_Tabs

Если вы хотите переопределить родительский класс, система переопределения на основе XML не может вам помочь. Однако вы можете скопировать класс Widget_Tabs в локальное пространство, и Magento загрузит его туда. Создайте путь к каталогу app/code/local/Mage/Adminhtml/Block/Widget/ и скопируйте в него Tabs.php, и при необходимости вы сможете вносить изменения.

Надеюсь, это поможет.

Спасибо, Джо

2 голосов
/ 09 апреля 2010

Вы правы, вы не можете, и это связано с тем, как была создана функция переопределения.PHP (в отличие от, скажем, ruby) не предлагает вам собственного способа переопределения классов.Magento работает с этим путем (для переопределенных классов) никогда не используя ключевое слово new

new ClassName

для создания класса

Вместо этого они используют статический фабричный метод

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

Что делает модель get, это просматривает строку /adminhtml/sales_order_view_tabs, а затем ссылается на файлы конфигурации на , чтобы увидеть, какой класс ей следует создать .

Поскольку родительские классы никогда не создаются, они могутникогда не отменяй

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...