Где объявить значение реестра magento
У меня есть пользовательский модуль, который использует наблюдатель sales_order_place_before. У меня там есть набор кода, который сканирует продукты и при необходимости добавляет товары в заказ. Однако я обнаружил, что это выполняется дважды, поэтому везде, где он добавляет товар в заказ, он делает это дважды.
Я не могу понять, почему он запускается дважды, поэтому я собирался использовать значение реестра Magento, равное false, а когда он запустится один раз, измените его на true и оберните оператор if вокруг моего кода, который проверяет это значение. В пользовательском модуле у меня есть только config.xml файл и Observer.php . Куда мне поместить
Mage::registry('check_sales_order_before', false);
Код? Я не думаю, что смогу поместить его в обозреватель, иначе он будет просто сбрасываться каждый раз и вызывать одну и ту же проблему. Я предполагаю, что добавлю еще один файл где-нибудь в своем модуле или помещу его где-нибудь в центральный файл.
Есть идеи?
Спасибо.
3 answers
Немного о реестре...
Mage::registry('check_sales_order_before', false);
Это операция чтения . Он проверит, установлен ли раздел реестра с check_sales_order_before
, если это так, он возвращает его в противном случае нулевым.
Для записи в реестр вам необходимо использовать register()
:
Mage::register('check_sales_order_before', false);
Пожалуйста, обратите внимание, что по умолчанию Magento выдаст исключение , если вы попытаетесь зарегистрировать переменную более одного раза в сеансе (например, если позже вы захотите изменить значение false на значение true). В вашем случае лучше всего используйте "изящный" аргумент, чтобы убедиться, что это делается бесшумно:
Mage::register('check_sales_order_before', false, true);
// do stuff...
if (...) {
Mage::register('check_sales_order_before', true, true);
}
Затем, наконец, как только ваш заказ будет завершен:
Mage::unregister('check_sales_order_before');
Ваша реализация
Куда мне поместить... код?
Ну, на самом деле вам не нужно инициализировать это значение. Просто проверьте, установлен ли он, прежде чем что-либо делать, а затем установите его в значение true, как только вы что-то сделали:
if (Mage::registry('have_added_products_already')) {
// do nothing, it's already been done...
return;
}
// do stuff, it hasn't been done yet...
Mage::register('have_added_products_already', true, true);
Слишком долго смотрел на этот код, но только что понял, что самый очевидный способ сделать это - поместить его в метод конструктора в верхней части файла наблюдателя:
public function __construct()
{
Mage::registry('check_sales_order_before', false);
if (Mage::registry('check_sales_order_before')) {
Mage::log("\n - registry value is false ", null, 'custom_log.log');
} else {
Mage::log("\n - registry value is true ", null, 'custom_log.log');
}
}
После этого я установил файл реестра в значение true в конце инструкции if, которая была обернута вокруг кода, который я хотел запустить только один раз. Сработало великолепно!
Подумал, что я бы поместил это здесь, на случай, если у кого-то еще возникнет аналогичная проблема.
Добавление В Реестр:
Способ добавления в реестр заключается в следующем. Для этого требуется два параметра. Первый - это уникальный ключ, который вы хотели бы предоставить своей записи в реестре. Второе - это данные, которые вы хотите сохранить.
Mage::register('name-of-registry-key', $your-data);
Получение Данных Из Реестра:
Когда вы будете готовы извлечь сохраненные данные, используйте следующий метод:
$var = Mage::registry('name-of-registry-key');
Удаление Из Реестра
Когда и если вы будете готовы удалить данные из реестр, есть способ отменить его регистрацию. Это может быть важно для вас, особенно если вы используете реестр в цикле и хотите задать одно и то же имя раздела реестра несколько раз. Метод Mage::register() не позволит вам установить ключ, если он уже установлен.
Mage::unregister('name-of-registry-key');