Форум русской поддержки Joomla!® CMS
06.12.2016, 14:20:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

AJAX Publish/Unpublish элемента в списке

 (Прочитано 226 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zaboich
Осваиваюсь на форуме
***

Репутация: +11/-0
Offline Offline

Сообщений: 38


« : 19.10.2015, 15:55:35 »

Изменить статус элемента в режиме списка - одна из простейших функций встроенных в фреймворк CMS
Добавляется эта возможность в код примерно так:

Код:
echo JHtml::_('jgrid.published', ...)
Но по какой-то причине, до сих пор, метод JHtmlGrid::published() вешает на элемент обработчик onclick, который делает синхронный запрос на сервер. Т.е. для такой небольшой операции происходит перезагрузка страницы.

Небольшой скриптик позволяет поменять обработчик и сделать асинхронный запрос, меняя статусы элементов без перезагрузки страницы.
(Скриптик писался только под статусы publish/unpublish. Кому нужны большее количество статусов легко сможет переписать)
Код:
/** асинхронная обработка publish/unpublish **/
jQuery(function () {
// поиск кнопок на странице - это A кнопки с вложенными элементами несущими иконки
$btn = jQuery('a.btn.btn-micro:has(.icon-publish), a.btn.btn-micro:has(.icon-unpublish)');
$btn.each(function () {
var $this = jQuery(this);
// ищем значение task в обработчике onclick
var command = /'(\w+)\.(\w+)'/.exec($this.attr('onclick'));
// если task успешно найдена, меняем обработчик
if (command !== undefined) {
var controller = command[1];
var act = command[2];
// удаляем обработчик onclick и сохраняем данные в элемент
$this.attr('onclick', false).data('controller', controller).data('act', act);
// вешаем новый обработчик click
$this.click(function (e) {
e.preventDefault();
//сбрасываем все установленные check
jQuery('input[type=checkbox]', '#adminForm').attr('checked', false);
// устанавливаем чекбокс на выбранной строке
jQuery('input[type=checkbox]', $this.closest('tr')).attr('checked', true);
// task  определяется по установленной иконке
var controller = $this.data('controller');
var act = $this.data('act');
var task = controller + '.' + act;

// элемент который несет иконку publish
var $icon = jQuery('[class^=icon]', $this);

var $form = $this.closest('form');

jQuery('input[name=task]', $form).val(task);
// может не работать на старых браузерах
var formData = new FormData($form.get(0));

jQuery.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
contentType: false,
processData: false,
data: formData,
//dataType: 'json',
success: function () {
$icon.toggleClass('icon-publish').toggleClass('icon-unpublish');
if (act === 'unpublish') {
$this.data('act', 'publish');
} else {
$this.data('act', 'unpublish');
}
jQuery('input[type=checkbox]', $this.closest('tr')).attr('checked', false);
}
});
});
}
});
});
У меня работает корректно даже при частых кликах
« Последнее редактирование: 19.10.2015, 16:00:00 от zaboich » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet