Наличие нескольких видов магазина совместно использует диапазон номеров recrement_id increment_id

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

Вопрос

Можно ли настроить 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Последний идентификатор приращения в настоящее время составляет 1000123, как достичь:

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

Тот же вопрос задается для нескольких видов магазина, разделяющих один и тот же счет -фактура increment_id диапазон номеров и/или совместное использование одного и того же кредита increment_id Номер диапазон.

Поддерживает ли Magento это вне коробки?

Это было полезно?

Решение

Я полагаю, что это будет довольно сложно. Идентификаторы приращения хранятся в eav_entity_store Таблица и неудивительно, что каждый магазин имеет свою собственную запись, которая обновляется, когда создается заказ (и цитата, счет -фактура и т. Д.). Чтобы все магазины использовали тот же прирастающий, вам нужно каким -то образом переписать эту логику, чтобы он использовал ту же строку в БД. Какое влияние это может оказать на другие области сайта, это то, что нужно будет рассмотреть.

Другие советы

Вы можете переопределить заказы, переворот, счеты и модель приращения кредит, переписывая класс «eav/entity_increment_numeric», предоставляя пользовательскую логику в вашей модели.

Взгляните на классы предков (mage_eav_model_entity_increment_numeric и mage_eav_model_entity_increment_abstract), чтобы понять, как обеспечить свою собственную логику.

Вы можете дифференцировать логику между различными объектами, проверяя параметр $ entitytypecode функции getNextId (), которую вы переопределяете.

Другим (более инвазивным) способом является указание различной модели приращения для каждого типа объекта путем перезаписи (через сценарий установки) значение столбца «INCRENT_MODEL» таблицы «eav_entity_type». Лично я предпочитаю решение «переписать», упомянутое выше.

Обратите внимание: идентификаторы приращения имеют уникальное ограничение в последних версиях Magento, поэтому вы не можете сохранить один идентификатор приращения для двух разных объектов одного типа. Другими словами, у вас не может быть двух разных счетов с одинаковым идентификатором приращения.

Надеюсь, поможет.

Копая глубже, я понял, что 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, поделиться тем же увеличением_ид из исходного магазина.

Я попытался сопоставить эти 2 числа простым способом, когда checkout_submit_all_after уволен, но чувствовал себя очень неудобно с этим, поэтому я бросил его. Я предполагаю, что с большим количеством магазинов и большим трафиком это может привести к настоящему беспорядку, поэтому вам придется копать глубже в Magentos Logic.

Решение:

Наличие различного порядка/счета -фактуры/кредита и т. Д.

Но наличие разных диапазонов числа на уровне просмотра магазина - это плохо, если вы используете виды магазина для разных языков, что может быть сделано в 90% всех случаев.

К счастью, это не так сложно, как предложено в этой теме:

Мы собираемся сделать По умолчанию идентификатор представления магазина вместо использования идентификатора просмотра магазина метод вызывается с помощью. Анкет Мы делаем это, разрешив группу магазинов для текущего просмотра магазина и принесли идентификатор просмотра магазина по умолчанию. Затем каждый вид магазина определенной группы магазинов использует один и тот же формат диапазона номеров (тот из вида магазина по умолчанию).

Создайте этот класс:

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