переопределяя блок пурпурного цвета в нескольких модулях (и как игнорировать другие)

В Magento вы можете переопределить блок (или вспомогательный, или модель и т. Д.) Из одного модуля в другой (наиболее часто используемый из модуля Magento Adminhtml). Теперь у меня есть проблема, что я хочу переопределить блок, который уже переопределен каким-то другим расширением. Есть ли способ сказать magento игнорировать <rewrite> в другой конфигурации модуля, аналогичный тегу <remove> в обновлениях макета?

Вот конфигурация другого расширения:

  <blocks> <adminhtml> <rewrite> <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> </rewrite> </adminhtml> </blocks> 

Здесь конфигурация моего расширения:

  <blocks> <adminhtml> <rewrite> <catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> </rewrite> </adminhtml> </blocks> 

Я включил функциональность блока из Symmetrics_DeliveryTime в свой собственный блок, и теперь я хочу, чтобы magento игнорировал блок, который переопределялся из этого модуля.

Есть ли какой-либо пурпурный способ сделать это или это единственный способ прокомментировать конфигурацию (что я сделал сейчас), включая все проблемы при обновлении этого модуля позже?

Если вы установите для вашего модуля «зависеть» от того, который также выполняет переписывание, ваш конфиг будет прочитан последним, а переписать следует в соответствующем файле в приложении / etc / modules, который у вас должен быть:

 <config> <modules> <Your_Module> <active>true</active> <codePool>local</codePool> <depends> <Other_Module/> </depends> </Your_Module> <modules> <config> 

Я взглянул на загрузку классов, и не похоже, что есть чистое решение. Соответствующий код загрузки этого класса:

  if (isset($this->_classNameCache[$groupRootNode][$group][$class])) { return $this->_classNameCache[$groupRootNode][$group][$class]; } ... if (isset($config->rewrite->$class)) { $className = (string)$config->rewrite->$class; 

Так что, похоже, нет такой вещи, как переписанная переписываемая. Тот, который попадает в конфигурационный массив, тот, который загружается, и после кэширования он просто возвращается по запросу. Я тоже не вижу легкого способа взломать кеш. Вы можете попытаться получить приоритет для своего модуля (переименовывая его в алфавитном порядке, я полагаю), но это общий взлом и, скорее всего, не таинственно позже. Это убивает возможности конфигурации.

Также неприятно: похоже, что Magento только запрашивает эту сетку в двух местах, в Mage_Adminhtml_Block_Catalog_Product (которую вы можете легко переопределить), но также и в Mage_Adminhtml_Catalog_ProductController (d'oh!). В зависимости от вашего _prepareLayout() использования рассмотрите возможность переопределения блока продукта каталога и замену функции _prepareLayout() на свой собственный. Если вы хотите также переопределить контроллер, вы захотите создать свой собственный контроллер (который спускается с Mage_Adminhtml_Catalog_ProductController ) и определить переписывание в вашей конфигурации, чтобы направлять admin/catalog/product/grid в ваше действие. Боль, но, по крайней мере, достигает вашей цели.

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

Джо

Вместо того, чтобы переписывать каталог_product_grid, почему бы не продолжить работу с Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid? Таким образом, модуль Symmetrics будет поддерживать все его функциональные возможности, и вы можете добавить свои.

Поэтому вместо:

 <blocks> <adminhtml> <rewrite> <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> </rewrite> </adminhtml> </blocks> 

сделай это:

 <blocks> <adminhtml> <rewrite> <deliverytime_catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</deliverytime_catalog_product_grid> </rewrite> </adminhtml> </blocks> 

Конечно, зависит от вашего файла приложения / etc / modules.

Лучший способ преодолеть эту проблему, используя макет после или перед наблюдателем.

Приложение / код / местные / My / модуль / и т.д. / config.xml

 <config> <adminhtml> <events> <core_block_abstract_prepare_layout_before> <observers> <mymodule> <!-- Add column to catalog product grid --> <class>mymodule/adminhtml_observer</class> <method>onBlockHtmlBefore</method> </mymodule> </observers> </core_block_abstract_prepare_layout_before> </events> </adminhtml> 

или может использовать событие: core_block_abstract_prepare_layout_after .

И в Observer:

 class My_Module_Model_Adminhtml_Observer { public function onBlockHtmlBefore(Varien_Event_Observer $observer) { $block = $observer->getBlock(); if (!isset($block)) return; switch ($block->getType()) { case 'adminhtml/catalog_product_grid': //or here you can put any other block /*For example i am using Mage_Adminhtml_Block_Catalog_Product_Grid, and want to add a column*/ $block->addColumn('COLUMN_ID', array( 'header' => Mage::helper('mymodule')->__('COLUMN HEADER'), 'index' => 'COLUMN_ID', )); break; case 'adminhtml/catalog_product_edit_tabs': /*Or i want to add new tab to admin product edit*/ /* @var $block Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs */ $block->addTab('tab_name', array( 'label' => Mage::helper('catalog')->__('Tab Tilte'), 'content' => $block->getLayout()->createBlock('modulename/adminhtml_product_edit_tabname')->toHtml(), 'after' => 'inventory', )); break; } } } 

При добавлении вкладок вы можете получить ссылку на вкладки редактирования продукта, чтобы добавить поля формы в это с помощью вашего модуля.

Надеюсь, это будет полезно для кого-то 🙂