2016-04-22 9 views
1

Ich habe ein Problem beim Anzeigen meiner benutzerdefinierten Attribut als Spalte im Raster.Gewusst wie: Hinzufügen benutzerdefiniertes Attribut auf Produkt Grid in Magento 1.9.2 Community Edition

Zuerst habe ich ein Attribut programmatisch Update-Skript verwenden, hier ist der Code:

$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(); 

Dieser Code ist für mich gut funktioniert, und es ist ein Attribut zu schaffen.

Als ich überschreiben die grid.php erfolgreich und legte meinen Code ihre aber es funktioniert nicht Spalte ist im Raster sichtbar, aber die Daten kommen nicht.

Code von 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

Antwort

0

Credits @Raphael bei Digital Pianism

Ja, das ist ein häufiges Problem.

Also hier das Problem ist, dass, wie Ihre benutzerdefinierte Raster der ursprünglichen Raster-Klasse erweitert

Mage_Adminhtml_Block_Catalog_Product_Grid, 

wenn Sie den folgenden Code aufrufen:

return parent::_prepareColumns(); 

Es geht an die Methode ursprünglich _prepareColumns und somit Überschreiben Sie Ihre benutzerdefinierten Spalten.

Um dies zu beheben, dass Sie die Eltern der Eltern-Methode aufrufen müssen:

return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns(); 

Das Gleiche gilt für die _prepareCollection Methode.

diese Art von Problemen zu vermeiden, ich sugget auch, dass Sie Ereignis Beobachter statt Neuschreiben Blöcke verwenden: https://magento.stackexchange.com/a/5986/2380

0

Sie den Renderer verpasst haben, wegen der sie nicht in der Lage ist, Daten zu laden. Versuchen Sie folgendes:

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

Ändern der Renderer Pfad entsprechend Ihrer Anforderung.