Учитывая, что у вас есть таблица данных, уже в компоненте, как сделать некоторые, или все столбцы таблицы сортировки, как и многие из них находятся в Joomla администратора? Это не особенно трудно сделать, но Есть несколько шагов, необходимых и подробности вы должны быть осведомлены о так что все сходится правильно. Есть вариации на процедурой, приведенной здесь и как только вы уверены, что вы понимаете, как все это работает, Вы должны чувствовать себя свободно исследовать другие возможности, которые могут подойти вашим целей лучше.
Эта процедура предполагает, что ваш компонент структурирован в соответствии с Model-View-Controller (MVC) шаблон проектирования. Общая идея процедура будет по-прежнему применяться к не-MVC компонент если применить немного фантазии!
Шаг 1: модель
Первое, что нужно добавить filter_order и filter_order_Dir запрос в __construct () функцию. Если вы использовали JPagination, этот шаг будет уже вам знакомы. "Default_column_name" Изменить на имя столбца, который нужно использовать в качестве сортировки по умолчанию, и менять фильтр направлении порядку, если вы хотите добавить эту информацию состояние объекта здесь страхует его доступным для всех код, который может в ней нуждается.
function __construct()
{
parent::__construct();
global $mainframe, $option;
$filter_order = $mainframe->getUserStateFromRequest( $option.'filter_order', 'filter_order', 'default_column_name', 'cmd' );
$filter_order_Dir = $mainframe->getUserStateFromRequest( $option.'filter_order_Dir', 'filter_order_Dir', 'asc', 'word' );
$this->setState('filter_order', $filter_order);
$this->setState('filter_order_Dir', $filter_order_Dir);
}
В модели, которая генерирует данные, которые лягут в таблице, необходимо внести изменения в метод, который создает запрос к базе данных, которая будет использоваться для заполнения таблицы. Чаще всего это GetData () метод, но не может быть; Прибытие чтобы увидеть, какой метод фактически используется.
Модель может извлекать данные из любой, но не должны быть базы данных, но в подавляющем большинстве случаев модель будет использовать базу данных Joomla API представить SQL запросов к базе данных. Предполагая, что будет так, то вам нужно настроить запрос, чтобы сортировать параметры принимаются во внимание.
Эта информация вызывается любыми функция строит предложение ORDER BY, как правило, частные функции следующим образом:
function _buildContentOrderBy()
{
global $mainframe, $option;
$orderby = '';
$filter_order = $this->getState('filter_order');
$filter_order_Dir = $this->getState('filter_order_Dir');
/* Error handling is never a bad thing*/
if(!empty($filter_order) && !empty($filter_order_Dir) ){
$orderby = ' ORDER BY '.$filter_order.' '.$filter_order_Dir;
}
return $orderby;
}
Шаг 2: мнение
Сформировав сортировки переменных в модели, необходимо назначить их просмотра так, что они появляются на странице, когда оно появится.
Для этого необходимо добавить несколько строк кода на ваш взг
function display($tpl = null)
{
// Get data from the model
$items = & $this->get( 'Data');
$this->assignRef('items', $items);
/* Call the state object */
$state =& $this->get( 'state' );
/* Get the values from the state object that were inserted in the model's construct function */
$lists['order_Dir'] = $state->get( 'filter_order_Dir' );
$lists['order'] = $state->get( 'filter_order' );
$this->assignRef( 'lists', $lists );
parent::display($tpl);
}
Шаг 3: Файл компонента макета
Теперь вам нужно добавить некоторые элементы в компонент файла макета. В таблице должны быть включены в форму. Это уже может быть случай, как, например, вы, возможно, уже реализованы нумерацией страниц или фильтрация на стол. Но если в таблице еще не в форме, то сейчас самое время, чтобы обернуть его в <form> и </ FORM> теги. Причина
того, что форма требуется в том, что сортировки столбцов полагаться на
немного JavaScript, который будет представлять формы с параметры
сортировки добавил. Естественно, это будет связано загрузки страницы, так что если вы предпочитаете AJAX-решение, то эта процедура не для вас.
Форму теги будут выглядеть примерно так:
<form id="adminForm" action="<?php echo JRoute::_( 'index.php' );?>" method="post" name="adminForm">
.... table goes here ....
</form>
Обратите внимание, что имя формы должны быть "adminForm". Возможно, вам придется настроить действия URL в некоторых случаях.
Кроме того, необходимо добавить несколько скрытых полей в форме. Их можно разместить в любом месте между <form> и </ FORM>, но
обычно они находятся как раз перед закрытием тега, например:
<form id="adminForm" action="<?php echo JRoute::_( 'index.php' );?>" method="post" name="adminForm">
.... table goes here ....
<input type="hidden" name="filter_order" value="<?php echo $this->lists['order']; ?>" />
<input type="hidden" name="filter_order_Dir" value="<?php echo $this->lists['order_Dir']; ?>" />
</form>
Теперь посмотрим на саму таблицу. Возможно, вам придется стол со статическим заголовки уже, глядя неопределенно так:
<tr>
<th>Name</th>
<th>Description</th>
</tr>
Вам необходимо заменить статические имена столбцов с призывами к Joomla JHTML статического класса, так что ваш код будет выглядеть примерно так:
<tr>
<th><?php echo JHTML::_( 'grid.sort', 'Name', 'DbNameColumn', $this->lists['order_Dir'], $this->lists['order']); ?></th>
<th><?php echo JHTML::_( 'grid.sort', 'Description', 'DbDescriptionColumn', $this->lists['order_Dir'], $this->lists['order']); ?></th>
</tr>
Вы, безусловно, необходимо адаптировать этот код, чтобы ваши специфические требования. Аргументы вызова JHTML являются следующие:
1. Должно быть "grid.sort так, чтобы JHTML будет вставлять правильного поведения для сортировки столбцов.
2. Это имя столбца, что ваши посетители будут видеть. Вы должны изменить это для вашего столбцов таблицы.
3. Это имя соответствующего поля базы данных (колонка), который должен быть отсортирован по. Это будет передана модель, скорее всего, поэтому он может быть добавлен в "ORDER BY", содержащейся в заявлении запросов SQL.
4. Должно быть именно так, как показано здесь. Это направление тока порядке (по возрастанию или убыванию) и поставляется с точки зрения (см. ниже).
5. Должно быть именно так, как показано здесь. Это имя столбца, таблицы отсортированы по и поставляется с точки зрения (см. ниже).
Короче говоря, вам необходимо изменить Второй и третий аргументы для каждого вызова JHTML надлежащим образом.
Наконец, если ваш сортировки таблицы будет в передний конец вашего сайта, то вам нужно добавить немного фрагмент JavaScript для макета. Кроме того, вы можете добавить его к представлению кода (с использованием JDocument-> addScriptDeclaration), если вы предпочитаете держать ваш JavaScript кода в разделе HTML <head>.
<script language="javascript" type="text/javascript">
function tableOrdering( order, dir, task )
{
var form = document.adminForm;
form.filter_order.value = order;
form.filter_order_Dir.value = dir;
document.adminForm.submit( task );
}
</script>
Вам не нужно добавлять этот код, если ваш сортировки таблицы в администратора, как этот код загружается для вас автоматически в любом случае.
На этом изменения необходимо внести в макет. JHTML grid.sort Теперь добавим вызов tableOrdering функция, так что
tableOrdering будем называть всякий раз, когда пользователь нажимает на заголовок столбца. tableOrdering ставит имя колонки, которая была нажата, и направление сортировки, в скрытых полях формы и отправляет форму. На следующем шаге вы увидите, как модель берет эти значения полей и вносит изменения в запрос к базе данных соответствующим образом.
Шаг 4: Styling результат
Наконец-то. Вы можете применить немного CSS стиль для того чтобы результат немного более привлекательным.
Выбор сортировки столбцов может быть сделано только через их контекст, так что вы, вероятно, необходимо добавить CSS класс для <table>, <tr> или <th> тегов. Это то, что выход может выглядеть с класса добавляется тег:
<tr class="sortable">
<th><a href="javascript:tableOrdering('DbName','asc','');" title="Click to sort by this column">Training provider</a></th>
<th><a href="javascript:tableOrdering('DbDescription','asc','');" title="Click to sort by this column">Location</a></th>
</tr>
Чтобы добавить немного пространства между именем столбца и по возрастанию / убыванию индикатор изображение (общие требования), вы могли бы применить CSS следующим образом:
tr.sortable th img {
margin-left: 5px;
}