MODX. Теги для материалов сайта

Способ создания тегов на MODX можно выбрать исходя из потребностей. Если нужен только вывод цепочки тегов в статье, можно использовать маленький самодельный сниппет. Если же нужен расширенный функционал, то уместно использование компонента, к примеру tagLister. Независимо от того, какой способ будет выбран, у них есть общие этапы. Ниже приведены общие действия, и 2 различных способа создания тегов.

Общие действия

  1. Для начала, создадим дополнительное поле (TV, Template Variables).  Параметры, которые необходимо проставить новому полю: 
    • Имя: tags;
    • Подпись: Теги;
    • Тип ввода: Авто-метка;
    • На вкладке «доступно для шаблонов» откроем доступ шалонам, в которых должно выводиться данное поле.
  2. Создадим страницу, на которой будут выводится результаты выборки по тегам. Для этого во вкладке со списком ресурсов создадим новый материал с полями: 

    Запомните ID созданного ресурса — он нам еще понадобится.

    • Заголовок: Поиск по тегу;
    • Псевдоним: tag;
    • Поставленными галочками: «Не показывать в меню» и «Опубликован»;
    • На вкладке «Настройки страницы» убираем галочки «Использовать html-редактор», «Доступен для поиска», «Кешируемый»;
    • Заполняем поле содержимого документа (Обратите внимание, вместо getResources можно использовать pdoResources):
      [[!getResources?
        &parents=`1,4,10` 
        &tpl=`tpl.tag-item`      
        &includeTVs=`1` 
        &processTVs=`1` 
        &includeContent=`1`
        &limit=`100`   
        &hideContainers=`1`
        &tvFilters=`tags==%[[GET]]%`  
       ]] 
      Параметры:
      • parents: указываем id ресурсов-папок, материалы которых будут выводиться при поиске;
      • tpl: шаблон вывода ресурсов;
      • includeTVs: включаем обработку TV параметров;
      • processTVs: тоже надо включить, чтобы TV параметры работали;
      • includeContent: указываем, что надо выводить содержимое ресурсов, в противном случае будет выведен массив данных ресурсов (иногда так же является полезным);
      • limit: число документов для отображения, пока поставим 100, чтобы вывести все, потом можно будет выставить необходимое;
      • hideContainers: не будем выводить ресурсы являющиеся папками;
      • tvFilters: фильтр на основе, которого будем решать выводить ресурс или нет.
  3. Создадим чанк tpl.tag-item в котором будет шаблон для вывода элементов. Его примерное содержание:
    <div class="article">
    	<h4><a href="[[+uri]]">[[+pagetitle]]</a></h4>
    	<p>[[+introtext]]</p>
    </div>

​Простейший вывод тегов с помощью сниппета

  1. Создадим снипет обрабатывающий запрос со следующим кодом: Имя сниппета: GET
    <?php 
    
     if (!empty($_GET["tag"])) 
       { 
           echo ($_GET["tag"]); 
       } 
     else { echo ('none'); } 
    
    
  2. Создадим сниппет для вывода тегов в материале (Обратите внимание на то, что вместо 27 в пятой строке надо поставить ID документа созданного для вывода результата): Имя сниппета: put_tags
    <?php 
    
        if ($input == '') { return ''; } // Вывод если TV пустой 
          $tags = explode(',',$input); // Составление массива, по разделителю ',' 
        foreach ($tags as $key =--> $value) 
           { // цикл перебора тегов 
                $output[] = '<a class="tags" rel="nofollow" href="'.$modx->makeurl(120, '', array('tag' => $value)).'" title="'.$value.'"> '.$value.' </a>'; 
                // Добавление выходному массиву элемента 
                // ссылки на ресурс вывода 94 методом GET
           } 
        return implode(', ',$output); // Вывод получившегося массива ссылок
    
    
  3. Вывод тегов в шаблоне:
    [[!put_tags? &input=`[[*tags]]`]]
    
  4. Теперь заходим в статью и заполняем TV поле tags. Для начала надо будет самому вписать нужные теги через запятую, а вот потом в ресурсах появиться возможность выбора тегов из уже использованных

Создание тегов с помощью tagLister

  1. Устанавливаем компонент tagLister;

Список тегов текущего ресурса

Если нужен вывод тегов текущего ресурса, в шаблоне выводим

[[!tolinks? &items=`[[*tags]]` &target=`123`]]

Параметры:

  • &items — Имя или ID TV в котором находятся теги;
  • &target — ID страницы на которой должны выводиться результаты;
  • &tpl — шаблон вывода одного элемента;
  • &inputDelim — разделитель для входящего поля тегов. По умолчанию запятая;
  • &outputDelim — разделитель для вывода тегов. По умолчанию запятая; 
  • &tagRequestParam — ключ запроса REQUEST, который будет использоваться при создании ссылок;
  • &cls — имя CSS класса для добавления к каждому результату;
  • &toPlaceholder — если установлен, все данные вместо вывода будут записаны в плейсхолдер;
  • &tagKey — имя группы тегов, используемое при создании ссылок.

Ссылка на полную документацию

Облако тегов

Для вывода облака всех возможных тегов используем

[[!tagLister? &tv=`tags` &target=`123`]]

Параметры:

  • &tv — Имя или ID TV в котором находятся теги;
  • &target — ID страницы на которой должны выводиться результаты;
  • &tpl — шаблон вывода одного элемента;
  • &toDelim — разделитель для входящего поля тегов. По умолчанию запятая;
  • &all — показывает ссылку «Все теги»;
  • &allTpl — шаблон для ссылки «Все теги».

Шаблон для тегов по умолчанию

<li class="[[+cls]]">
<a href="[[~[[+target]]? &[[+tagVar]]=`[[+tag]]`]]">[[+tag]]</a> ([[+count]])
</li>

Ссылка на полную документацию tagLister

Автопростановка тегов

Для автоматического ввода тегов, в зависимости от раздела, контекста или каких либо еще параметров, надо в дополнительном поле tags, на вкладке параметры ввода, в поле "Значение по умолчанию" подключить сниппет, проставляющий теги. Ниже представлен пример с распределением по разделам родителя:

// в поле значение по умолчанию пишем
@EVAL return $modx->runSnippet('tags_default');
    
// в сниппете tags_default 
$parentIds = $modx->resource->get('parent');

switch ($parentIds) {
    case 1:
        return "tag 1";
        break;
    case 2:
        return "tag 2";
        break;
    case 3:
        return "tag 3";
        break;
}