Сейчас на сайте

  • [Bot] [Bot]
Всего на сайте:
  • 1 гость
  • 1 робот
Последними зарегистрировались:

Дни рождения

В ближайшем будущем дней рождения не предвидится




Правильный выбор доменного имениприносит успех в парковке доменаКомпонент зависимых выпадающих списков для Joomla 2.5 ZavispisКомпонент Matukio - русификация
Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

Альтернатива сортировке Joomla для столбцов в таблице
(1 чел.) (1) гость
Здесь можно обсуждать вопросы, связанные с созданием компонентов, плагинов и модулей для Joomla 2.5
  • Страница:
  • 1

ТЕМА: Альтернатива сортировке Joomla для столбцов в таблице

Альтернатива сортировке Joomla для столбцов в таблице 4 года, 11 мес. назад #209

  • Slim888
  • Вне сайта
  • Эксперт
  • Crazy!!!
  • Постов: 97
  • Репутация: 5
Альтернативная сортировка в Joomla 2.5

При написании компонента с использованием нескольких БД и выводом данных из них на разных страницах в админке, на главной странице сортировка Joomla работает отлично для любых столбцов. Но если попробовать сделать ее на неглавной странице, то, при нажатии на заголовок столбца, Joomla выкидывает нас на первую страницу компонента вместо того, чтобы отсортировать столбец... Понять, почему так происходит я так и не смог и поэтому написал свое решение.

Альтернативная сортировка Joomla

Первым делом открываем модель, которая выводит данные на страницу, где нужна сортировка.

Добавляем туда 2 переменные и 2 функции:

public $_filter_order_fld;
public $_filter_order_Dir_fld;
function __construct()
{
parent::__construct();
}
public function getOrderfld()
{
$this->_filter_order_fld = JRequest::getVar('fof', '', 'get');
return $this->_filter_order_fld;
}
public function getOrderdirfld()
{
$this->_filter_order_Dir_fld = JRequest::getVar('foDf', '', 'get');
if ($this->_filter_order_Dir_fld == 'ASC')
{
$this->_filter_order_Dir_fld = 'DESC';
}
else
{
$this->_filter_order_Dir_fld = 'ASC';
}
return $this->_filter_order_Dir_fld;
}

В самом начале объявляем 2 переменные - они отвечают, соответственно, за столбец, по которому будет происходить сортировка и за направление.

С первой функцией все просто - она вытаскивает значение столбца из GET (позже мы туда будем посылать текущее значение) и возвращает его.

Вторая функция также тащит значение направления сортировки из GET  и меняет его на противоположное. После чего возвращает.

Далее находим в модели функцию, которая делает запрос в базу и немного ее изменяем:

в самом начале вставляем 2 уже знакомые строчки:

$filter_order_fld = JRequest::getVar('fof', '', 'get');
$filter_order_Dir_fld = JRequest::getVar('foDf', '', 'get');

в запрос добавляем сортировку чтобы он выглядел примерно так:

$query->select('*')
->from('#__mytable')
->order($filter_order_fld . ' ' . $filter_order_Dir_fld);

Таким образом вывод данных из базы будет с сортировкой по столбцу $filter_order_fld и по направлению $filter_order_Dir_fld.

View.html.php

В представлении нам нужно добавить только 4 строчки, которые будут брать данные, которые вернули наши 2 функции из модели и отдавать их шаблону.

Итак добавляем:

$fof = $this->get('Orderfld');
$this->assignRef('fof', $fof);
$foDf = $this->get('Orderdirfld');
$this->assignRef('foDf', $foDf);

Шаблон

Сначала напишем название в ячейке:

<th><a href="index.php?option=com_mycomponent&controller=mycontroller&task=myview&fof=<?php echo $this->fof; ?>&foDf=<?php echo $this->foDf; ?>"><?php echo JText::_( 'COM_ZAVISPIS_NAME' ); ?></a></th>

