diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7371783 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +build-zip \ No newline at end of file diff --git a/README.md b/README.md index 313abdd..9bea1c5 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,49 @@ ``` +**События JS:** + +События могут быть полезны, если вы пользуетесь Яндекс.Метрикой или Google Analytics. Можно отследить следующие события: + +`simplecallback:beforeShow` — событие до открытия модального окна + +`simplecallback:afterShow` — событие после открытия модального окна + +`simplecallback:success` — событие после успешной отправки данных и получения ответа с сервера с валидными данными + +`simplecallback:error` — событие в случае сетевой ошибки, либо parseError + +`simplecallback:error` — событие в случае сетевой ошибки, либо parseError + +Примеры использования событий: + +``` +$(document).on('simplecallback:beforeShow', function(event, data) { + console.log(data); + alert('Simplecallback beforeShow event triggered \nmoduleId: ' + data.moduleId + ' \ncustomData: ' + data.customData); +}); + +$(document).on('simplecallback:afterShow', function(event, data) { + console.log(data); + alert('Simplecallback afterShow event triggered \nmoduleId: ' + data.moduleId + ' \ncustomData: ' + data.customData); +}); + +$(document).on('simplecallback:success', function(event, data) { + console.log(data); + alert('Simplecallback success event triggered \nform: ' + data.form + ' \nmoduleId: ' + data.moduleId + ' \ncustomData: ' + data.customData + ' \ndata: ' + data.data); +}); + +$(document).on('simplecallback:error', function(event, data) { + console.log(data); + alert('Simplecallback error event triggered \nform: ' + data.form + ' \nmoduleId: ' + data.moduleId + ' \ncustomData: ' + data.customData + ' \ndata: ' + data.data + ' \njqXHR: ' + data.jqXHR + ' \ntextStatus: ' + data.textStatus + '\n errorThrown: ' + data.errorThrown); +}); + +$(document).on('simplecallback:complete', function(event, data) { + console.log(data); + alert('Simplecallback complete event triggered \nform: ' + data.form + ' \nmoduleId: ' + data.moduleId + ' \ncustomData: ' + data.customData + ' \ndata: ' + data.data + ' \njqXHR: ' + data.jqXHR + ' \ntextStatus: ' + data.textStatus); +}); +``` + **Дизайн, шаблоны и пр:** Модуль создан без особого прицела на визуальный дизайн, т.к. дизайн каждого сайта индивидуален, поэтому вам предоставляется полная свобода для оформления и верстки. diff --git a/media/mod_simplecallback/js/simplecallback.js b/media/mod_simplecallback/js/simplecallback.js index cfc6cf2..e68a117 100644 --- a/media/mod_simplecallback/js/simplecallback.js +++ b/media/mod_simplecallback/js/simplecallback.js @@ -601,11 +601,15 @@ var simplecallback = { show: function(id, customData) { + $(document).trigger("simplecallback:beforeShow", { + moduleId: id, + customData: customData + }); + if (id && $('#simplecallback-' + id).length) { $('.simplecallback-overlay').addClass('active'); } var modalWindow = (id) ? $('#simplecallback-' + id) : $('[data-simplecallback-form-overlayed]').first(); - var modalWindowHeight = modalWindow.innerHeight(); var customDataField = modalWindow.find('input[name="simplecallback_custom_data"]'); if (customData) { @@ -615,10 +619,76 @@ } modalWindow.addClass('active'); + + $(document).trigger("simplecallback:afterShow", { + moduleId: id, + customData: customData + }); }, hide: function() { $('[id^="simplecallback-"]').removeClass('active'); $('.simplecallback-overlay').removeClass('active'); + }, + submit: function (id) { + var form = $('#simplecallback-' + id), + actionUrl = form.attr('action'), + errorMsg = form.attr('data-simplecallback-form-error-msg'), + captcha = form.find('.simplecallback-captcha'), + submitBtn = form.find('[type="submit"]'); + + form.addClass('simplecallback-loading'); + submitBtn.attr('disabled', true); + + $.ajax({ + type: "POST", + url: actionUrl, + data: form.serialize(), + dataType: 'json', + success: function(data, textStatus, jqXHR) { + if(data.error === false) { + $(document).trigger("simplecallback:success", { + form: form, + moduleId: parseInt(form.find('input[name="module_id"]').val()), + customData: form.find('input[name="simplecallback_custom_data"]').val(), + data: data + }); + + alert(data.message); + form[0].reset(); + simplecallback.hide(); + } else { + alert(data.message); + } + + form.removeClass('simplecallback-loading'); + submitBtn.attr('disabled', false); + }, + error: function (jqXHR, textStatus, errorThrown) { + $(document).trigger("simplecallback:error", { + form: form, + moduleId: parseInt(form.find('input[name="module_id"]').val()), + customData: form.find('input[name="simplecallback_custom_data"]').val(), + jqXHR: jqXHR, + textStatus: textStatus, + errorThrown: errorThrown + }); + + alert(errorMsg); + form.removeClass('simplecallback-loading'); + submitBtn.attr('disabled', false); + }, + complete: function (jqXHR, textStatus) { + captcha.attr('src', captcha.attr('src') + '&rand=' + Math.random()); + + $(document).trigger("simplecallback:complete", { + form: form, + moduleId: parseInt(form.find('input[name="module_id"]').val()), + customData: form.find('input[name="simplecallback_custom_data"]').val(), + jqXHR: jqXHR, + textStatus: textStatus + }); + } + }); } }; @@ -635,36 +705,9 @@ }); $('[data-simplecallback-form]').on('submit', function() { - var form = $(this), - actionUrl = form.attr('action'), - captcha = form.find('.simplecallback-captcha'), - submitBtn = form.find('[type="submit"]'); - - form.addClass('simplecallback-loading'); - submitBtn.attr('disabled', true); - - $.ajax({ - type: "POST", - url: actionUrl, - data: form.serialize(), - dataType: 'json', - success: function(data) { - if(data.error === false) { - alert(data.message); - form[0].reset(); - simplecallback.hide(); - } else { - alert(data.message); - //console.log(data.message); - } + var formId = parseInt($(this).find('input[name="module_id"]').val()); - form.removeClass('simplecallback-loading'); - submitBtn.attr('disabled', false); - }, - complete: function () { - captcha.attr('src', captcha.attr('src') + '&rand=' + Math.random()); - } - }); + simplecallback.submit(formId); return false; }); @@ -679,8 +722,6 @@ overlay.append( $(this) ); }); - console.log(overlay); - $(document).on('click', '[data-simplecallback-open]', function() { var formId = $(this).data('simplecallback-open'); var customData = $(this).data('simplecallback-custom-data'); @@ -699,18 +740,17 @@ window.addEventListener("load", function (event) { if (window.location.hash.indexOf('#simplecallback-') > -1) { var moduleId = parseInt( window.location.hash.replace(/[^0-9\.]/g, ''), 10 ); - //console.log(moduleId); simplecallback.show(moduleId); } }, false); $(document).on('click', 'a[href^="#simplecallback-"]', function() { var moduleId = parseInt( $(this).attr('href').replace(/[^0-9\.]/g, ''), 10 ); - //console.log(moduleId); - simplecallback.show(moduleId); + var customData = $(this).data('simplecallback-custom-data'); + + simplecallback.show(moduleId, customData); return false; }); - }); })(jQuery); \ No newline at end of file diff --git a/modules/mod_simplecallback/tmpl/default.php b/modules/mod_simplecallback/tmpl/default.php index 97ada81..287e8a1 100644 --- a/modules/mod_simplecallback/tmpl/default.php +++ b/modules/mod_simplecallback/tmpl/default.php @@ -15,6 +15,7 @@ $header_tag = $params->get('header_tag', 'h3'); $header_class = $params->get('header_class', ''); $show_title = $module->showtitle; +$error_msg = $params->get('simplacallback_ajax_error_msg', 'Network error...'); ?>