2016-07-25 4 views
0

Я использую Magento 1.9.2, и я переписываю таблицу сетки продуктов.Magento - Adminhtml Попытка поиска в сетке продукта по настраиваемому столбцу

Я сделал копию с оригинального Grid.php и создал это:

/app/code/local/Mage/Adminhtml/Block/Catalog/Product/Grid.php и вот что он содержит:

<?php 
class Mage_Adminhtml_Block_Catalog_Product_Grid extends Mage_Adminhtml_Block_Widget_Grid 
{ 

    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'); 

     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', 
     )); 

     $this->addColumn('number', 
      array(
       'header'=> Mage::helper('catalog')->__('Поръчка №'), 
       'width' => '50px', 
       'index' => 'entity_id', 
       'renderer' => 'Mage_Adminhtml_Block_Catalog_Product_Renderer', 
     )); 

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

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

обычай код я добавил в Grid.php это:

$this->addColumn('number', 
     array(
      'header'=> Mage::helper('catalog')->__('Поръчка №'), 
      'width' => '50px', 
      'index' => 'entity_id', 
      'renderer' => 'Mage_Adminhtml_Block_Catalog_Product_Renderer', 
    )); 

Я создал и оказал также, я видел это в другом ответе:

<?PHP 
class Mage_Adminhtml_Block_Catalog_Product_Renderer extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract 
{ 
     public function render(Varien_Object $row) 
     { 

     $productId = $row->getData($this->getColumn()->getIndex()); 
      $orders = array(); 
      $collection = Mage::getResourceModel('sales/order_item_collection') 
       ->addAttributeToFilter('product_id', array('eq' => $productId)) 
       ->load(); 
      foreach($collection as $orderItem) { 
       $orders[$orderItem->getOrder()->getIncrementId()] = $orderItem->getOrder(); 
      } 

      $first_key = key($orders); 
      return $first_key; 


     } 
} 

Я добавил дополнительный столбец, чтобы я мог отображать в каждой строке, в каком идентификаторе заказа купленный продукт. У меня нет проблем. Все правильно, но проблема возникает, когда я пытаюсь выполнить поиск с помощью этого настраиваемого столбца.

Идентификатор заказа отображается правильно в столбце, но не может быть найден по идентификатору заказа.

Где моя ошибка, почему она не работает и как я могу ее исправить?

Заранее благодарен!

ответ

1

Вы не можете найти свой custom_column в сетке, потому что вы только что использовали средство визуализации, которое возвращает order_id во время выполнения и готовит ваши столбцы. Вот и все. Что делает сетка magento, она фильтрует загруженную коллекцию с помощью «текста поиска».

Например: - вы выполняете поиск order_id = 10000901, ваш результат поиска возвращает null, потому что order_id отсутствует в коллекции.

Итак, вы должны присоединиться к sales_flat_order & sales_flat_order_item с вашей таблицей продуктов, чтобы получить инкремент в коллекции. Затем сортировка & будет работать отлично.

+0

Спасибо большое за ответ , Я знаю, что должен сделать это, но я не знаю, как это сделать. Не могли бы вы мне помочь? –

+0

Может ли кто-нибудь помочь. Любой гид? –

+0

Какой код добавить? Не могли бы вы ответить на вопрос компе. Я искал так много размещенных и не могу решить проблему. Заранее спасибо! –

1

Пожалуйста, добавьте этот код

$collection->getSelect()->joinLeft( 
     array('order_item'=>'sales_flat_order_item'), 
     'e.entity_id = order_item.product_id', 
     array('order_item.product_id','order_item.order_id') 
     ); 
$collection->getSelect()->joinLeft( 
     array('order'=>'sales_flat_order'), 
     'order_item.order_id = `order`.entity_id', 
     array('order.increment_id') 
     ); 
$collection->getSelect()->group('e.entity_id'); 

перед тем $this->setCollection($collection); в методе _prepareCollection() вашего кода колонки /app/code/local/Mage/Adminhtml/Block/Catalog/Product/Grid.php

и

обновление ниже

$this->addColumn('increment_id', 
    array(
     'header'=> Mage::helper('catalog')->__('Order Id'), 
     'width' => '100px', 
     'type' => 'number', 
     'index' => 'increment_id', 
)); 
+0

Спасибо за ответ. Теперь поиск работает, но перенаправляет меня на страницу заказов. Зачем ? Можно ли оставаться на сетке продуктов и отображать результаты там? –

+0

Даже поиск не работает. Он просто перенаправляется на страницу сетки продаж. Не могли бы вы помочь мне? Благодарю. –

+0

можете ли вы разрешить эту колонку? Возможно ли это? –