WackGet
WackGet

Reputation: 2916

Magento basic advice needed: modifying a specific product grid in the admin section?

I have a few general questions about modifying Magento's admin section and would be grateful to have them answered. I'm new to Magento so please bear with me.

My goal is to add a new column with a product attribute (e.g. "Size") to the "Category Products" table within the Catalog -> Manage Cateories section (see screenshot below).

Having little Magento dev experience, I'm not quite sure where to start. I had a look in some of the Grid.php files under the adminhtml directory, and while I see a bunch of statements like addColumn(...), I'm not sure where I'd slot in my new attribute column.

Also, I assume that instead of modifying any core files directly, I'd copy them to the same path under the local folder and edit or somehow extend them there? Do I have to edit any config files or do anything else for the change to be reflected? Am I - by doing this - in effect creating my own module?

I also read that I should disable "Compilation" before I make any changes. Why is this? Is there anything else to consider?

Again I am very grateful for any help and appreciate that my questions must seem basic. Any supplementary resources you could point me towards would be appreciated. Thanks.

enter image description here

Upvotes: 3

Views: 905

Answers (3)

Max
Max

Reputation: 8836

Indeed you should start by understanding what file to edit and how to edit it. In this case you want to modify app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php but, like you said, you should not modify the file in its current location. There are two ways to modify the file in the "correct" way.

  1. (harder but more extensible) Create a new Module in local and tell Magento in the etc/config.xml that you are overwriting that Block (which is just a php class) with a different block in this new Module and have the new class extend the core Block class. Then you just need to overwrite one function (_prepareColumns).
  2. (easier) Copy the file from app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php to app/code/local/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php and modify the function you want (_prepareColumns)

If you are new to Magento, I recommend going with the second option because its easier. Magento will always load the file from local before it loads from core so the file in core will no longer be used and your version in local will be used. To find out more, read this article from Alan Storm

Now in order to add the column you want, do something similar to the SKU field

$this->addColumn('size', array(
    'header'    => Mage::helper('catalog')->__('Size'),
    'index'     => 'size'
));

in the order you want it (between Product Name and SKU). I am assuming that your Products have a field called size that you can retreive with $product->getSize()

Upvotes: 5

Allan MacGregor
Allan MacGregor

Reputation: 924

Max solution was pretty spot on but missing some important steps, I'll elaborate on his original method

  1. Create a new local override of the Product Tab by copying app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php to app/code/local/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php

  2. There are 2 functions involved in modifying the grid view. _prepareCollection and _prepareColumns

  3. _prepareColumns by adding a call to the addColumn function just like:

    $this->addColumn('size', array(
        'header'    => Mage::helper('catalog')->__('Size'),
        'width'     => '80',
        'index'     => 'size'
    ));
    
  4. _prepareCollection, by default the product collection loaded in the grid only has a few attributes(name,sku,price) what you need to do add our now attribute by ->addAttributeToSelect('size') now if you are only working with a textfield attribute then this is the extend of the modifications you have to do however if your attribute is for example a dropdown you will need to do further changes to the prepare collection:

  5. (optional) dropdown attributes only store the value of the option that was select so we need to provide an options array to the addColumns call so Magento can display the values correctly, we can do that in the following maner:

on your local copy of Products, add the following to the _prepareColumns functions

    $attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'colour');
    $options = array();
    foreach( $attribute->getSource()->getAllOptions(true, true) as $option ) {
       $options[$option['value']] = $option['label'];
    }
    $this->addColumn('colour', array(
        'header'    => Mage::helper('catalog')->__('Colour'),
        'width'     => '80',
        'index'     => 'colour',
        'type'      => 'options',
        'options'   =>  $options
    ));

Upvotes: 2

clockworkgeek
clockworkgeek

Reputation: 37700

While those are some very thorough question and I'm sure you will learn a lot, there is a ready-made solution; Enhanced Admin Product Grid has the ability to add arbitrary attributes as columns.

Upvotes: 1

Related Questions