Как работают хештеги в modx revolution?
У ресурса есть теги (по-суте это ссылки с параметром, значение которого будем искать в ресурсах). Кликаем по тегу, перекидывает на страницу, где срабатывает скрипт по параметру и отдает ресурсы, у которых этот тег присутствует.
- В админке создаю ТВ с типом ввода Тег. В "Параметрах ввода" нужно указать в Тип ввода - Авто-метка.</li>
- У ресурса проставляю теги через запятую, которые подходят по смыслу.</li>
Вывод тегов на странице ресурса
- Создаю сниппет с названием, например tagsOnPage
<?php $r = $modx->getObject('modResource',['id'=>$id]); $tags = explode(',',$r->getTVValue('tags')); $out = ''; foreach($tags as $tag){ $out.= " <a href=\"/tags?t=$tag\">#$tag</a> "; } return $out; - Размещаю его в шаблоне
{ '!tagsOnPage' | snippet}
Вывод ресурсов, в которых упоминается тег на странице /tags
- Если страницы /tags нет, то нужно её создать.
- На странице tags нужно обработать значение параметра t. Конечно, пишем сниппет, который в вернёт список id ресурсов, у которых в TV-tags присутствует пареметры переданный в t
Создаю сниппет tagResourcesList
<?php
// 1. Получаем и очищаем параметр из URL
$tag = isset($_GET['t']) ? trim($_GET['t']) : '';
if (empty($tag)) {
return 'Параметр t не указан';
}
// 2. Получаем объект TV-параметра
$tv = $modx->getObject('modTemplateVar', array('name' => 'tags'));
if (!$tv) {
return 'TV-параметр tags не найден';
}
$tvId = $tv->get('id');
// 3. Формируем базовый запрос
$query = $modx->newQuery('modResource');
$query->select('modResource.id');
$query->where(array(
'published' => true,
'deleted' => false,
));
// 4. Подключаем таблицу
$query->leftJoin('modTemplateVarResource', 'TV', "TV.contentid = modResource.id AND TV.tmplvarid = ");
// 5. Добавляем условие выборки
$query->where(array(
'TV.value:LIKE' => "%%"
));
/*
Если ваши теги разделены запятыми (например, "modx,SEO"),
простой LIKE "%SEO%" найдет и "modx,SEO", и "SEO-продвижение".
Если вам нужно СТРОГОЕ совпадение отдельного тега (чтобы "EO" не находил "SEO"),
закомментируйте блок выше (п.5) и раскомментируйте строку ниже:
*/
// $query->where("FIND_IN_SET({ $modx->quote($tag)}, REPLACE(TV.value, ' ', '')) > 0");
// 6. Выполняем запрос
$resources = $modx->getCollection('modResource', $query);
// 7. Формируем вывод
$output = array();
foreach ($resources as $resource) {
$output[] = $resource->get('id');
}
return !empty($output) ? implode(',', $output) : 'Ресурсы не найдены';
- Вывожу ресурсы тега через созданный сиппет tagResourcesList
{ set $taglist = '!tagResourcesList' | snippet}
{ '!pdoResources' | snippet : [ 'parents' => 1, 'resources'=> $taglist, 'tpl' => 'post, ]}