複数のストアビューを持つのと同じ注文increment_id番号範囲が共有されます

magento.stackexchange https://magento.stackexchange.com/questions/344

質問

同じWebサイトの複数のストアビューができるという方法でMagentoを構成できますか 同じことを共有します 注文 increment_id 数値範囲?もしそうなら、どうですか?

たとえば、このようなマルチストアセットアップで 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 数字の範囲、および/または同じcredimemoを共有する increment_id 数値範囲。

Magentoはこのすぐに使えるボックスをサポートしていますか?

役に立ちましたか?

解決

これは非常に難しいと思います。増分IDはに保存されます eav_entity_store テーブルと当然のことながら、各ストアには独自のエントリがあり、注文(および見積もり、請求書など)が作成されたときに更新されます。すべての店舗で同じ増分を使用するようにするには、このロジックを何らかの形で書き換えて、DBで同じ行を使用する必要があります。これがサイトの他の領域に与える影響は、考慮する必要があるものです。

他のヒント

「EAV/ENTITY_INCREMENT_NUMERIC」クラスを書き換えることにより、注文、Shipping、請求書、クレジットメモ増分モデルをオーバーライドできます。

独自のロジックを提供する方法を理解するために、祖先クラス(mage_eav_model_entity_increment_numeric and mage_eav_model_entity_increment_abstract)をご覧ください。

オーバーライドするgetNextID()関数の$ entityTypeCodeパラメーターをチェックすることにより、異なるエンティティ間でロジックを区別できます。

別の(より侵襲的な)方法は、[EAV_ENTITY_TYPE]テーブルの「increment_model」列の値を(インストールスクリプトを介して)上書きすることにより、各エンティティタイプの異なる増分モデルを指定することです。個人的には、上記の「書き直し」ソリューションを好みます。

注意を払ってください:増分IDは、最新のMagentoバージョンに一意性の制約があるため、同じタイプの2つの異なるエンティティに同じ増分IDを保存できません。言い換えれば、同じ増分IDを持つ2つの異なる請求書を持つことはできません。

それが役に立てば幸い。

深く掘り下げている間、私はそれを認識しました 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 BackEndにはオプションがないことがあり、これを構成できます。

これは、公式に使用されるとは考えられていないことを意味するかもしれません。

自己責任。あなたの変更が大混乱をもたらすなら、私を責めないでください。あなたは警告されています^^

すぐにサポートされていません。また、A/Bテストの2番目のStoreViewを元のストアから同じ増分_IDを共有するために、これを一度やりたかったのです。

私はこれらの2つの数字を簡単な方法で一致させようとしました checkout_submit_all_after 解雇されますが、それに対して非常に不快に感じたので、私はそれを落としました。より多くのストアビューと多くのトラフィックがあれば、これが本当の混乱につながる可能性があるため、Magentos Logicをより深く掘り下げる必要があると思います。

解決:

異なる注文/請求書/CreditMemoなどがあります...数の範囲は非常に優れています。これは、ほとんどの場合、ストアグループレベルで意味があります。

ただし、ストアビューレベルで異なる数の範囲を持つことは、さまざまな言語でストアビューを使用する場合、すべてのケースの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帰属
所属していません magento.stackexchange
scroll top