Как добавить пользовательский атрибут в сетку продукта в версии сообщества magento 1.9.2

У меня проблема при отображении моего пользовательского атрибута в виде столбца в сетке.

Сначала я создал атрибут программно, используя скрипт обновления, вот код:

$installer = $this;

$installer->startSetup();

// Set data:
$attributeName  = 'Owners'; // Name of the attribute
$attributeCode  = 'owners'; // Code of the attribute
$attributeGroup = 'General';          // Group to add the attribute to
$attributeSetIds = array(4);          // Array with attribute set ID's to add this attribute to. (ID:4 is the Default Attribute Set)

// Configuration:
$data = array(
'type'      => 'varchar',       // Attribute type
'input'     => 'text',          // Input type
'global'    => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,    // Attribute scope
'required'  => false,           // Is this attribute required?
'user_defined' => false,
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => false,
'unique' => false,
'used_in_product_listing' => true,
'default_value_yesno' => '0',
// Filled from above:
'label' => $attributeName
);

// Create attribute:
// We create a new installer class here so we can also use this snippet in a non-EAV setup script.
$installer = Mage::getResourceModel('catalog/setup', 'catalog_setup');

$installer->addAttribute('catalog_product', $attributeCode, $data);$installer->addAttributeToSet(
'catalog_product', 'Default', $attributeGroup, $attributeCode
); //Default = attribute set, General = attribute group$installer->endSetup();

Этот код работает нормально для меня и создает атрибут.

После того, как я успешно переопределил grid.php и поставил свой код, но он не работает, столбец виден в сетке, но данные не поступают.

код grid.php

public function __construct()
{
parent::__construct();
$this->setId('productGrid');
$this->setDefaultSort('entity_id');
$this->setDefaultDir('DESC');
$this->setSaveParametersInSession(true);
$this->setUseAjax(true);
$this->setVarNameFilter('product_filter');

}

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

protected function _prepareCollection()
{
$store = $this->_getStore();
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('sku')
->addAttributeToSelect('name')
->addAttributeToSelect('attribute_set_id')
->addAttributeToSelect('type_id')
->addAttributeToSelect('owners');

if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) {
$collection->joinField('qty',
'cataloginventory/stock_item',
'qty',
'product_id=entity_id',
'{{table}}.stock_id=1',
'left');
}
if ($store->getId()) {
//$collection->setStoreId($store->getId());
$adminStore = Mage_Core_Model_App::ADMIN_STORE_ID;
$collection->addStoreFilter($store);
$collection->joinAttribute(
'name',
'catalog_product/name',
'entity_id',
null,
'inner',
$adminStore
);
$collection->joinAttribute(
'custom_name',
'catalog_product/name',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'status',
'catalog_product/status',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'visibility',
'catalog_product/visibility',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'price',
'catalog_product/price',
'entity_id',
null,
'left',
$store->getId()
);
}
else {
$collection->addAttributeToSelect('price');
$collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
}

$this->setCollection($collection);

parent::_prepareCollection();
$this->getCollection()->addWebsiteNamesToResult();
return $this;
}

protected function _addColumnFilterToCollection($column)
{
if ($this->getCollection()) {
if ($column->getId() == 'websites') {
$this->getCollection()->joinField('websites',
'catalog/product_website',
'website_id',
'product_id=entity_id',
null,
'left');
}
}
return parent::_addColumnFilterToCollection($column);
}

protected function _prepareColumns()
{
$this->addColumn('entity_id',
array(
'header'=> Mage::helper('catalog')->__('ID'),
'width' => '50px',
'type'  => 'number',
'index' => 'entity_id',
));
$this->addColumn('name',
array(
'header'=> Mage::helper('catalog')->__('Name'),
'index' => 'name',
));

$store = $this->_getStore();
if ($store->getId()) {
$this->addColumn('custom_name',
array(
'header'=> Mage::helper('catalog')->__('Name in %s', $store->getName()),
'index' => 'custom_name',
));
}

$this->addColumn('type',
array(
'header'=> Mage::helper('catalog')->__('Type'),
'width' => '60px',
'index' => 'type_id',
'type'  => 'options',
'options' => Mage::getSingleton('catalog/product_type')->getOptionArray(),
));

$sets = Mage::getResourceModel('eav/entity_attribute_set_collection')
->setEntityTypeFilter(Mage::getModel('catalog/product')->getResource()->getTypeId())
->load()
->toOptionHash();

$this->addColumn('set_name',
array(
'header'=> Mage::helper('catalog')->__('Attrib. Set Name'),
'width' => '100px',
'index' => 'attribute_set_id',
'type'  => 'options',
'options' => $sets,
));

$this->addColumn('sku',
array(
'header'=> Mage::helper('catalog')->__('SKU'),
'width' => '80px',
'index' => 'sku',
));

$store = $this->_getStore();
$this->addColumn('price',
array(
'header'=> Mage::helper('catalog')->__('Price'),
'type'  => 'price',
'currency_code' => $store->getBaseCurrency()->getCode(),
'index' => 'price',
));

if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) {
$this->addColumn('qty',
array(
'header'=> Mage::helper('catalog')->__('Qty'),
'width' => '100px',
'type'  => 'number',
'index' => 'qty',
));
}

