Где объявить значение реестра magento


У меня есть пользовательский модуль, который использует наблюдатель sales_order_place_before. У меня там есть набор кода, который сканирует продукты и при необходимости добавляет товары в заказ. Однако я обнаружил, что это выполняется дважды, поэтому везде, где он добавляет товар в заказ, он делает это дважды.

Я не могу понять, почему он запускается дважды, поэтому я собирался использовать значение реестра Magento, равное false, а когда он запустится один раз, измените его на true и оберните оператор if вокруг моего кода, который проверяет это значение. В пользовательском модуле у меня есть только config.xml файл и Observer.php . Куда мне поместить

Mage::registry('check_sales_order_before', false);

Код? Я не думаю, что смогу поместить его в обозреватель, иначе он будет просто сбрасываться каждый раз и вызывать одну и ту же проблему. Я предполагаю, что добавлю еще один файл где-нибудь в своем модуле или помещу его где-нибудь в центральный файл.

Есть идеи?

Спасибо.

Author: Shaun, 2016-09-07

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);
 6
Author: Robbie Averill, 2016-09-08 00:34:50

Слишком долго смотрел на этот код, но только что понял, что самый очевидный способ сделать это - поместить его в метод конструктора в верхней части файла наблюдателя:

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, которая была обернута вокруг кода, который я хотел запустить только один раз. Сработало великолепно!

Подумал, что я бы поместил это здесь, на случай, если у кого-то еще возникнет аналогичная проблема.

 3
Author: Shaun, 2016-09-08 00:04:03

Добавление В Реестр:

Способ добавления в реестр заключается в следующем. Для этого требуется два параметра. Первый - это уникальный ключ, который вы хотели бы предоставить своей записи в реестре. Второе - это данные, которые вы хотите сохранить.

Mage::register('name-of-registry-key', $your-data);

Получение Данных Из Реестра:

Когда вы будете готовы извлечь сохраненные данные, используйте следующий метод:

$var = Mage::registry('name-of-registry-key');

Удаление Из Реестра

Когда и если вы будете готовы удалить данные из реестр, есть способ отменить его регистрацию. Это может быть важно для вас, особенно если вы используете реестр в цикле и хотите задать одно и то же имя раздела реестра несколько раз. Метод Mage::register() не позволит вам установить ключ, если он уже установлен.

Mage::unregister('name-of-registry-key');
 3
Author: Rahul Singh, 2016-09-08 04:24:29