可以以某种方式配置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_idincrement_prefix0.

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, shipmentcreditmemo.

但是请注意,我找不到任何正式文件 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> 
    ...

如果您有更好的方法,而无需重写传播知识。玩得开心。不要破解核心。

许可以下: CC-BY-SA归因
scroll top