Задача — сделать в модуле табы при нажатии на которые происходила бы новая выборка контента с другими параметрами сортировки или отбора. Способ подходит для любого модуля и для любого компонента. Кто видел универсальный модуль FLEXIcontent изнутри, тот поймет, почему я не полез в него, а сделал в обход.
Итак, по порядку.
1. Создаем табы по которым будет осуществляться переход, ссылку в табе нужно привести к такому виду:
Топ
где data-order - параметр сортировки в этом табе, data-module — ID модуля (могут быть копии одного модуля, поэтому для точного определения нужен именно ID). Получить ID модуля (в коде модуля) можно так:
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.