Делаем колбеки miniShop2 для всех

Всем привет! Так как в miniShop2 есть список колбеков для того, чтобы на определённые действия, совершаемые компонентом, можно было повесить свой код и, тем самым, дополнить работу магазина, то многие разработчики дополнений используют их в своём коде. Я уж не говорю о вебмастерах, которые используют этот инструмент для решения определённых нужд в своих сайтах.

В чём проблема?

В связи с этим получается проблема. Колбеков мало, а желающих воспользоваться ими — много. Я уже не раз сталкивался с тем, что некоторые компоненты из Modstore не могут работать вместе, т.к. используют одни и те же колбеки, на одних и тех же страницах.
Проблема в том, что код одного компонента, использующего, например miniShop2.Callbacks.Order.getcost, пересекается с другим кодом, другого компонента, использующего этот же колбек. Получается конфликт, который я для себя, в своих пакетах, решаю так:

Вариант решения:

  1. Пишу функцию, которая занимается клонированием объектов:
    ComponentName.Utils = {
        cloneObj: function(obj) {
            if (obj == null || typeof(obj) != "object") {
                return obj;
            }
            var tmp = new obj.constructor();
            for (var key in obj) {
                tmp[key] = ComponentName.Utils.cloneObj(obj[key]);
            }
            return tmp;
        },
    };
    Конечно, можно воспользоваться и встроенной в jQuery функцией $.extend, как описано тут.

  2. Перед переопределением стандартных miniShop2 колбеков, я клонирую всё то, что уже есть в объекте miniShop2.Callbacks:
    ComponentName.ms2CallbacksClone = ComponentName.Utils.cloneObj(miniShop2.Callbacks);

  3. После чего, я создаю свой объект с колбеками, которые собираюсь переопределить:
    ComponentName.ms2Callbacks = {
        Order: {
            getcost: { response: {
                success: function (response) {
                    ComponentName.ms2CallbacksClone.Order.getcost.response.success(response);
                },
            }},
        },
    };
    В нём я первым делом запускаю клонированный колбек.

  4. Ну и переопределяю в объекте miniShop2.Callbacks нужные мне колбеки — своими:
    miniShop2.Callbacks.Order.getcost.response.success = ComponentName.ms2Callbacks.Order.getcost.response.success;

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

Итак.

Хочу попросить разработчиков взять это на заметку, чтобы всем жилось хорошо. :)
Павел Гвоздь
22 мая 2016, 00:53
modx.pro
13
6 326
+3
Поблагодарить автора Отправить деньги

Комментарии: 3

Василий Наумкин
22 мая 2016, 07:53
1
+3
В miniShop2.4-beta2 callbacks являются массивами функций, для работы с которыми предусмотрены специальные методы.

Добавление:
miniShop2.Callbacks.add('Cart.add.before', 'my_callback', function() {
	alert('Отправка отключена!');
	return false;
});

И удаление:
miniShop2.Callbacks.remove('Cart.add.before', 'my_callback');
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
3