2015-04-14 2 views
0

Следующий код позволяет добавить столбец на страницу заказов/продаж, на которой отображается способ доставки в качестве описания доставки, содержащего все носители доставки.Magento - Нарушение ограничения целостности: 1052 - Способ доставки

_prepareCollection

$collection->getSelect()->join('sales_flat_order', 'main_table.entity_id = sales_flat_order.entity_id',array('shipping_description')); 

_prepareColumn

$this->addColumn('shipping_method', array(
'header' => Mage::helper('sales')->__('Shipping Method'), 
'index' => 'shipping_description', 
'filter_index' => 'main_table.status', 
)); 

способ доставки кажется совершенным после того как я скомпилировать все. Теперь, когда я пытаюсь отсортировать заказы по prcessing и нажмите на поиск речь идет об этой ошибке:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'status' in where clause is ambiguous, query was: SELECT COUNT(*) FROM `sales_flat_order_grid` AS `main_table` INNER JOIN `sales_flat_order` ON main_table.entity_id = sales_flat_order.entity_id WHERE (status = 'processing') 

После некоторых исследований это означает, что существует двойной статус, когда таблицы соединяются, теперь, как я создаю ALIANS от этого и как я его применяю. Кроме того, если кто-нибудь знает, как фильтровать/сортировать по этому столбцу, это будет потрясающе.

PS. Этот файл находится по адресу: приложения/код/​​местные/Mage/Adminhtml/Block/Sales/Order

EDIT: Теперь я пытаюсь выяснить, как создать варианты DropDown на основе значений в базе данных. Вот код, который я пытаюсь получить работу:

private static $_deliveryGroups = array(); 

public static function getDeliveryArray() { 
if (count(self::$_deliveryGroups) == 0) { 
    $delivery_group = new Mage_Shipping_Model_Group(); 
    $delivery_groups = $delivery_group->getColection()->toOptionHash(); 
    self::$_deliveryGroups = $delivery_groups; 
} 
return self::$_deliveryGroups; 
} 

И дополнительные значения в Grid.php

$this->addColumn('shipping_method', array(
    'header' => Mage::helper('sales')->__('Shipping Method'), 
    'renderer' => 'Vehence_Module_Block_Adminhtml_Block_Sales_Order_Desc', 
    'type' => 'options', 
    'options' => Vehence_Module_Block_Adminhtml_Block_Sales_Order_Desc::getDeliveryArray(), 
    )); 

И это:

protected function _getAttributeOptions($attribute_code) 
    { 
     $attribute = Mage::getModel('sales/order')->getAttribute('shipping_description', $attribute_code); 
     $options = array(); 
     foreach($attribute->getSource()->getAllOptions(true, true) as $option) { 
      $options[$option['value']] = $option['label']; 
     } 
     return $options; 
} 

ответ

1

Вы должны использовать пользовательский визуализатор для вашего нового поля. Затем в способе рендеринга вы имеете orderId. С помощью этого идентификатора вы можете создать экземпляр объекта заказа и получить и вывести любое поле, которое вам нравится.

Вот пример: https://magento.stackexchange.com/questions/62856/how-to-get-latest-order-comment-on-the-order-grid-column/62859#62859

class Vendor_Module_Block_Renderer_Shipping extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract 
{ 
    public function render(Varien_Object $row) 
    { 
     $orderId = $row->getId(); 
     $order = Mage::getModel('sales/order')->load($orderId); 
     return $order->getData('shipping_description'); 
    } 
} 

К следующему методу (лучше с переписывания) добавить следующее:

$this->addColumn('history', array(
    'header' => Mage::helper('sales')->__('History status'), 
    'type' => 'text', 
    'renderer' => new Vendor_Module_Block_Renderer_Shipping() 
)); 

upd.1

Итак ... Я не применял никаких фильтров к моему решению. Проблема заключалась в сборе заказов. Визуально это выглядит хорошо, но все фильтры применяют коллекцию, которая не содержит необходимого поля для фильтрации. Это потому, что я отказался от своего решения.

Это потому, что я думал, что ваше решение было намного лучше для этой цели, и я решил исправить это. Я создал git-репозиторий для этого модуля. Он должен работать. Проверьте это: https://github.com/zhartaunik/AddField

Надеется, что это будет полезно

+0

Не могли бы вы рассказать, как мне создать этот обычай вынести, я не уверен в управлении файлами в этой области, если бы я мог создать это в grid.php или внешнего класса - где бы он будет размещен. Я действительно не хочу создавать модуль. – damek132

+0

обновлен. Я не рекомендую вам переписывать или редактировать основные файлы. Лучше создайте новый модуль. – zhartaunik

+0

Не уверен, что вы заметили, но я скопировал основной файл и работал с тем же файлом в локальной папке: app/code/local/Mage/Adminhtml/Block/Sales/Order – damek132

0

Вам нужно добавить дополнительный параметр массива, чтобы решить эту проблему, т.е.filter_index

$this->addColumn('status', array(
     'header' => Mage::helper('sales')->__('Status'), 
     'index' => 'status', 
     '**filter_index' => 'main_table.status**', 
     'type' => 'options', 
     'width' => '70px', 
     'options' => Mage::getSingleton('sales/order_config')->getStatuses(), 
));