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,您可以实例化订单对象并获取和输出您喜欢的任何字段。
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(),
));
以下代码允许将一列添加到 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,您可以实例化订单对象并获取和输出您喜欢的任何字段。
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(),
));