JS-скрипты
Для работы модуля часто нужен отдельный JavaScript-сценарий. Есть два пути их подключения:
Автоматическое подключение
Файл modules/модуль/js/модуль.js подключается автоматически к странице с прикрепленным модулем. Файл modules/модуль/js/модуль.шаблон.js подключается автоматически к шаблону модуля.
Пример:
К шаблону modules/shop/views/shop.view.buy_form.php автоматически подгрузиться файл modules/shop/js/shop.buy_form.js.
Файл modules/shop/js/shop.js подгрузиться на всех страницах модуля (если модуль подключен к странице сайта), но не подгрузиться к шаблонным тегам модуля.
Файлы не дублируются. Например, файл modules/shop/js/shop.buy_form.js подключится один раз, даже если кнопка «Купить» будет выведена несколько раз.
Ручное подключение.
Можно указать непосредственно скрипт, который нужно подключить. Сделать это можно в любом месте: в шаблоне или в моделе модуля.
Пример:
// внутренняя ссылка
$this->diafan->_site->js_view[] = 'modules/search/js/search.show_search.js';
// внешняя ссылка
$this->diafan->_site->js_view[] = 'http://www.google.com/recaptcha/api/js/recaptcha_ajax.js';
Все JS-файлы модулей собираются пока генерируются страница и выводятся шаблонным тегом show_js. Все локальные файлы сжимаются, некоторые файлы подгружаются асинхронно. Важно, чтобы шаблонный тег <insert name="show_js">
, подключающий JS-файлы, был в конце HTML-документа. Перед закрывающим тегом </body>
.
Стандартная обработка Ajax-запросов
В DIAFAN.CMS предусмотрена отправка данных формы Ajax-запросом, если у формы есть атрибут
class="ajax"
. Ответ принимаются данные в формате JSON, которые всегда одинаково обрабатывается. Стандартно обработаются следующие данные (задается в modules/модуль/модуль.action.php).
Пример:
// произойдет редирект на главную
$this->result["redirect"] = '/';
// сообщения подставляются в специальные поля
// общее сообщение добавиться в контейнер <div class="error"></div> обычно под кнопкой <input type="submit">
$this->result["errors"][0] = 'Общее сообщение для всей формы';
// сообщение для конретного поля добавиться в контейнер <div class="error_name"></div>
$this->result["errors"]["name"] = 'Введите имя';
$this->result["data"] = array(
// "данные" подставятся в блок <div class="target"></div>
".taget" => "данные",
// "data" подставятся в блок <div id="target2"></div>
"#target2" => "data",
// "текст вместо формы" заменит форму
"form" => "текст вместо формы",
// блок <div class="target3"></div> будет скрыт
".target3" => false,
);
// обновиться капча
$this->result["captcha"] = 'код капчи';
// очистит форму
$this->result["result"] = "success";
// добавит данные в конец блока `<div class="значение_атрибута_id_формы"></div>`
$this->result["add"] = "данные";
// подгрузить загруженные файлы
$this->result["attachments"] = "блок загруженных файлов";
// подгрузить загруженные изображения
$this->result["images"] = "блок загруженных изображений";
// обновит идентификационный хэш пользователя
$this->result["hash"] = "новый хэш";
В JS-файле модуля можно дописать свою обработку для действия перед отправкой формы и при получении результатов. Эти действия дополнят стандартную обработку, если функция вернула true
, или заменят её, если функция вернула false
. Формат:
diafan_ajax.before['метка_формы'] = function(form){}
diafan_ajax.success['метка_формы'] = function(form, response){}
Метка формы состоит из названия модуля и действия формы. То есть из содержимого полей формы:
<input name="module">
<input name="action">
Пример:
// перед отправкой формы поиска объявления функция смотрит есть ли на странице контейнер <div class="ab_list"></div>
// если есть, то данные отправляются Ajax-запросом
diafan_ajax.before['ab_search'] = function(form){
if(! $(".ab_list").length)
{
$(form).removeClass('ajax').submit();
return false;
}
$(form).attr('method', 'POST');
}
// когда ответ пришел, то данные помещаются в контейнер <div class="ab_list"></div>
// и отменяется стандартная обработка
diafan_ajax.success['ab_search'] = function(form, response){
var k = 0;
$(".ab_list").text('');
$(".ab_list").first().html(response.data).focus();
return false;
}
База знаний
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.