我已经花了一整天的时间在这上面了,我想我无法做到这一点,因为取消了向订单添加自定义EAV属性的可能性。至少,我注意到sales_order_entity
不见了。
嗯,我想做的是在销售订单中添加一个自定义字段。我原以为它的工作方式与分类产品相同,但看起来没有。我做这一切的总体目的是因为我想跟踪谁在向目录中添加产品,并希望将特定订单与特定用户(而不是客户)联系起来。
public function getDefaultEntities()
{
return array(
'catalog_product' => array(
'entity_model' => 'catalog/product',
'attribute_model' => 'catalog/resource_eav_attribute',
'table' => 'catalog/product',
'additional_attribute_table' => 'catalog/eav_attribute',
'entity_attribute_collection' => 'catalog/product_attribute_collection',
'attributes' => array(
'seller_id' => array(
'group' => 'MyCustom',
'label' => 'Seller ID',
'type' => 'int',
'input' => 'text',
'default' => '0',
'class' => '',
'backend' => '',
'frontend' => '',
'source' => '',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
'visible' => false,
'required' => true,
'user_defined' => true,
'searchable' => true,
'filterable' => true,
'comparable' => false,
'visible_on_front' => false,
'visible_in_advanced_search' => false,
'unique' => false,
),
),
),
'order' => array(
'entity_model' => 'sales/order',
'table' => 'sales/order',
'increment_model' => 'eav/entity_increment_numeric',
'attributes' => array(
'seller_id' => array(
'group' => 'MyCustom',
'label' => 'Seller ID',
'type' => 'int',
'input' => 'text',
'default' => '0',
'class' => '',
'backend' => '',
'frontend' => '',
'source' => '',
'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
'visible' => false,
'required' => true,
'user_defined' => true,
'searchable' => true,
'filterable' => true,
'comparable' => false,
'visible_on_front' => false,
'visible_in_advanced_search' => false,
'unique' => false,
),
),
),
);
}
它适用于产品,但不适用于订单。我在eav_attribute表中有必需的条目。
我不知道是我做错了什么,还是这是不可能做到的?我还考虑过通过创建额外的表来跟踪用户订单|产品之间的关系来解决这种不同的方法。这将需要更多艰苦的工作。
我知道这是一篇旧帖子,但我在寻找同一问题的答案时遇到了它,所以我想分享我的解决方案。
让我们以向销售订单添加属性为例。
首先,如果您查看core/Mage/Sales/etc/config.xml ,Magento不再使用EAV实体进行销售
<sales>
<class>Mage_Sales_Model</class>
<resourceModel>sales_resource</resourceModel>
</sales>
resourceModel不再指向sales_entity(EAV),它现在指向sales_source(flat)。如果您查看sales_source节点的子节点,您会发现订单节点:
<order>
<table>sales_flat_order</table>
</order>
这意味着Mage_Sales_Model_Order具有Mage_Sales_Model_resource_Order的资源模型,该资源模型具有Sales_flat_Order表。
magento开发人员提供了类Mage_Sales_Model_Resource_Setup,该类允许您向这个新的"平面"结构添加属性,其方式与向EAV结构添加属性的方式几乎相同。如果您查看Mage_Sales_Model_Resource_Setup内部,您将看到以下功能:
/**
* Add entity attribute. Overwrited for flat entities support
*
* @param int|string $entityTypeId
* @param string $code
* @param array $attr
* @return Mage_Sales_Model_Resource_Setup
*/
public function addAttribute($entityTypeId, $code, array $attr)
{
if (isset($this->_flatEntityTables[$entityTypeId]) &&
$this->_flatTableExist($this->_flatEntityTables[$entityTypeId]))
{
$this->_addFlatAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr);
$this->_addGridAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr, $entityTypeId);
} else {
parent::addAttribute($entityTypeId, $code, $attr);
}
return $this;
}
有了这些信息,您现在应该看到,这只是一个获取Mage_Sales_Model_Resource_Setup实例并使用有效参数调用其公共addAttribute方法的例子。
向销售订单添加francise_id属性的代码片段:
$salesResourceSetupModel = Mage::getModel('sales/resource_setup', 'core_setup');
$data=array(
'type'=>'int',
'input'=>'text',
'label'=>'Franchise',
'global'=> 1,
'is_required'=>'0',
'is_comparable'=>'0',
'is_searchable'=>'0',
'is_unique'=>'0',
'is_configurable'=>'0',
'user_defined'=>'1',
//whether it should be including in the sales order grid
'grid'=>1
);
//first param should relate to a key of the protected $_flatEntityTables array
$salesResourceSetupModel->addAttribute('order', 'franchise_id', $data);
对于版本>1.4.1.0,您必须在sales_flat_order表中创建一列。你可以看看这篇文章是否为销售eav