Joomla фильтр материалов

Среда, 16 Ноябрь 2016

Фильтр материалов joomla 2.5 - иногда на сайте под CMS joomla встает задача организации фильтрации материалов, в этой статье вы узнаете как сделать joomla фильтр материалов.

В данном примере создания фильтр материалов joomla 2.5.8, будет рассмотрено добавление формы фильтра материалов на странице родительской категории.

Какие поля будут использоваться для фильтра материалов в joomla, вы можете определить для себя самостоятельно, но в данном примере будут следующие поля для фильтра:

 

 

Структура категорий в данном примере двухуровневая, т.е есть главная категория "Базовое законодательство" и подкатегории "Политика персональных данных", "Рекомендации" и пр.

Суть такой структуры в том, что при заходе на страницу родительской категории первого уровня "Базовое законодательство", проверяем ее ID и если он соответствует, то выводим фильтр материалов joomla, это сделано для того, что бы данный фильтр не выводился на страницах подкатегорий и вообще остальных категорий первого уровня.

 

фильтр материалов joomla

 

Так как мы фильтруем материалы компонента joomla com_content, то нужно в вашей теме переопределить шаблон вывода этого компонента

Для этого копируем из папки /components/com_content/views/category/tmpl в папку /templates/YOUR_THEME/html/com_content/category следующие файлы:

 

 

Далее копируем файл 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

Добавить комментарий