Способ подходит для любого модуля и для любого компонента.
Кто видел универсальный модуль Флекси изнутри, тот поймет, почему я не полез в него, а сделал в обход.
Была задача, сделать в модуле табы при нажатии на которые происходила бы новая выборка контента с другими параметрами сортировки или отбора.
Итак, по порядку.
1. Создаем табы по которым будет осуществляться переход, ссылку в табе нужно привести к такому виду:
<a href="#" data-order="popular" data-module="103" class="tabs-nav-link">Топ</a>
где data-order — параметр сортировки в этом табе, data-module — ид модуля (могут быть копии одного модуля, по этому для точного определения нужен именно ид). Получить ид модуля можно так
<?php echo $module->id; ?>
в коде модуля это срабатывает.2. Скрипт обрабатывающий аякс (на 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
обработчик, запускающий аякс-запрос при нажатии на ссылку. Контейнер для вывода полученного контента в данном случае div.section-unit
.Обработчик обращается в контроллер
other
компонента Флексиконтент в котором находится функция, поставляющая контент.Тело функции:
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');
die;
}
Как видите все просто, по полученным данным я загружаю параметры модуля, меняю нужные параметры на пришедшие из запроса и вывожу модуль на печать. Стоит отметить что для таких выкрутасов я разбил шаблон модуля на два — обертка с заголовками, табами и т.п. и тело контента, которое подлежит перезагрузке. В основной шаблон подключен шаблон контента, а при перезагрузке я использую только внутренний шаблон, который в функции переназначается. В моем случае это основной — default.php и внутренний — default-inner.php.