Birden fazla mağaza görünümüne sahip olmak aynı sipariş artışı


13

Magento, aynı web sitesinin birden fazla mağaza görünümünün aynı sipariş increment_idnumarası aralığını paylaşabileceği şekilde yapılandırılabilir mi? Ve eğer öyleyse, nasıl?

Örneğin, aşağıdakine benzer bir çoklu mağaza kurulumuyla 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

Şimdi yeni bir mağaza görünümü deltaeklendi:

store_id        code    website_id    group_id
       4       delta             1           1

Varsayarsak alpha's son sipariş artım kimliği henüz nasıl elde etmek 1000123 şöyledir:

next sell    order number
    alpha         1000124
    delta         1000125
    delta         1000126
    alpha         1000127

Aynı soru, aynı fatura increment_idnumarası aralığını paylaşan ve / veya aynı kredi increment_idnumarası aralığını paylaşan birden çok mağaza görünümü için de geçerlidir .

Magento bu kullanıma hazır mı destekliyor?


@ Alessandro-ronchi'nin rehberliğinde bu çözümü uyguladım. gist.github.com/mblarsen/012dce6f55ad5d442f41e9157e74530e benim için harika çalışıyor.
Michael

Yanıtlar:


5

Bunun oldukça zor olacağını düşünürdüm. Artış kimlikleri eav_entity_storetabloda saklanır ve şaşırtıcı olmayan bir şekilde her mağazanın bir sipariş (ve fiyat teklifi, fatura vb.) Oluşturulduğunda güncellenen kendi girişi vardır. Tüm mağazaların aynı artırıcıyı kullanmasını sağlamak için bir şekilde bu mantığı yeniden yazmanız gerekir, böylece DB'de aynı satırı kullanır. Bunun sitenin diğer alanları üzerinde ne gibi bir etkisi olabileceği dikkate alınması gereken başka bir şeydir.


Richard'a katılıyorum.
Sylvain Rayé

Muhtemelen haklısınız, ancak bu kodu çalıştırmak tüm faturalarımın aynı numara sırasını izlemesini sağladıMage::getModel('eav/entity_type')->loadByCode('invoice')->setIncrementPerStore(false)->save()
Jay Ghosh

3

Bir Modelinizde özel mantık sağlayan "eav / entity_increment_numeric" sınıfını yeniden yazarak siparişleri, gönderileri, faturaları ve kredi notları artış modelini geçersiz kılabilirsiniz.

Kendi mantığınızı nasıl sağlayacağınızı anlamak için ata sınıflarına (Mage_Eav_Model_Entity_Increment_Numeric ve Mage_Eav_Model_Entity_Increment_Abstract) bir göz atın.

Geçersiz kılacağınız getNextId () işlevinin $ entityTypeCode parametresini kontrol ederek farklı varlıklar arasındaki mantığı ayırt edebilirsiniz.

Başka bir (daha invaziv) yol ise, "eav_entity_type" tablosunun "increment_model" sütununun değerinin üzerine yazarak (yükleme komut dosyası aracılığıyla) her varlık türü için farklı bir artış modeli belirtmektir. Şahsen yukarıda belirtilen "yeniden yazma" çözümünü tercih ederim.

Dikkat: artış kimlikleri en son Magento sürümlerinde benzersiz bir kısıtlamaya sahiptir, böylece aynı türdeki iki farklı varlık için aynı artış kimliğini depolayamazsınız. Başka bir deyişle, aynı artış kimliğine sahip iki farklı faturanız olamaz.

Umarım yardımcı olur.


Bu içine baktım ama bulamadı olduğum getLastId()içinde Mage_Eav_Model_Entity_Increment_Numericveya başka bir sınıfta ya da hiyerarşi içinde arayüz. Btw, bu kabul edilen cevap olmalı.
Michael

GÜNCELLEME: Sadece bir özellik seti olduğunu fark Varien_ObjectdanMage_Eav_Model_Entity_Type
Michael

Bu şekilde uyguladı
Michael

2

Daha derine inerken bunun yardımcı eav_entity_type.increment_per_storeolabileceğini fark ettim .

