2011-05-13 97 views

回答

23

我最近(事实上是昨天)不得不添加一列到同一个网格。部分原因是这种做法很差,主要是因为另一个模块已经使用了它自己的覆盖,我不想完全替换或重写该类。相反,这是通过事件修改产品网格的干净方式。

应用程序/代码/本地/我/模块的/ etc/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> 

应用程序/代码/本地/我/模块/型号/ 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...'); 
     } 
    } 

} 
+0

好东西,优秀:) – 2011-11-16 11:32:34

+1

我做了这个答案的更新,以便管理员可以过滤新产品列 – 2013-01-09 06:27:08

+0

啊!这真太了不起了!我发现唯一缺少的是对新列进行排序的功能。 – 2013-03-13 21:53:40

20

由clockworkgeek改善回答https://stackoverflow.com/a/5994209/1025437

我决定不使用观察者,在我的意见ñ这些事件太全球化,导致我们的观察员被多次召唤。在

app/code/local/Myname/Catalogextended/Block/Adminhtml/Catalog/Product/Grid.php 

含有类似

<config> 
    <global> 
     <blocks> 
      <adminhtml> 
       <rewrite> 
        <catalog_product_grid>Myname_Catalogextended_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
       </rewrite> 
      </adminhtml> 
     </blocks> 
    </global> 
</config> 

具有下列文件:在您自己的模块config.xml中使用以下重写

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

在这个例子中,一个属性命名special_price在列price之后添加。由于此属性具有存储范围,因此添加了存储检查。

相关问题