Как правильно добавить столбец shipping_description в сетке заказа magento?

Есть много руководств и предложений, включая установку пользовательских расширений и т. Д.

Я добавил прекрасное описание shipping_description на основе различных советов и трюков, изменив Grid.php следующим кодом, но когда дело доходит до сортировки по цене или статусу, оно вызывает ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 1052 Столбец «статус» в том, где предложение неоднозначно или SQLSTATE [23000]: нарушение ограничения целостности: 1052 Столбец «increment_id» в том, где предложение неоднозначно

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

Следующий код был добавлен в Grid.php:

protected function _prepareCollection() { $collection = Mage::getResourceModel($this->_getCollectionClass()); $tableName = Mage::getSingleton("core/resource")->getTableName('sales_flat_order'); $collection->getSelect()->join($tableName, "main_table.entity_id = $tableName.entity_id",array("shipping_description")); $this->setCollection($collection); return Mage_Adminhtml_Block_Widget_Grid::_prepareCollection(); } protected function _prepareColumns() { $this->addColumnAfter('shipping_description', array( 'header' => Mage::helper('sales')->__('Delivery'), 'width' => '180px', 'type' => 'text', 'index' => 'shipping_description' ),'shipping_name'); return parent::_prepareColumns(); } 

любые мысли, идеи были бы оценены !!!

Я предполагаю, что вы делаете добавление поля «shipping_description» в коллекции, но я могу помочь вам сделать простой. т.е. с помощью рендерера в сетке. На мой взгляд, это намного проще.

После того, как вы переопределите блок сетки для заказа (переопределите блок – хорошая практика) добавьте это в свою функцию _prepareColumn ()

  $this->addColumn('shipping_description', array( 'header'=> Mage::helper('sales')->__('Shipping Description'), 'index' => 'shipping_description', 'filter' => false, 'sortable' => false, 'renderer' => 'PackageName_ModuleName_Block_Adminhtml_Sales_Order_Renderer_Shipping', )); 

Здесь вы можете увидеть средство визуализации, которое указывает на класс «PackageName_ModuleName_Block_Adminhtml_Sales_Order_Renderer_Shipping». Теперь, продолжайте и создайте папку Named «Renderer» в вышеупомянутом пути, и внутри этой папки создайте файл «Shipping.php».

 <?php class Custom_Customer_Block_Adminhtml_Customer_Renderer_Lifetime extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract { public function render(Varien_Object $row) { $customerId = $row->getData('entity_id'); $customer = Mage::getModel('customer/customer')->load($customerId); $customerTotals = Mage::getResourceModel('sales/sale_collection') ->setCustomerFilter($customer) ->load() ->getTotals(); $customerLifetimeSales = $customerTotals->getLifetime(); //$customerNumberOfOrders = $customerTotals->getNumOrders(); echo Mage::helper('core')->currency($customerLifetimeSales); } } 

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

Таким образом, вам не нужно присоединяться к таблицам в коллекции. Просто позвоните модели, которая доставит вам описание доставки и распечатайте его. Это его. Это упростит работу

Надеюсь, это поможет.

Чтобы предотвратить этот тип ошибок при сортировке столбцов

 SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'status' in where clause is ambiguous ERROR 

при сортировке ваших заказов … Убедитесь, что вы добавили:

 'filter_index'=>'main_table.status', 

в массив состояния AddColumn

надеюсь, это поможет вам.

В моем случае работала. Сортировка теперь работает из каждого отдельного поля. Никакие файлы ядра не переопределены.

Шаг за шагом для тех, кто находится в одной лодке. Протестировано в 1.8.1

  1. Скопируйте файл Grid.php из

    /app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php to /app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php

    если путь не существует, создайте его.

  2. Откройте новый Grid.php и добавьте следующий код в _prepareCollection() после строки getResourceModel :

    $collection->getSelect()->join(array('mt'=>'sales_flat_order'), 'mt.entity_id = main_table.entity_id', array('mt.increment_id','mt.store_id','mt.created_at','mt.shipping_description','mt.status','mt.base_grand_total','mt.grand_total'));

    $collection->getSelect()->group('main_table.entity_id');

  3. Добавьте следующий код в _prepareColumns() (между вашими addColumn() )

    $this->addColumn('shipping_description', array( 'header' => Mage::helper('sales')->__('Delivery'), 'type' => 'text', 'index' => 'shipping_description',
    'filter_index' => 'mt.shipping_description', ));

  4. Найдите функции addColumns() для increment_id, store_id, created_at, base_grand_total, grand_total, status и добавьте в них следующий аргумент:

    'filter_index' => 'mt.___your_column_name____',

Любое предложение о том, как оптимизировать код выше, приветствуется.