Привет, я хочу добавить столбец в раздел catolg> manage products (а не продукт, но список продуктов). В этом столбце должны быть перечислены любые связанные продукты, с которыми продукт идентифицирован – возможно, по sku или имени – никаких предпочтений нет.
Я добавил колонку для производителя, но забыл, откуда я получил код.
благодаря
Недавно (вчера на самом деле) пришлось добавить столбец в ту же сетку. Отчасти потому, что это плохая практика, и главным образом потому, что другой модуль уже использовал свое собственное переопределение, я не хотел полностью заменять или переопределять класс. Вместо этого здесь есть чистый способ изменения сетки продукта через события.
Приложение / код / местные / My / модуль / и т.д. / config.xml
<config> <adminhtml> <events> <adminhtml_block_html_before> <observers> <mymodule> <!-- Add column to catalog product grid --> <class>mymodule/adminhtml_observer</class> <method>onBlockHtmlBefore</method> </mymodule> </observers> </adminhtml_block_html_before> <eav_collection_abstract_load_before> <observers> <mymodule> <!-- Add column to product list --> <class>mymodule/adminhtml_observer</class> <method>onEavLoadBefore</method> </mymodule> </observers> </eav_collection_abstract_load_before> </events> </adminhtml> </config>
Приложение / код / местные / My / модуль / модель / Adminhtml / наблюдатель
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': /* @var $block Mage_Adminhtml_Block_Catalog_Product_Grid */ $block->addColumn('COLUMN_ID', array( 'header' => Mage::helper('mymodule')->__('COLUMN HEADER'), 'index' => 'COLUMN_ID', )); break; } } public function onEavLoadBefore(Varien_Event_Observer $observer) { $collection = $observer->getCollection(); if (!isset($collection)) return; if (is_a($collection, 'Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection')) { /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection */ // Manipulate $collection here to add a COLUMN_ID column $collection->addExpressionAttributeToSelect('COLUMN_ID', '...Some SQL goes here...'); } } }
Чтобы улучшить ответ https://stackoverflow.com/a/5994209/1025437 by clockworkgeek:
Я решил не использовать наблюдателей, на мой взгляд, эти события слишком глобальны и приводят к тому, что нашего наблюдателя называют много раз. Используя следующий переписать в своем собственном модуле config.xml:
<config> <global> <blocks> <adminhtml> <rewrite> <catalog_product_grid>Myname_Catalogextended_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> </rewrite> </adminhtml> </blocks> </global> </config>
Со следующим файлом в
app/code/local/Myname/Catalogextended/Block/Adminhtml/Catalog/Product/Grid.php
содержащий что-то вроде:
<?php class Myname_Catalogextended_Block_Adminhtml_Catalog_Product_Grid extends Mage_Adminhtml_Block_Catalog_Product_Grid { /* Overwritten to be able to add custom columns to the product grid. Normally * one would overwrite the function _prepareCollection, but it won't work because * you have to call parent::_prepareCollection() first to get the collection. * * But since parent::_prepareCollection() also finishes the collection, the * joins and attributes to select added in the overwritten _prepareCollection() * are 'forgotten'. * * By overwriting setCollection (which is called in parent::_prepareCollection()), * we are able to add the join and/or attribute select in a proper way. * */ public function setCollection($collection) { /* @var $collection Mage_Catalog_Model_Resource_Product_Collection */ $store = $this->_getStore(); if ($store->getId() && !isset($this->_joinAttributes['special_price'])) { $collection->joinAttribute( 'special_price', 'catalog_product/special_price', 'entity_id', null, 'left', $store->getId() ); } else { $collection->addAttributeToSelect('special_price'); } parent::setCollection($collection); } protected function _prepareColumns() { $store = $this->_getStore(); $this->addColumnAfter('special_price', array( 'header'=> Mage::helper('catalog')->__('special_price'), 'type' => 'price', 'currency_code' => $store->getBaseCurrency()->getCode(), 'index' => 'special_price', ), 'price' ); return parent::_prepareColumns(); } }
-<?php class Myname_Catalogextended_Block_Adminhtml_Catalog_Product_Grid extends Mage_Adminhtml_Block_Catalog_Product_Grid { /* Overwritten to be able to add custom columns to the product grid. Normally * one would overwrite the function _prepareCollection, but it won't work because * you have to call parent::_prepareCollection() first to get the collection. * * But since parent::_prepareCollection() also finishes the collection, the * joins and attributes to select added in the overwritten _prepareCollection() * are 'forgotten'. * * By overwriting setCollection (which is called in parent::_prepareCollection()), * we are able to add the join and/or attribute select in a proper way. * */ public function setCollection($collection) { /* @var $collection Mage_Catalog_Model_Resource_Product_Collection */ $store = $this->_getStore(); if ($store->getId() && !isset($this->_joinAttributes['special_price'])) { $collection->joinAttribute( 'special_price', 'catalog_product/special_price', 'entity_id', null, 'left', $store->getId() ); } else { $collection->addAttributeToSelect('special_price'); } parent::setCollection($collection); } protected function _prepareColumns() { $store = $this->_getStore(); $this->addColumnAfter('special_price', array( 'header'=> Mage::helper('catalog')->__('special_price'), 'type' => 'price', 'currency_code' => $store->getBaseCurrency()->getCode(), 'index' => 'special_price', ), 'price' ); return parent::_prepareColumns(); } }
В этом примере после price
столбца добавляется атрибут special_price
. Поскольку этот атрибут имеет область хранилища, добавляется проверка для хранилища.