Magento - 违反完整性约束:1052 - 运输方式

Magento - Integrity constraint violation: 1052 - Shipping Method

以下代码允许将一列添加到 orders/sales 页面,其中将运输方式显示为包含所有送货承运人的运输描述。

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

我编译所有内容后,运输方式看起来很完美。现在,当我尝试通过处理对订单进行排序并点击搜索时,出现了这个错误:

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

经过一些研究,这意味着当表被连接时存在双重状态,现在我如何从中创建一个别名以及如何应用它。另外,如果有人知道通过本专栏到达 filter/sort 的方式,那就太棒了。

PS。该文件位于: app/code/local/Mage/Adminhtml/Block/Sales/Order

编辑: 现在我试图弄清楚如何根据数据库中的值创建选项下拉列表。这是我试图开始工作的代码:

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

您需要为新字段使用自定义渲染器。然后在渲染器方法中你有 orderId。使用该 ID,您可以实例化订单对象并获取和输出您喜欢的任何字段。

这里有一个例子: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

希望对您有所帮助

您需要添加额外的数组选项来解决此问题,即 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(),
));