複数のストアビューに同じ順序のincrement_id番号範囲を共有させる


13

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

たとえば、次のようなマルチストア設定の場合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は、すぐにこの機能をサポートしていますか?


@ alessandro-ronchiの指導を受けて、このようなソリューションを実装しました。gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530eは私に最適です。
マイケル

回答:


5

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


リチャードに同意します。
シルヴァンレイエ

おそらく正しいでしょうが、このコードを実行すると、すべての請求書が同じ番号シーケンスになりましたMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
ジェイゴーシュ

3

モデルのカスタムロジックを提供する「eav / entity_increment_numeric」クラスを書き換えることにより、注文、配送、請求書、クレジットメモの増分モデルをオーバーライドできます。

独自のロジックを提供する方法を理解するために、祖先クラス(Mage_Eav_Model_Entity_Increment_NumericおよびMage_Eav_Model_Entity_Increment_Abstract)を見てください。

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

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

注意:最新のMagentoバージョンではインクリメントIDには一意性の制約があるため、同じタイプの2つの異なるエンティティに同じインクリメントIDを保存することはできません。つまり、同じ増分IDを持つ2つの異なる請求書を作成することはできません。

それが役に立てば幸い。


このに見えたが、私は見つけることができないよgetLastId()Mage_Eav_Model_Entity_Increment_Numericまたは他のクラスで、または階層のインタフェース。ところで、これは受け入れられた答えであるべきです。
マイケル

UPDATE:ちょうどそれが上のプロパティセットで実現Varien_ObjectからMage_Eav_Model_Entity_Type
マイケル・


2

より深く掘り下げながら、私はそれeav_entity_type.increment_per_storeが役立つかもしれないことに気づきました。

そうです。ただし、Magentoインストールのすべてのストアビュー(グローバルに定義されているWebサイトに関係なく)が同じ注文increment_id番号範囲を共有するようにしたい場合のみです。

これは私の特定の問題を解決するものではありませんが、他の人にとっては役立つかもしれないので、ここに行きます:

注文番号のグローバル共有を有効にするにeav_entity_type.increment_per_storeは、注文エンティティをに設定し0

これは、実際にどのストアビューに属しているかに関係なく、オーダーエンティティのレコードを読み込むときにMage_Eav_Model_Entity_Type::fetchNewIncrementId()使用store_id = 0することにつながりeav_entity_storeます。

そのようなレコードが存在しない場合は、Magentoのは、使用して、1を作成store_idしてincrement_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ように、モデルをorderinvoiceshipmentcreditmemo

ただし、公式のドキュメントはincrement_per_storeまだ見つかりませんでした。また、Magentoバックエンドにはこれを設定できるオプションがありません。

これは、公式に使用されるとは考えられないことを意味する場合も、しない場合もあります。

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


1

そのままではサポートされていません。また、A / Bテストの2番目のストアビューで元のストアと同じincrement_idを共有するために、これを1回実行したかったのです。

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


0

解決:

注文/請求書/クレジットメモなどの番号が異なることは、さまざまな国にとって非常にいいことです。これは、多くの場合、店舗グループレベルでの意味です。

ただし、異なる言語のストアビューを使用する場合、ストアビューレベルで異なる番号範囲を使用することは悪いことです。これは、すべてのケースの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> 
    ...

より良い方法があれば、書き直さなくても知識を広めることができます。楽しんで。コアをハッキングしないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.