Joomla фильтр материалов
Фильтр материалов joomla 2.5 - иногда на сайте под CMS joomla встает задача организации фильтрации материалов, в этой статье вы узнаете как сделать joomla фильтр материалов.
В данном примере создания фильтр материалов joomla 2.5.8, будет рассмотрено добавление формы фильтра материалов на странице родительской категории.
Какие поля будут использоваться для фильтра материалов в joomla, вы можете определить для себя самостоятельно, но в данном примере будут следующие поля для фильтра:
- название материала
- диапазон дат публикации материала
- корядок сортировки по дате публикации материала
- категория к которой относится материал
Структура категорий в данном примере двухуровневая, т.е есть главная категория "Базовое законодательство" и подкатегории "Политика персональных данных", "Рекомендации" и пр.
Суть такой структуры в том, что при заходе на страницу родительской категории первого уровня "Базовое законодательство", проверяем ее ID и если он соответствует, то выводим фильтр материалов joomla, это сделано для того, что бы данный фильтр не выводился на страницах подкатегорий и вообще остальных категорий первого уровня.

Так как мы фильтруем материалы компонента joomla com_content, то нужно в вашей теме переопределить шаблон вывода этого компонента
Для этого копируем из папки /components/com_content/views/category/tmpl в папку /templates/YOUR_THEME/html/com_content/category следующие файлы:
- default.php
- default_articles.php
Далее копируем файл default_articles.php и переименовываем его в default_articles_filter.php это будет шаблон вывода категории с результатами работы фильтра, а также в нем буде форма фильтра материалов joomla
Входной файл вывода категории joomla это default.php в переопределяем подключаемый шаблон вывода списка материалов для нашей категории верхнего уровня ("Базовое законодательство") используя ее ID:
<?php $tpl = ($this->category->id==114 || $this->category->parent_id==113)? 'articles_filter' : 'articles'; echo $this->loadTemplate($tpl); ?>
Содержимое файла default_articles_filter.php вывода статей после фильтрации:
<?php /** * @package Joomla.Site * @subpackage com_content * @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ // no direct access defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html'); JHtml::_('behavior.tooltip'); JHtml::core(); // Create some shortcuts. $params = &$this->item->params; $n = count($this->items); $listOrder = $this->escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); ?> <?php if (empty($this->items)) : ?> <?php if ($this->params->get('show_no_articles', 1)) : ?> <p><?php echo JText::_('COM_CONTENT_NO_ARTICLES'); ?></p> <?php endif; ?> <?php else : ?> <form action="<?php echo htmlspecialchars(JFactory::getURI()->toString()); ?>" method="post" name="adminForm" id="adminForm"> <fieldset class="filters filters-dokumenty"> <div class="filter-search row"> <div class="over-filter-search"> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->state->get('list.filter')); ?>" class="inputbox" onchange="document.adminForm.submit();" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" placeholder="Поисковый запрос" /> </div> </div> <div class="filter-date row"> <div class="col"> <label for="date_to">Принят позже, чем ...</label> <input type="text" id="date_to" name="date_to" placeholder="дд.мм.гггг" value="<?php echo $this->escape($_POST['date_to']); ?>" /> </div> <div class="col"> <label for="date_in">Принят раньше, чем ...</label> <input type="text" id="date_in" name="date_in" placeholder="дд.мм.гггг" value="<?php echo $this->escape($_POST['date_in']); ?>"/> </div> <div class="col"> <label for="date_in">Порядок сортировки</label> <select name="date_sort"> <option value="date_asc" <?php if($_POST['date_sort']=='date_asc'):?>selected<?php endif; ?>>По убыванию даты (сначала)</option> <option value="date_desc" <?php if($_POST['date_sort']=='date_desc'):?>selected<?php endif; ?>>По возрастанию даты (сначала)</option> </select> </div> </div> <?php $db =& JFactory::getDBO(); $parent_id = $this->category->parent_id; $query = 'SELECT `id`, `title`' . ' FROM #__categories ' . ' WHERE `parent_id` = '.$parent_id.'' . ' ORDER BY `id` DESC'; $db->setQuery($query); if(!$db->query()){echo $db->stderr(); return false;} $rows = $db->loadObjectList(); ?> <div class="filter-category row"> <label for="category_sort">Опубликован в категории</label> <select id="category_sort" name="category_sort"> <option value="">---</option> <?php if(count($rows)>0): ?> <?php foreach ($rows as $key => $value): ?> <option value="<?=$value->id;?>" <?php if($_POST['category_sort']==$value->id):?>selected<?php endif; ?>><?=$value->title;?></option> <?php endforeach; ?> <?php endif; ?> </select> <button type="submit">Поиск</button> </div> <!-- @TODO add hidden inputs --> <input type="hidden" name="filter_order" value="" /> <input type="hidden" name="filter_order_Dir" value="" /> <input type="hidden" name="limitstart" value="" /> </fieldset> <?php //endif; ?> <?php if ($this->params->get('show_category_title', 1) or $this->params->get('page_subheading')) : ?> <br/><br/> <h2> <?php if(!empty($_POST['category_sort'])): ?> <?php if(count($rows)>0): ?> <?php foreach ($rows as $key => $value): ?> <span class="subheading-category"><?php if($_POST['category_sort']==$value->id):?><?=$value->title;?><?php endif; ?></span> <?php endforeach; ?> <?php endif; ?> <?php else: ?> <?php echo $this->escape($this->params->get('page_subheading')); ?> <?php if ($this->params->get('show_category_title')) : ?> <span class="subheading-category"><?php echo $this->category->title;?></span> <?php endif; ?> <?php endif; ?> </h2> <?php endif; ?> <table class="category"> <?php //if ($this->params->get('show_headings')) :?> <thead> <tr> <? /*<th class="list-title" id="tableOrdering"> <?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder) ; ?> </th>*/ ?> <?php if ($date = $this->params->get('list_show_date')) : ?> <th class="list-date" id="tableOrdering2"> <?php if ($date == "created") : ?> <?php echo JHtml::_('grid.sort', 'COM_CONTENT_'.$date.'_DATE', 'a.created', $listDirn, $listOrder); ?> <?php elseif ($date == "modified") : ?> <?php echo JHtml::_('grid.sort', 'COM_CONTENT_'.$date.'_DATE', 'a.modified', $listDirn, $listOrder); ?> <?php elseif ($date == "published") : ?> <?php echo JHtml::_('grid.sort', 'COM_CONTENT_'.$date.'_DATE', 'a.publish_up', $listDirn, $listOrder); ?> <?php endif; ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_author', 1)) : ?> <th class="list-author" id="tableOrdering3"> <?php echo JHtml::_('grid.sort', 'JAUTHOR', 'author', $listDirn, $listOrder); ?> </th> <?php endif; ?> <?php if ($this->params->get('list_show_hits', 1)) : ?> <th class="list-hits" id="tableOrdering4"> <?php echo JHtml::_('grid.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?> </th> <?php endif; ?> </tr> </thead> <?php //endif; ?> <tbody> <?php if(isset($_POST['filter_order'])): ?> <?php $catid = (!empty($_POST['category_sort']))? $_POST['category_sort'] : $this->category->id; $query = 'SELECT i.id, i.created, i.title, i.access, c.title AS ctitle'; $query .= ' FROM #__content AS i, #__categories AS c '; $query .= ' WHERE i.catid = '.$catid.' '; $query .= 'AND i.state = 1 AND c.id = '.$catid.' '; if(!empty($_POST['filter-search'])){ $query .= 'AND i.title LIKE ' . $db->quote( '%'.$_POST['filter-search'].'%', false ); } //Принят позже, чем ... if(!empty($_POST['date_to'])){ $arr_date_to = explode('.', $_POST['date_to']); if(count($arr_date_to)>0){ $query .= 'AND i.created < ' .$db->quote($arr_date_to[2].'-'.$arr_date_to[1].'-'.$arr_date_to[0].' 00:00:00'); } } //Принят раньше, чем ... if(!empty($_POST['date_in'])){ $arr_date_to = explode('.', $_POST['date_in']); if(count($arr_date_to)>0){ $query .= 'AND i.created > ' .$db->quote($arr_date_to[2].'-'.$arr_date_to[1].'-'.$arr_date_to[0].' 00:00:00'); } } if(!empty($_POST['date_sort'])){ if($_POST['date_sort']=='date_asc'){ $query .= ' ORDER BY i.created ASC'; }elseif($_POST['date_sort']=='date_desc'){ $query .= ' ORDER BY i.created DESC'; } }else{ $query .= ' ORDER BY i.id DESC'; } $db->setQuery($query); if(!$db->query()){echo $db->stderr(); return false;} $rows = $db->loadObjectList(); //print_r($rows); ?> <?php foreach ($rows as $i => $article) : ?> <?php if ($article->state == 0) : ?> <tr class="system-unpublished cat-list-row<?php echo $i % 2; ?>"> <?php else: ?> <tr class="cat-list-row<?php echo $i % 2; ?>" > <?php endif; ?> <?php if (in_array($article->access, $this->user->getAuthorisedViewLevels())) : ?> <td class="list-title"> <a href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($article->id, $catid)); ?>"> <?php echo $this->escape($article->title); ?></a> </td> <?php else : // Show unauth links. ?> <td> <?php echo $this->escape($article->title).' : '; $menu = JFactory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active->id; $link = JRoute::_('index.php?option=com_users&view=login&Itemid='.$itemId); $returnURL = JRoute::_(ContentHelperRoute::getArticleRoute($article->slug)); $fullURL = new JURI($link); $fullURL->setVar('return', base64_encode($returnURL)); ?> <a href="<?php echo $fullURL; ?>" class="register"> <?php echo JText::_( 'COM_CONTENT_REGISTER_TO_READ_MORE' ); ?></a> </td> <?php endif; ?> </tr> <?php endforeach; ?> <?php else: ?> <?php foreach ($this->items as $i => $article) : ?> <?php if ($this->items[$i]->state == 0) : ?> <tr class="system-unpublished cat-list-row<?php echo $i % 2; ?>"> <?php else: ?> <tr class="cat-list-row<?php echo $i % 2; ?>" > <?php endif; ?> <?php if (in_array($article->access, $this->user->getAuthorisedViewLevels())) : ?> <td class="list-title"> <a href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($article->slug, $article->catid)); ?>"> <?php echo $this->escape($article->title); ?></a> <?php if ($article->params->get('access-edit')) : ?> <ul class="actions"> <li class="edit-icon"> <?php echo JHtml::_('icon.edit', $article, $params); ?> </li> </ul> <?php endif; ?> </td> <?php if ($this->params->get('list_show_date')) : ?> <td class="list-date"> <?php echo JHtml::_('date', $article->displayDate, $this->escape( $this->params->get('date_format', JText::_('DATE_FORMAT_LC3')))); ?> </td> <?php endif; ?> <?php if ($this->params->get('list_show_author', 1) && !empty($article->author )) : ?> <td class="list-author"> <?php $author = $article->author ?> <?php $author = ($article->created_by_alias ? $article->created_by_alias : $author);?> <?php if (!empty($article->contactid ) && $this->params->get('link_author') == true):?> <?php echo JHtml::_( 'link', JRoute::_('index.php?option=com_contact&view=contact&id='.$article->contactid), $author ); ?> <?php else :?> <?php echo JText::sprintf('COM_CONTENT_WRITTEN_BY', $author); ?> <?php endif; ?> </td> <?php endif; ?> <?php if ($this->params->get('list_show_hits', 1)) : ?> <td class="list-hits"> <?php echo $article->hits; ?> </td> <?php endif; ?> <?php else : // Show unauth links. ?> <td> <?php echo $this->escape($article->title).' : '; $menu = JFactory::getApplication()->getMenu(); $active = $menu->getActive(); $itemId = $active->id; $link = JRoute::_('index.php?option=com_users&view=login&Itemid='.$itemId); $returnURL = JRoute::_(ContentHelperRoute::getArticleRoute($article->slug)); $fullURL = new JURI($link); $fullURL->setVar('return', base64_encode($returnURL)); ?> <a href="<?php echo $fullURL; ?>" class="register"> <?php echo JText::_( 'COM_CONTENT_REGISTER_TO_READ_MORE' ); ?></a> </td> <?php endif; ?> </tr> <?php endforeach; ?> <?php endif; ?> </tbody> </table> <?php endif; ?> <?php // Code to add a link to submit an article. ?> <?php if ($this->category->getParams()->get('access-create')) : ?> <?php echo JHtml::_('icon.create', $this->category, $this->category->params); ?> <?php endif; ?> <?php // Add pagination links ?> <?php if (!empty($this->items)) : ?> <?php if (($this->params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->get('pages.total') > 1) && !isset($_POST['filter_order'])) : ?> <div class="pagination"> <?php if ($this->params->def('show_pagination_results', 1)) : ?> <p class="counter"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php endif; ?> <?php echo $this->pagination->getPagesLinks(); ?> </div> <?php endif; ?> </form> <?php endif; ?>
CSS стили оформления фильтра материалов joomla:
/*** filters-dokumenty ***/ .filters-dokumenty{ border:1px solid #ccc; padding: 20px; background:#e2e2e2; } .filters-dokumenty .row{margin: 0 0 15px 0;} .filters-dokumenty .filter-category{margin: 0;} .filters-dokumenty .row::after{content: ''; display: block; clear: both;} .filters-dokumenty .row .col{float:left; margin: 0 52px 0 0;} .filters-dokumenty .row .col:last-child{margin: 0;} .filters-dokumenty .row label{display: block; font-weight: bold;} .filters-dokumenty .over-filter-search .inputbox{width:100%;} .filters-dokumenty .filter-category::after{content:''; display:block; clear:both;} .filters-dokumenty .filter-category button{float: right; display: block;} /*** END filters-dokumenty ***/
Скачать папку com_content для переопределеня вывода компонента для своего сайта вы можете по этой ссылке: скачать Joomla фильтр материалов
Сделайте БЕКАП СВОЕЙ ТЕМЫ! А затем распакуйте архив и просто залейте папку html в корень папки вашей темы.
PS. Читайте последние записи RSS Подписка на RSS