Сообщение от 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);
});
/*добавить ещё хуков по вкусу*/