Показать сообщение отдельно
  #8 (permalink)  
Старый 18.05.2012, 02:11
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от cmd
melky, спасибо, конечно, но Вы наверно не очень внимательно читали тему. В первом посте, я тоже привел вполне рабочее решение. Не в работоспособности дело...
да, вы правы. иногда у меня такое бывает

Сообщение от cmd Посмотреть сообщение
Мне не нравится то, что мне приходится править исходный код в CMS:
А как вы ещё хотите что-то добавлять?
Сообщение от cmd Посмотреть сообщение
- обрамлять ли исходный ajax-запрос в функцию
- обрамлять ли исходный ajax-запрос в доп. $.ajax
- обрамлять ли исходный ajax-запрос в .done( ... )
я бы написал $.ajax в функции, которую бы потом передал в done в таком виде :
.done( window.mycallback || $.noop );

чтобы ошибка не вылетала, когда window.mycallback неопределен
Сообщение от cmd Посмотреть сообщение
Суть одна - внесение изменения в ядро системы. А это не фен-шуй.
не фен-шуйным было решение разработчиков оставить JS нерасширяемым. из-за этого вы сейчас голову ломаете.
Сообщение от cmd Посмотреть сообщение
Вот представьте, что я написал модуль для CMS. Если для установки нужно добавить в ядро одну строчку, то это уже "не очень хороший" модуль.
хм, обычно эти строчки добавляются не в ядро, а где-нибудь на более высоком уровне.
Сообщение от cmd Посмотреть сообщение
А если надо изменить работу целого куска код - это откровенно фиговый модуль т.к. он может вступать в конфликты с другими модулями.
вот вам и неповоротливость в чистом виде. "деревянный код" встречается повсюду - гибко писать очень трудно (иначе как обьяснить то, что из всех известных расширяемая только jQuery - я про js.. как cms могу привести пример DLE).

Сообщение от cmd Посмотреть сообщение
Т.е. я хочу защитить пользователей (разработчиков OpenCart, которые будут работать с моим модулем) от говнокода.
окей, вы хотите написать код гибко. давайте рассмотрим ситуацию поближе:

вы хотите расширить функционал, вставив перед действием ещё одно, своё. существующий код не предполагает таких возможностей.
остаётся только практика под названием "допиливание". вы изменяете существующий код таким образом, чтобы им можно было управлять, не залезая в него ни разу после редактирования. решение очевидно - оставить "лазейки" в виде хуков, надеюсь, вы знаете, что это такое.
для того, чтобы не лезть в чужой код, давайте из своего кода удалим обработчик события по-умолчанию, и на его место поставим свой, расширяемый. а расширения там уже можно добавить.
(само собой, суета в виде удаления обработчика порождает ненужную работу... но что ещё не сделаешь для деликатности). новый обработчик будет запускать старый... в любой момент.

Демо : jsbin.com/amosuj
// этот код уже был тут
$('#button-cart').bind('click', function() {

  $.ajax({
     ... // добавляем товар в корзину
  });

});
// а теперь - магия.

// объект хуков. на будущее
handlers = {
    start : $.noop,
    end: $.noop
};


// новый обработчик
function newHandler(e, next){ 
    // this будет установлен в элемент, на который установлен обработчик
    // e - объект события
    // next - старый обработчик(функция)

    handlers.start(); // хук начала выполнения новой функции

    // по завершении работ выполнить next и хук окончания выполнения функции
    handlers.end();
    next.call(this, e);
}

var el = $("#button-cart"); // целевой элемент
// старый обработчик. тут можно поимпровизировать, если обработчиков несколько.
var old = el.data("events.click").click[0].handler;

// снимаем все старые обработчики, и цепляем новый, "крутой"
el.unbind("click").bind("click", function(e){
  myNewHandler.call(this, e, old);
});

/*добавить ещё хуков по вкусу*/

Последний раз редактировалось melky, 18.05.2012 в 02:17.
Ответить с цитированием