Наличие нескольких представлений магазина с одним и тем же диапазоном идентификаторов приращения заказа
Можно ли настроить 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
диапазон номеров и/или совместное использование одного и того же диапазона номеров creditmemo increment_id
.
Поддерживает ли Magento это готовое решение?
6 answers
Я бы предположил, что это будет довольно сложно. Идентификаторы приращения хранятся в таблице eav_entity_store
, и неудивительно, что в каждом магазине есть своя запись, которая обновляется при создании заказа (и предложения, счета-фактуры и т. Д.). Чтобы заставить все магазины использовать один и тот же инкремент, вам нужно будет каким-то образом переписать эту логику, чтобы она использовала одну и ту же строку в БД. То, какое влияние это может оказать на другие области сайта, - это еще кое-что, что необходимо будет рассмотреть.
Вы можете переопределить модель увеличения заказов, отправок, счетов-фактур и кредитных нот, переписав класс "eav/entity_increment_numeric", предоставляющий пользовательскую логику в вашей модели.
Взгляните на классы предков (mage_eav_model_entity_increment_numeric и Mage_Eav_Model_Entity_Increment_Abstract), чтобы понять, как обеспечить свою собственную логику.
Вы можете различать логику между различными сущностями, проверив параметр $entitytypecode в Функцию getNextId() вы переопределите.
Другим (более агрессивным) способом является указание другой модели приращения для каждого типа сущности путем перезаписи (с помощью сценария установки) значения столбца "increment_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-теста имел тот же идентификатор increment_id, что и в исходном магазине.
Я попытался сопоставить эти 2 числа простым способом, когда checkout_submit_all_after
уволен, но мне было очень неудобно, поэтому я бросил его. Я думаю, что с большим количеством просмотров магазинов и большим трафиком это может привести к настоящему беспорядку, поэтому вам придется глубже копать в логике Magentos.
Решение:
Наличие разного заказа/счета/кредитной карты и т. Д.... Диапазон номеров довольно хорош для разных стран, что чаще всего означает на уровне группы магазинов.
Но иметь разные диапазоны номеров на уровне представления хранилища - это плохо, если вы используете представления хранилища для разных языков, что может быть сделано в 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>
...
Если у вас есть более приятный способ, без необходимости переписывать распространение знание. Повеселиться. Не взламывайте ядро.
Использовать на magento2...
ВЫБЕРИТЕ * ИЗ sales_sequence_meta
Все строки таблицы последовательностей используются в одной и той же таблице приращений, Пример "последовательность порядков_1"
пример:
ОБНОВИТЬ sales_sequence_meta
УСТАНОВИТЬ sequence_table
= 'последовательность_заказ_1'. где мета_ид =?? ()
Примечание: Очистите всю предыдущую строку, связанную с предложением и счетом, ИЛИ используйте таблицу с наибольшим значением последовательности в этой таблице (sequence_order_1, sequence_order_0, sequence_order_2)