Делаем колбеки 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 may 2016, 03:53    Павел Гвоздь   
8    1046 +3

Comments (3)

  1. Василий Наумкин 22 may 2016, 07:53 # +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');
    1. Павел Гвоздь 22 may 2016, 19:09 # 0
      Прекрасно! А старый способ подключения колбеков останется?
      1. Василий Наумкин 22 may 2016, 19:45 # +1
        Конечно.
    You need to login to create comments.