Joomla 3 - Работа с таблицами. Поиск и сортировка. Сортировка 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;}С первой функцией все просто - она вытаскивает значение столбца из 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);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 скрытых поля: В них мы помещаем значения из наших 2 функций из модели. Редактирование входной ссылки на нашу страничкуМы откуда-то попадаем на нашу страницу. Следовательно есть ссылка на нее. Выглядеть она должна так: index.php?option=com_mycomponent&controller=mycontroller&task=myview&fof=name&foDf=ASC name в данном случае - это название столбца, по которому будем сортировать по умолчанию. ASC - направление по умолчанию. Редактирование "Создания" и "Удаления" для правильной работы сортировки в JoomlaНаверняка Ваш компонент сделан так, что помимо сортировки вы можете добавлять, редактировать и удалять записи. А из них логично при сохранении попадать обратно, причем с той же сортировкой, с которой и уходили. В моем случае шаблон редактирования прикреплен к той ше модели. Так что нам надо изменить только представление и шаблон "Создания": Открываем view.html "Создания" и добавляем строки: Тут мы по очереди получаем переменные, которые мы на предыдущей страничке поместили в скрытые формы в шаблоне. Получив, мы их перенаправляем в шаблон формы "Создания" записи. В шаблоне все еще проще: 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';}И сам редирект. Ссылка должна выглядеть так: $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');Так как мы удаляем запись на той же странице, то и значения переменных берем из форм с нее же. Строго не судите - понимаю, что не совсем правильный способ, но работает отлично.)) |
Joomla 2.5 Добавляем новую сортировку материалов в меню
Допустим мы добавили в таблицу #__content новое поле, к примеру с ценой (price), создали отдельный шаблон вывода материалов в режиме блога templates/шаблон/html/com_content/category.catalog.xml, там же у нас уже есть отображение цены в описании материала режима блог шаблона каталога templates/шаблон/html/com_content/category/catalog_item.php и теперь осталось только сортировать по цене при создании пункта меню
Для этого идем в файл templates/шаблон/html/com_content/category.catalog.xml и примерно с строки 202 делаем так (можно и в языковые файлы вынести)
1 23 45 67 89 1011 1213 1415 1617 18 | <field name="orderby_sec" type="list" description="JGLOBAL_ARTICLE_ORDER_DESC" label="JGLOBAL_ARTICLE_ORDER_LABEL" > <option value="">JGLOBAL_USE_GLOBAL</option> <option value="aprice">Цена по возрастанию</option> <option value="raprice">Цена по убыванию</option> <option value="front">COM_CONTENT_FEATURED_ORDER</option> <option value="rdate">JGLOBAL_MOST_RECENT_FIRST</option> <option value="date">JGLOBAL_OLDEST_FIRST</option> <option value="alpha">JGLOBAL_TITLE_ALPHABETICAL</option> <option value="ralpha">JGLOBAL_TITLE_REVERSE_ALPHABETICAL</option> <option value="author">JGLOBAL_AUTHOR_ALPHABETICAL</option> <option value="rauthor">JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL</option> <option value="hits">JGLOBAL_MOST_HITS</option> <option value="rhits">JGLOBAL_LEAST_HITS</option> <option value="order">JGLOBAL_ORDERING</option> </field> |
Далее нам нужен файл \components\com_content\helpers\query.php находим функцию orderbySecondary (строка 63) и добавляем кейсы
1 23 45 67 | case 'aprice' : $orderby = 'a.price';break; case 'raprice' : $orderby = 'a.price DESC';break; |
Если нам нужно добавить не только сортировку, но и фильтрацию по значению этого поля при создании ссылки в меню типа блог то можно почитать вот здесь Добавляем параметр фильтрации материалов в меню
blog.pbelkov.net
Joomla 3 - Работа с таблицами. Поиск и сортировка
Доброго дня!
Стала необходимость работы с таблицами. А именно поиск по таблицам и их сортировка. Самым простым способом реализации было бы ручное подключение jQuery. Но тогда данная статья бы не появилась.
Есть отличный плагин Joomla 3 для работ с таблицами. Szaki Table - сайт разработчика. Для себя я немного подправил стили. (Если будет необходимо, могу выложить исправленный плагин.)
Работатет плагин таблиц очень просто, его достаточно установить, и перед таблицей его вызвать.
Для вызова достаточно использовать: {szakitable filter="table" } , в конце таблице указать: {/szakitable}.
В моем случае используется чистый шаблон на bootstrap. В таком виде выводится таблица, как видно её можно сортировать по всем полям. Так же сверху таблицы находится фильтр, который ищет по всем записям.
И непосредственно сам пример таблицы, которая используется:
{szakitable filter="table" }<table> <thead> <tr><th>Маршрут</td><th>Регулярность</th><th>Отправление</th><th>Прибытие</th></tr></thead> <tbody><tr><td><p>Краснодар — Адлер(аэропорт)</p></td><td>ежедневно</td><td>10:20, 15:20</td><td>19:44, 23:55</td></tr><tr><td><p>Краснодар — Алексеетенгинская</p></td><td>7</td><td>14:25</td><td>18:00</td></tr><tr><td>Краснодар — Анапа</td><td>ежедневно</td><td>07:00, 07:45, 08:36, 11:01, 12:02, 14:16, 15:30, 17:50, 18:59, 22:01</td><td>10:27, 11:12, 12:10, 14:28, 16:29, 17:48, 18:57, 21:02, 22:30, 01:34</td></tr><tr><td>Краснодар — Анапа</td><td>лето</td><td>06:32, 07:20, 09:21, 14:57, 15:59, 16:50</td><td>09:59, 11:30, 12:53, 18:24, 19:14, 20:17</td></tr><tr><td><div>Краснодар — Анапа</div><div>(ч/з Славянск-на-Кубани)</div></td><td>ежедневно</td><td>14:40, 16:20, 17:22</td><td>18:10, 19:50, 20:52</td></tr><tr><td>Кисловодск — Анапа</td><td>ежедневно</td><td>03:25</td><td>06:52</td></tr></tbody></table>{/szakitable}
lite-blog.ru