Теги для Tickets
Предлагаю простенькое решение тегов для тикетов на базе 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]]
Получилась простенькая система тегов.
П.С. Несмотря на название этот способ подойдет и для обычных ресурсов.
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
Не силён в программировании, надо бы подтянуть, конечно… )
Скоро будет статья про это. Там не обойдешься просто implode.
p.s. Так задумано, что названия разные?) joxi.ru/V2VKzNYS0KxQQA