2011-05-13 15 views
9

Hola, quiero agregar una columna a la sección catolg> administrar productos (no el producto sino la lista de productos), esta columna debe enumerar todos los productos relacionados con los que el producto se identificó - quizás por sku o nombre - no hay preferencia allí.Agregar columna a Magento admin catolog> administrar productos

Agregué una columna para el fabricante pero olvidé de dónde obtuve el código.

gracias

Respuesta

23

Hace poco (ayer), de hecho, tuvieron que añadir una columna a la misma red. En parte porque es una práctica deficiente y principalmente porque otro módulo ya había utilizado su propia anulación, no quería reemplazar o anular la clase por completo. En cambio, aquí hay una forma limpia de modificar la grilla del producto a través de eventos.

app/código/local/Mi/Módulo/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> 

app/código/local/Mi/Módulo/modelo/Adminhtml/Observador

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

Buenas cosas, excelente :) –

+1

Hice una actualización de esta respuesta para que el administrador pueda filtrar el producto con la nueva columna añadida –

+0

¡Ah! ¡Esto es increíble! Lo único que veo que falta es la capacidad de ordenar la nueva columna. –

20

mejorar en respuesta https://stackoverflow.com/a/5994209/1025437 por clockworkgeek:

decidí a no utilizar los observadores, en mi opinio n esos eventos son demasiado globales y llevan a que se llame a nuestro observador muchas veces. Utilizando la siguiente reescritura en su propio módulo de 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> 

Con el archivo siguiente en

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

que contiene algo como:

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

En este ejemplo, un atributo nombrado special_price se agrega después de la columna price. Como este atributo tiene un alcance de tienda, se agrega el control de tienda.

Cuestiones relacionadas