Предлагаю простенькое решение тегов для тикетов на базе Tickets для MODX Revolution, в котором используется один тег для одного тикета. Она пригодится тем, кому не нужна сложная система тегов.

Настройка укладывается в 5 небольших шагов.

1. Расширяем таблицу ресурсов

Через phpMyAdmin создаем поле tag в таблице modx_site_content

Тип: varchar
Длина: 100

2. Создаем TV

В дереве ресурсов создаем TV с именем tv.tag и типом ввода «Текст» и прикручиваем его к шаблону, который используется для тикетов.

3. Создаем плагин

Создаем плагин с любым именем на события «OnMODXInit» и «OnDocFormSave».

<?php
switch ($modx->event->name) {
    case 'OnMODXInit':
        // Загружаем наше поле в модель ресурса
        $modx->loadClass('modResource');
        $modx->map['modResource']['fields']['tag'] = '';
        $modx->map['modResource']['fieldMeta']['tag'] = array(
            'dbtype' => 'varchar',
            'precision' => 100,
            'phptype' => 'string',
            'null' => false,
            'default' => '',
        );
        break;
    case 'OnDocFormSave':
        // Сохраняем ТВ в поле таблицы ресурса
        $resource->set('tag', $resource->getTVValue('tv.tag'));
        $resource->save();
        break;
}

4. Сниппет для вывода тегов

Теперь создадим сниппет getTags, который будет выводит теги с количеством статей в виде ссылки site.ru/?tag=TagName.

<?php
// При вызове сниппета указываем параметр $parent - секция тикетов, в котором считать тикеты.
$parent = $modx->getOption('parent', $scriptProperties, 0);

$q = $modx->newQuery('modResource');
$q->where(array('parent' => $parent,'published'=>1));
$q->select('tag,count(*) as count');
$q->groupby('tag');
if ($q->prepare() && $q->stmt->execute()) {
    $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
$pls = '';
if (!empty($res)) {
    $pls .= '<ul>';
    foreach($res as $row){
        $url = $modx->makeUrl($parent, '', array('tag' => $row['tag']));
        $pls .= "<li><a href=\"{$url}\"><i class=\"fa fa-tag\"></i> {$row['tag']} ({$row['count']})</a></li>";
    };
    $pls .= '</ul>';
}
return $pls;

Дальше вызываем сниппет на сайдбаре.

// В parent указываем контейнер с тикетами
[[!getTags? &parent=`10`]]

У меня это выглядит это так

5. Выводим тикеты с выбранным тегом

Ну и на последнем шаге нам нужно сделать так, чтобы при клике на тег выводились все тикеты с этим тегом. Делается это через сниппет-обертку getFilteredTickets, который формирует условие where и передает его в сниппет getTickets

<?php
$tag = isset($_GET['tag']) ? $modx->sanitizeString($_GET['tag']) : '';

if ($tag) {
    $where = '{"tag:LIKE":"'.$tag.'"}';
    $scriptProperties = array_merge($scriptProperties,array('where'=>$where));
}

return $modx->runSnippet('getTickets',$scriptProperties);

И теперь нужно указать его в разделе с тикетами в табе «Настройки раздела» (страница с типом ресурса «Раздел с тикетами»), если вы выводите тикеты на этой странице.

[[!pdoPage?
    &element=`getFilteredTickets`
]]

[[!+page.nav]]

Если нужно вывести на произвольной странице, то просто вызываем его как обычно (используем pdoPage для разбивки на страницы)

// Указываем необходимые параметры сниппета getTickets
[[!pdoPage?
    &element=`getFilteredTickets`
    &parents=`5`
]]

[[!+page.nav]]

Получилась простенькая система тегов.

П.С. Несмотря на название этот способ подойдет и для обычных ресурсов.

19 декабря 2015, 18:25   1375     8

Комментарии ()

  1. Tim Yusupov 24 декабря 2015, 08:19 # 0
    Отличное решение! Сергей, а если использовать, к примеру, тип TV Автометка (для удобства) и несколько тегов, через запятую, можно ли их как-то разделить, например с помощью
    $s=implode (", ", $row);
    Не силён в программировании, надо бы подтянуть, конечно… )
    1. Сергей Шлоков 24 декабря 2015, 08:22 # +1
      Спасибо!
      Скоро будет статья про это. Там не обойдешься просто implode.
      1. Tim Yusupov 24 декабря 2015, 08:23 # +1
        Круть!
        p.s. Так задумано, что названия разные?) joxi.ru/V2VKzNYS0KxQQA
        1. Сергей Шлоков 24 декабря 2015, 08:25 # 0
          О_о. Автоматический копипаст. Недоглядел. :) Спасибо.
        2. Tim Yusupov 14 января 2016, 00:04 # 0
          Сергей, ещё не писали статью про несколько тегов к статьям? :)
          1. Сергей Шлоков 14 января 2016, 07:42 # 0
            Ещё нет. Чтобы написать статью, нужно сначала это сделать, а на это пока нет времени. Может в выходные найду пару часиков. Напишу как сделаю.
            1. Tim Yusupov 14 января 2016, 08:28 # 0
              Спасибо!
            2. Сергей Шлоков 21 января 2016, 10:48 # 0
              Статья готова.

        Вы должны авторизоваться, чтобы оставлять комментарии.

        Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.