拥有多个商店视图共享相同的订单递增_id编号范围
-
16-10-2019 - |
题
可以以某种方式配置Magento,同一网站的多个商店视图可以 共享同样的 命令 increment_id
数字范围?如果是这样,怎么样?
例如,使用类似的Multistore设置 core_store
:
store_id code website_id group_id
0 admin 0 0
1 alpha 1 1
2 bravo 2 2
3 charlie 2 2
现在是新的商店视图 delta
被添加:
store_id code website_id group_id
4 delta 1 1
假设 alpha
当前的最后订单增量ID是1000123,如何实现:
next sell order number
alpha 1000124
delta 1000125
delta 1000126
alpha 1000127
对于多个商店的视图共享相同的发票,同样的问题也是如此 increment_id
数字范围和/或共享相同的信用 increment_id
数字范围。
Magento是否支持此开箱即用?
解决方案
我想这将非常困难。增量ID存储在 eav_entity_store
表格和毫不奇怪的是,每个商店都有自己的条目,当创建订单(和报价,发票等)时会更新。要使所有商店使用相同的增量器,您需要以某种方式重写此逻辑,以便它在DB中使用了相同的行。这可能对网站其他领域产生的影响是需要考虑的其他方面。
其他提示
您可以通过重写“ EAV/ENTITY_INCREMENT_NUMERIC”类,覆盖订单,发票,发票和信贷备忘录增量模型,从而在您的模型中提供自定义逻辑。
看看祖先类(mage_eav_model_entity_increment_numeric和mage_eav_model_entity_increment_abstract),以了解如何提供自己的逻辑。
您可以通过检查getNextID()函数的$ entityTypecode参数来区分不同实体之间的逻辑。
另一种(更具侵入性的)方式是通过覆盖“ eav_entity_type”表的“ cremement_model”列的值来指定每个实体类型的不同增量模型。我个人更喜欢上面提到的“重写”解决方案。
请注意:增量ID在最新的Magento版本中具有唯一性约束,因此您不能为同一类型的两个不同实体存储相同的增量ID。换句话说,您不能有两个具有相同增量ID的不同发票。
希望能帮助到你。
在更深入地挖掘时,我意识到 eav_entity_type.increment_per_store
可能会有所帮助。
这是。但是只有在您想要的时候 所有商店的视图 (在全球范围内,无论您在哪个网站上定义)您的Magento安装以共享相同的订单 increment_id
数字范围。
这不能解决我的特定问题,但也许对其他问题有帮助,所以我们在这里:
要激活订单号的全局共享,请设置 eav_entity_type.increment_per_store
订单实体 0
,
这将导致 Mage_Eav_Model_Entity_Type::fetchNewIncrementId()
使用 store_id = 0
加载 eav_entity_store
订单实体的记录,无论其真正属于哪个商店视图。
如果没有这样的记录,Magento会创建一个 store_id
和 increment_prefix
的 0
.
public function fetchNewIncrementId($storeId = null)
{
if (!$this->getIncrementModel()) {
return false;
}
if (!$this->getIncrementPerStore() || ($storeId === null)) {
/**
* store_id null we can have for entity from removed store
*/
$storeId = 0;
}
// Start transaction to run SELECT ... FOR UPDATE
$this->_getResource()->beginTransaction();
$entityStoreConfig = Mage::getModel('eav/entity_store')
->loadByEntityStore($this->getId(), $storeId);
if (!$entityStoreConfig->getId()) {
$entityStoreConfig
->setEntityTypeId($this->getId())
->setStoreId($storeId)
->setIncrementPrefix($storeId)
->save();
}
$incrementInstance = Mage::getModel($this->getIncrementModel())
->setPrefix($entityStoreConfig->getIncrementPrefix())
->setPadLength($this->getIncrementPadLength())
->setPadChar($this->getIncrementPadChar())
->setLastId($entityStoreConfig->getIncrementLastId())
->setEntityTypeId($entityStoreConfig->getEntityTypeId())
->setStoreId($entityStoreConfig->getStoreId());
/**
* do read lock on eav/entity_store to solve potential timing issues
* (most probably already done by beginTransaction of entity save)
*/
$incrementId = $incrementInstance->getNextId();
$entityStoreConfig->setIncrementLastId($incrementId);
$entityStoreConfig->save();
// Commit increment_last_id changes
$this->_getResource()->commit();
return $incrementId;
}
这应该适用于任何实体类型 eav/entity_increment_numeric
模型,喜欢 order
, invoice
, shipment
和 creditmemo
.
但是请注意,我找不到任何正式文件 increment_per_store
然而。而且,Magento后端没有任何选项可以让您配置此。
这可能意味着也不意味着它不被认为是正式使用的。
自担风险。如果您的变化造成破坏,请不要怪我。您被警告^^
它不受欢迎。我还想这样做一次,以获得第二个商店视图,用于A/B测试共享原始商店中相同的增量_ID。
我试图以简单的方式匹配这两个数字 checkout_submit_all_after
被解雇了,但对此感到非常不舒服,所以我丢下了它。我猜想有更多的商店视图和很多流量,这可能会导致真正的混乱,因此您必须在Magentos Logic中进行更深入的研究。
解决方案:
对于不同的国家/地区来说,拥有不同的订单/发票/信用额度等...数字范围非常好,这通常意味着在商店集团级别上。
但是,如果您使用不同语言的商店视图,则在商店视图级别上具有不同的数字范围是一件坏事,这可能在90%的情况下完成。
幸运的是,在此线程中提出的不那么困难:
我们要做的是我们取得 默认存储视图ID而不是使用商店视图ID该方法与. 。我们正在通过解决当前商店视图的商店组并获取其默认商店视图ID来做到这一点。然后,特定商店组的每个商店视图都使用相同的数字范围格式(默认存储视图的格式)。
创建此类:
class Funky_Module_Model_Entity_Type extends Mage_Eav_Model_Entity_Type
{
/**
* Retreive new incrementId
*
* @param int $storeId
* @return string
* @throws Exception
*/
public function fetchNewIncrementId($storeId = null)
{
if (!$this->getIncrementModel()) {
return false;
}
if (!$this->getIncrementPerStore() || ($storeId === null)) {
/**
* store_id null we can have for entity from removed store
*/
$storeId = 0;
}
//FIX START:
$groupId = Mage::getModel('core/store')->load($storeId)->getGroupId();
$group = Mage::getModel('core/store_group')->load($groupId);
$storeId = $group->getDefaultStoreId();
//FIX END:
// Start transaction to run SELECT ... FOR UPDATE
$this->_getResource()->beginTransaction();
try {
$entityStoreConfig = Mage::getModel('eav/entity_store')
->loadByEntityStore($this->getId(), $storeId);
if (!$entityStoreConfig->getId()) {
$entityStoreConfig
->setEntityTypeId($this->getId())
->setStoreId($storeId)
->setIncrementPrefix($storeId)
->save();
}
$incrementInstance = Mage::getModel($this->getIncrementModel())
->setPrefix($entityStoreConfig->getIncrementPrefix())
->setPadLength($this->getIncrementPadLength())
->setPadChar($this->getIncrementPadChar())
->setLastId($entityStoreConfig->getIncrementLastId())
->setEntityTypeId($entityStoreConfig->getEntityTypeId())
->setStoreId($entityStoreConfig->getStoreId());
/**
* do read lock on eav/entity_store to solve potential timing issues
* (most probably already done by beginTransaction of entity save)
*/
$incrementId = $incrementInstance->getNextId();
$entityStoreConfig->setIncrementLastId($incrementId);
$entityStoreConfig->save();
// Commit increment_last_id changes
$this->_getResource()->commit();
} catch (Exception $e) {
$this->_getResource()->rollBack();
throw $e;
}
return $incrementId;
}
}
将此重写添加到模块的config.xml:
<global>
<models>
<eav>
<rewrite>
<entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
</rewrite>
</eav>
...
如果您有更好的方法,而无需重写传播知识。玩得开心。不要破解核心。