$this->addColumn('visibility',
array(
'header'=> Mage::helper('catalog')->__('Visibility'),
'width' => '70px',
'index' => 'visibility',
'type'  => 'options',
'options' => Mage::getModel('catalog/product_visibility')->getOptionArray(),
));

$this->addColumn('status',
array(
'header'=> Mage::helper('catalog')->__('Status'),
'width' => '70px',
'index' => 'status',
'type'  => 'options',
'options' => Mage::getSingleton('catalog/product_status')->getOptionArray(),
));

$this->addColumn('owners',
array(
'header'=> Mage::helper('catalog')->__('Owner'),
'width'=>'200px',
'index' => 'owners',
));
return parent::_prepareColumns();

if (!Mage::app()->isSingleStoreMode()) {
$this->addColumn('websites',
array(
'header'=> Mage::helper('catalog')->__('Websites'),
'width' => '100px',
'sortable'  => false,
'index'     => 'websites',
'type'      => 'options',
'options'   => Mage::getModel('core/website')->getCollection()->toOptionHash(),
));
}

$this->addColumn('action',
array(
'header'    => Mage::helper('catalog')->__('Action'),
'width'     => '50px',
'type'      => 'action',
'getter'     => 'getId',
'actions'   => array(
array(
'caption' => Mage::helper('catalog')->__('Edit'),
'url'     => array(
'base'=>'*/*/edit',
'params'=>array('store'=>$this->getRequest()->getParam('store'))
),
'field'   => 'id'
)
),
'filter'    => false,
'sortable'  => false,
'index'     => 'stores',
));

if (Mage::helper('catalog')->isModuleEnabled('Mage_Rss')) {
$this->addRssList('rss/catalog/notifystock', Mage::helper('catalog')->__('Notify Low Stock RSS'));
}

return parent::_prepareColumns();
}

protected function _prepareMassaction()
{
$this->setMassactionIdField('entity_id');
$this->getMassactionBlock()->setFormFieldName('product');

$this->getMassactionBlock()->addItem('delete', array(
'label'=> Mage::helper('catalog')->__('Delete'),
'url'  => $this->getUrl('*/*/massDelete'),
'confirm' => Mage::helper('catalog')->__('Are you sure?')
));

$statuses = Mage::getSingleton('catalog/product_status')->getOptionArray();

array_unshift($statuses, array('label'=>'', 'value'=>''));
$this->getMassactionBlock()->addItem('status', array(
'label'=> Mage::helper('catalog')->__('Change status'),
'url'  => $this->getUrl('*/*/massStatus', array('_current'=>true)),
'additional' => array(
'visibility' => array(
'name' => 'status',
'type' => 'select',
'class' => 'required-entry',
'label' => Mage::helper('catalog')->__('Status'),
'values' => $statuses
)
)
));

if (Mage::getSingleton('admin/session')->isAllowed('catalog/update_attributes')){
$this->getMassactionBlock()->addItem('attributes', array(
'label' => Mage::helper('catalog')->__('Update Attributes'),
'url'   => $this->getUrl('*/catalog_product_action_attribute/edit', array('_current'=>true))
));
}

Mage::dispatchEvent('adminhtml_catalog_product_grid_prepare_massaction', array('block' => $this));
return $this;
}

public function getGridUrl()
{
return $this->getUrl('*/*/grid', array('_current'=>true));
}

public function getRowUrl($row)
{
return $this->getUrl('*/*/edit', array(
'store'=>$this->getRequest()->getParam('store'),
'id'=>$row->getId())
);
}

введите описание изображения здесь

1

Решение

Авторы @Raphael at Digital Pianism

Да, это общая проблема.

Таким образом, проблема заключается в том, что, поскольку ваша пользовательская сетка расширяет исходный класс сетки

Mage_Adminhtml_Block_Catalog_Product_Grid,

когда вы вызываете следующий код:

return parent::_prepareColumns();

Он переходит к исходному методу _prepareColumns и, таким образом, перезаписывает ваши пользовательские столбцы.

Чтобы это исправить, вам нужно вызвать родительский метод родителя:

return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns();

То же самое касается
_prepareCollection метод.

Чтобы избежать подобных проблем, я также предполагаю, что вы используете наблюдатели событий вместо того, чтобы переписывать блоки: https://magento.stackexchange.com/a/5986/2380

0

Другие решения

Вы пропустили рендерер, из-за которого он не может загружать данные.
Попробуй это:

    $this->addColumn('owners',
array(
'header'=> Mage::helper('catalog')->__('Owner'),
'width'=>'200px',
'index' => 'owners',
'renderer' => 'adminhtml/widget_grid_column_renderer_owner'
));

Измените путь рендера в соответствии с вашими требованиями.

0

По вопросам рекламы [email protected]