В ссылке мы прописываем имя нашего компонента, имя контроллера, который обрабатывает вид вывода данных на нашей странице, а в конце добавляем 2 параметра (столбец и направление), которые потом идут в модель. JText - это то, что будет написано в ячейке и будет ссылкой (берется из языкового файла).

В самом низу шаблона добавляем 2 скрытых поля:

<input type="hidden" name="filter_order_fld" value="<?php echo $this->fof; ?>" />
<input type="hidden" name="filter_order_Dir_fld" value="<?php echo $this->foDf; ?>" />

В них мы помещаем значения из наших 2 функций из модели.

Редактирование входной ссылки на нашу страничку

Мы откуда-то попадаем на нашу страницу. Следовательно есть ссылка на нее. Выглядеть она должна так:

index.php?option=com_mycomponent&controller=mycontroller&task=myview&fof=name&foDf=ASC

name в данном случае - это название столбца, по которому будем сортировать по умолчанию. ASC - направление по умолчанию.

Редактирование "Создания" и "Удаления" для правильной работы сортировки в Joomla

Наверняка Ваш компонент сделан так, что помимо сортировки вы можете добавлять, редактировать и удалять записи. А из них логично при сохранении попадать обратно, причем с той же сортировкой, с которой и уходили.

В моем случае шаблон редактирования прикреплен к той ше модели. Так что нам надо изменить только представление и шаблон "Создания":

Открываем view.html "Создания" и добавляем строки:

$fof = JRequest::getVar('filter_order_fld', '', 'post');
$this->assignRef('fof', $fof);
$foDf = JRequest::getVar('filter_order_Dir_fld', '', 'post');
$this->assignRef('foDf', $foDf);

Тут мы по очереди получаем переменные, которые мы на предыдущей страничке поместили в скрытые формы в шаблоне. Получив, мы их перенаправляем в шаблон формы "Создания" записи.

В шаблоне все еще проще:

<input type="hidden" name="filter_order_fldcr" value="<?php echo $this->fof; ?>" />
<input type="hidden" name="filter_order_Dir_fldcr" value="<?php echo $this->foDf; ?>" />

Опять скрытые формы для передачи параметров обратно на страничку, в которую мы будем отсюда сохранять запись. Я использовал другие имена  инпутов чтобы не путаться.

И последнее)

Изменение редиректов в контроллере для правильной работы сортировки в Joomla.

Открываем наш контроллер, который отвечает за страничку, ради которой мы все это и затеяли.

Там должна быть функция public function save()

Последняя строка в ней - это редирект после сохранения. Перед этой строкой вставляем:

$filter_order_fld = JRequest::getVar('filter_order_fldcr', '', 'post');
$filter_order_Dir_fld = JRequest::getVar('filter_order_Dir_fldcr', '', 'post');
if ($filter_order_Dir_fld == 'DESC')
{
$filter_order_Dir_fld = 'ASC';
}
else
{
$filter_order_Dir_fld = 'DESC';
}

Первые 2 строки - это получение значений переменных из инпутов "Создания". Дальше же мы меняем направление сортировки на противоположное!

И сам редирект. Ссылка должна выглядеть так:

$this->setRedirect('index.php?option=com_mycomponent&controller=mycontroller&task=myview&fof=' . $filter_order_fld . '&foDf=' . $filter_order_Dir_fld, $message);

 

Абсолютно те же действия нужно проделать с функцией public function remove() с одной маленькой поправкой. Первые 2 строчки:

$filter_order_fld = JRequest::getVar('filter_order_fld', '', 'post');
$filter_order_Dir_fld = JRequest::getVar('filter_order_Dir_fld', '', 'post');

Так как мы удаляем запись на той же странице, то и значения переменных берем из форм с нее же.

Строго не судите - понимаю, что не совсем правильный способ, но работает отлично.))

Подробнее...
Лёх, ты че сделал??? Ч-чини давай!!!
  • Страница:
  • 1
Время создания страницы: 0.32 секунд