Ajax изменение сортировки контента в универсальном модуле FLEXIcontent

  • 09.01.2014

Задача — сделать в модуле табы при нажатии на которые происходила бы новая выборка контента с другими параметрами сортировки или отбора. Способ подходит для любого модуля и для любого компонента. Кто видел универсальный модуль FLEXIcontent изнутри, тот поймет, почему я не полез в него, а сделал в обход.

Итак, по порядку.

1. Создаем табы по которым будет осуществляться переход, ссылку в табе нужно привести к такому виду:

<a href="#" data-order="popular" data-module="103" class="tabs-nav-link">Топ</a>

где data-order - параметр сортировки в этом табе, data-module — ID модуля (могут быть копии одного модуля, поэтому для точного определения нужен именно ID). Получить ID модуля (в коде модуля) можно так:

<?php echo $module->id; ?>

2. Скрипт обрабатывающий AJAX (на jQuery):

jQuery(function($) {
 $('.tabs-nav-link').click(function(){
 var module = $(this).attr('data-module');
 var order = $(this).attr('data-order');

 var parent = $(this).parents('div.index-news-contayner');
 $('li.tabs-nav-item', parent).removeClass('tabs-nav-item_state_active');
 $(this).parent().addClass('tabs-nav-item_state_active')
 $.ajax({
 type: "POST",
 url: '/index.php?option=com_flexicontent&controller=other&task=news_ajax&module='+module+'&order='+order,
 dataType: 'html',
 success: function (data){
 $('div.section-unit', parent).html(data);
 }
 });
 return false;
 });
});

Скрипт вешает на ссылку с классом tabs-nav-link обработчик, запускающий AJAX-запрос при нажатии на ссылку. Контейнер для вывода полученного контента в данном случае div.section-unit

Обработчик обращается в контроллер other компонента FLEXIcontent в котором находится функция, поставляющая контент.

Тело функции:

function news_ajax(){
 $db = JFactory::getDbo();
 $input = new JInput();
 $moduleId = $input->getInt('module', 0);
 $order = $input->getString('order', 'default');

 $query = $db->getQuery(true);
 $query->select('params');
 $query->from('#__modules');
 $query->where('`id` = ' . $moduleId);
 $db->setQuery($query, 0, 1);
 $result = $db->loadResult();

 $params = new JRegistry();
 $params->loadString($result);

 if($order != 'default'){
  $params->set('ordering', $order);
 }

 $params->set('layout', $params->get('layout', 'default').'-inner');

 require(JPATH_BASE.'/modules/mod_flexicontent/mod_flexicontent.php');
 JFactory::getApplication()->close();
}

Как видите все просто, по полученным данным я загружаю параметры модуля, меняю нужные параметры на пришедшие из запроса и вывожу модуль на печать. Стоит отметить что для таких выкрутасов я разбил шаблон модуля на два — обертка с заголовками, табами и т.п. и тело контента, которое подлежит перезагрузке. В основной шаблон подключен шаблон контента, а при перезагрузке я использую только внутренний шаблон, который в функции переназначается. В моем случае это основной — default.php и внутренний - default-inner.php.

Для того, чтоб оставить комментарий, авторизуйтесь через социальные сети.

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Скачать Joomla! 3.9.4 Документация Joomla! CMS Свернуть

Расширения Joomla

Новости портала

Новое в блогах