Bu. Ancak yalnızca Magento kurulumunuzun tüm mağaza görünümlerinin (global olarak, hangi web sitesinde tanımlanırsa tanımlansın) aynı sipariş increment_idnumarası aralığını paylaşmasını istediğinizde .

Bu benim özel sorunumu çözmüyor, ama belki bazılarına yardımcı oluyor, işte başlıyoruz:

Set sipariş numaralarının küresel paylaşımını etkinleştirmek için eav_entity_type.increment_per_storeamacıyla varlığın 0,

Bu potansiyel müşteriler Mage_Eav_Model_Entity_Type::fetchNewIncrementId()kullanarak store_id = 0yüklerken eav_entity_storesipariş varlığın rekoru, mağaza görünümü gerçekten aittir olursa olsun.

Böyle bir kayıt yoksa, Magento store_idve increment_prefixile kayıt oluşturur 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;
}

Bu kullanarak herhangi bir varlık türü için çalışmalıdır eav/entity_increment_numericmodeli gibi order, invoice, shipmentve creditmemo.

Yine de, increment_per_storehenüz resmi bir belge bulamadığımı unutmayın . Ve Magento arka ucunda bunu yapılandırmanıza izin veren bir seçenek olmadığını.

Bu, resmi olarak kullanıldığı düşünülmeyebilir veya edilmeyebilir.

Kendi sorumluluğunuzdadır kullanın. Yaptığınız değişiklikler tahrip ederse, beni suçlama. Uyarıldınız ^^


1

Kutudan çıkar çıkmaz desteklenmez. Ayrıca, bir kez daha orijinal mağazadan aynı increment_id paylaşım A / B Testi için ikinci bir storeview sahip olmak istedim.

checkout_submit_all_afterİşten atıldığında bu 2 sayıyı basit bir şekilde eşleştirmeye çalıştım , ancak ondan çok rahatsız oldum, bu yüzden düşürdüm. Sanırım daha fazla mağaza görüntüsü ve çok fazla trafik ile bu gerçek bir karmaşaya neden olabilir, bu yüzden Magentos mantığında daha derine inmeniz gerekiyor.


0

Çözüm:

Farklı bir sipariş / fatura / creditmemo vb ... numara aralığına sahip olmak, farklı mağazalar için oldukça güzel, çoğu zaman bir mağaza grubu düzeyinde anlamına gelir.

Ancak, farklı diller için mağaza görünümleri kullanıyorsanız, mağaza görünüm düzeyinde farklı sayı aralıklarına sahip olmak kötü bir şeydir, bu da tüm vakaların% 90'ında yapılabilir.

Neyse ki bu konuda önerildiği kadar zor değil:

Yapacağımız şey , yöntemin çağrıldığı mağaza görünümü kimliğini kullanmak yerine varsayılan mağaza görünümü kimliğini almaktır . Bunu, geçerli mağaza görünümü için mağaza grubunu çözerek ve varsayılan mağaza görünümü kimliğini getirerek yapıyoruz. Ardından, belirli bir mağaza grubunun her mağaza görünümü aynı sayı aralığı biçimini kullanır (varsayılan mağaza görünümünden).

Bu sınıfı oluşturun:

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;
    }

}

Bu yeniden yazma işlemini modülünüzün config.xml dosyasına ekleyin:

<global>
   <models>
            <eav>
                <rewrite>
                     <entity_type>Gigaset_Core_Model_Entity_Type</entity_type>
                </rewrite>
            </eav> 
    ...

Daha güzel bir yolunuz varsa, yeniden yazmak zorunda kalmadan bilgiyi yayın. İyi eğlenceler. Çekirdek kesmek yok.


0

Magento2'de kullanın ... SELECT * FROM sales_sequence_meta

Tüm sıra_tablosu satırı aynı artış tablosunda kullanılır Örnek 'sıra_düzeni_1' örneği: UPDATE sales_sequence_metaSET sequence_table= 'sıra_düzeni_1'. burada meta_id = ?? ()

Not: Önceki Teklif ve fatura ile ilgili tüm satırları boşaltın VEYA Bu tablolardaki en yüksek sıra_değeri tablosunda kullanın (sıra_düzeni_1, sıra_düzeni_0, sıra_düzeni_2)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.