2016-04-22 62 views
1

我在将网格中的自定义属性显示为列时出现问题。如何在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()) 
    ); 
} 

enter image description here

回答

0

学分@Raphael的

代码啊,这是一个普遍的问题。

所以这里的问题是,作为您的自定义网格扩展了原有的电网类

Mage_Adminhtml_Block_Catalog_Product_Grid, 

当你调用下面的代码:

return parent::_prepareColumns(); 

它去到原来的_prepareColumns方法,从而,覆盖您的自定义列。

为了解决这个问题,你需要调用父类的父类的方法:

return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns(); 

规则同样适用于 _prepareCollection方法。

为了避免那样的问题,我也sugget您使用事件观察者,而不是改写块: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' 
    )); 

根据您的要求更改渲染器路径。

相关问题