Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
Benvenuti nel sito "faster than 98% of all tested websites" (tools.pingdom.com) senza cookie e senza pubblicitĂ      

Magento : Aggiungere una colonna nell'elenco dei prodotti

I grid usati da Magento per impaginare i record nei vari pannelli di amministrazione sono personalizzabili. Oggi aggiungiamo ad esempio una colonna alla griglia di selezione dei prodotti all'interno delle categorie. Saranno sufficienti meno righe di codice di quello che pensiamo!

Magento

L'esigenza è ben spiegata dai due screenshot sottostanti: il nostro cliente oggi ha bisogno di un campo aggiuntivo per filtrare i prodotti nell'area amministrativa di Magento, in particolare nella schermata di selezione nell'apposito tab delle categorie:

prima...



e dopo...

In questo modo sarà possibile scegliere i prodotti da associare alla categoria avendo davanti soltanto quelli realmente attivi.

A questo scopo, creiamo questi tre files.

Creiamo la cartella /app/code/local/Infocurci/Categoria/Block/Adminhtml/Catalog/Category/Tab e inseriamo dentro il file Product.php, con questo contenuto.

<?php

class Infocurci_Categoria_Block_Adminhtml_Catalog_Category_Tab_Product extends Mage_Adminhtml_Block_Catalog_Category_Tab_Product
{

    public function _preparePage()
    {
        $this->getCollection()->joinAttribute(
            'status',
            'catalog_product/status',
            'entity_id',
            null,
            'inner',
            $this->_getStore()->getId()
        );
        return parent::_preparePage();
    }


    protected function _prepareColumns()
    {
        if (!$this->getCategory()->getProductsReadonly()) {
            $this->addColumn('in_category', array(
            'header_css_class' => 'a-center',
            'type'      => 'checkbox',
            'name'      => 'in_category',
            'values'    => $this->_getSelectedProducts(),
            'align'     => 'center',
            'index'     => 'entity_id'
            ));
        }
        $this->addColumn('entity_id', array(
            'header'    => Mage::helper('catalog')->__('ID'),
            'sortable'  => true,
            'width'     => '60',
            'index'     => 'entity_id'
        ));
        $this->addColumn('name', array(
            'header'    => Mage::helper('catalog')->__('Name'),
            'index'     => 'name'
        ));
        $this->addColumn('sku', array(
            'header'    => Mage::helper('catalog')->__('SKU'),
            'width'     => '80',
            'index'     => 'sku'
        ));
        $this->addColumn('price', array(
            'header'    => Mage::helper('catalog')->__('Price'),
            'type'  => 'currency',
            'width'     => '1',
            'currency_code' => (string) Mage::getStoreConfig(Mage_Directory_Model_Currency::XML_PATH_CURRENCY_BASE),
            'index'     => 'price'
        ));
        $this->addColumn('position', array(
            'header'    => Mage::helper('catalog')->__('Position'),
            'width'     => '1',
            'type'      => 'number',
            'index'     => 'position',
            'editable'  => !$this->getCategory()->getProductsReadonly()
            //'renderer'  => 'adminhtml/widget_grid_column_renderer_input'
        ));
        $this->addColumn('status',
            array(
            'header'=> Mage::helper('catalog')->__('Status'),
            'width' => '70px',
            'index' => 'status',
            'type'  => 'options',
            'options' => Mage::getSingleton('catalog/product_status')->getOptionArray(),
        ));

        return parent::_prepareColumns();
    }
   
    protected function _getStore()
    {
        $storeId = (int) $this->getRequest()->getParam('store', 0);
        return Mage::app()->getStore($storeId);
    }

}


In questo file non abbiamo fatto altro che estendere la classe Mage_Adminhtml_Block_Catalog_Category_Tab_Product (responsabile della grid con l'elenco dei prodotti) ed aggiungere una nuova colonna con l'attributo "status".
La funzione _preparePage() ci consente di stampare gli status enabled/disabled di ogni riga (senza questa funzione, la colonna sarebbe stata stampata ugualmente ma senza valori, se non dopo averla selezionata come filtro).  
In _prepareColumns abbiamo dichiarato le varie colonne, cosi come nella funzione della classe originaria, aggiungendo però "status".
L'ultima funzione, _getStore, è di supporto alla prima per la selezione dell'attributo.

A questo punto creiamo il file di configurazione del blocco, segnalando a Magento la sovrascrittura.  Il file va dentro /app/code/local/Infocurci/Categoria/etc e va chiamato come sempre config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Infocurci_Categoria>
            <version>0.0.1</version>
        </Infocurci_Categoria>
    </modules>
    <global>
        <blocks>
            <adminhtml>
                <rewrite>
                    <catalog_category_tab_product>Infocurci_Categoria_Block_Adminhtml_Catalog_Category_Tab_Product</catalog_category_tab_product>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>

Ovviamente la parte fondamentale è nel nodo catalog_category_tab_product, dove dichiariamo la nuova classe per la gestione del blocco catalog_category_tab_product.

Infine attiviamo il modulo creando in /app/etc/modules il flle Infocurci_Categoria.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Infocurci_Categoria>
            <active>true</active>
            <codePool>local</codePool>
        </Infocurci_Categoria>
    </modules>
</config>

Ricordiamoci di aggiornare la cache e di rieseguire l'eventuale processo di compilazione, se attivo.

Tutorial pubblicato il 26/11/2015