1

I've created a new module in order to add a column to the product list displayed in the admin section of Magento. The column is displaying an ID and I want it to display the name (from another table) belonging to that ID.

app/code/local/Mypackage/Customgrid/etc/Config.xml

<?xml version="1.0"?>
<config>
 <modules>
 <Mypackage_Customgrid>
 <version>0.4.0</version>
 </Mypackage_Customgrid>
 </modules>
 <global>
 <models>
 <mypackage_customgrid>
 <class>Mypackage_Customgrid_Model</class>
 </mypackage_customgrid>
 </models>
 </global>
 <adminhtml>
 <events>
 <core_block_abstract_prepare_layout_before>
 <observers>
 <customgrid_column_append>
 <type>model</type>
 <class>Mypackage_Customgrid_Model_Observer</class>
 <method>appendCustomColumn</method>
 </customgrid_column_append>
 </observers>
 </core_block_abstract_prepare_layout_before>
 </events>
 </adminhtml>
</config>

app/code/local/Mypackage/Customgrid/Model/Observer.php

class Mypackage_Customgrid_Model_Observer extends Varien_Event_Observer {
 public function appendCustomColumn(Varien_Event_Observer $observer) {
 $block = $observer->getBlock();
 if (!isset($block)) {
 return $this;
 }
 if ($block->getType() == 'adminhtml/catalog_product_grid') {
 /* @var $block Mage_Adminhtml_Block_Customer_Grid */
 $block->addColumnAfter('udropship_vendor', array(
 'header' => 'Vendor',
 'index' => 'udropship_vendor',
 'type' => 'text',
 ), 'visibility');
 }
 }
}

As you can see in the above code, I'm using the uDropship extension. The above code display the vendor ID related to each product, but I would like this column to display the vendor name related to each product.

I've tried to change the collection fetch in the file app/code/core/Adminhtml/Block/Catalog/Product/Grid.php (only for test purpose, I'll overwrite this file if I find how to do that). But I don't understand how to get the name value from the database.

Btw, the table schema in which the data I want to display is stored looks like something like that

table: magentoudropship_vendor
 vendor_id
 vendor_name
 [...]

Is anyone capable of guiding me through this ? Anything which can help me to understand how to manipulate the database is welcome.

asked Mar 16, 2015 at 12:20

1 Answer 1

2

app/code/core/Adminhtml/Block/Catalog/Product/Grid.php is the right place to start. What you need to do is rewrite Mage_Adminhtml_Block_Catalog_Product_Grid::_prepareCollection and join magentoudropship_vendor, so that you have access to the vendor_name for the grid. I'm assuming you have vendor_id as an attribute to the product (correct me if I'm wrong).

Additionally, I would add the column to the product list grid in this rewrite. See Mage_Adminhtml_Block_Catalog_Product_Grid::_prepareColumns. This is where you can add additional columns.

You need something like...

protected function _prepareCollection()
{
 $resource = Mage::getSingleton('core/resource');
 $collection = Mage::getModel('catalog/product')->getCollection()
 ->addAttributeToSelect('sku')
 ->addAttributeToSelect('name')
 ->addAttributeToSelect('attribute_set_id')
 ->addAttributeToSelect('type_id');
 $collection->getSelect()
 ->join(
 array('v' => $resource->getTableName('...')), // Insert approprirate alias to get `magentoudropship_vendor`
 'main_table.vendor_id = v.vendor_id',
 array('vendor_name') // List of wanted columns from the custom table
 );
 ...
}

Alias for the getTableName() method is found in your config.xml of the uDropShip extension. e.g. model_alias/table_name. Copy and paste the <models>...<models> if you're still not sure.

answered Mar 16, 2015 at 13:17
6
  • The block holds the collection, so you could also call $block->getCollection() in the observer, right? Commented Mar 16, 2015 at 13:21
  • Thanks for you response. I just have a few questions: 1. where does $resource come from ? I don't have this variable in the Grid.php 2. you talk about the alias to get the database ? is it the database name or should I use something else ? And you're right, the udropship_vendor used in my custom column is a product's attribute. Commented Mar 16, 2015 at 13:27
  • @7ochem, I extend _prepareCollection when I modify grids because you can do everything in one rewrite. I have used other approaches in modifying grids (observer, XML update, etc.) but I find the block rewrite to be the best. Commented Mar 16, 2015 at 13:31
  • @christophe, updated the ansnwer. Commented Mar 16, 2015 at 13:36
  • This works now, I'll continue to look for information about database manipulation with Magento though. Thank you. Commented Mar 16, 2015 at 15:28

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.