Добавляем теги к ресурсам с помощью Tagger в MODX

Содержание:
  1. Установка Tagger и pdoTools
  2. Компонент Tagger
  3. Создание ресурса "Вывод статей по тегу"
  4. Вывод тегов, прикреплённых к статье
  5. Создание облака тегов
  6. Реализация страницы "Вывод статей по тегу"
  7. Комментарии

В этой статье рассмотрим, как в MODX с помощью дополнения Tagger добавить к ресурсам метки или хэштеги, а также как их использовать для поиска соответствующих ресурсов и создания облака тегов.

Установка Tagger и pdoTools

Для создания тегов к статьям, облака тегов и страницы, которая будет выводить ресурсы в соответствии с переданным ей тегом, будем использовать компоненты Tagger и pdoTools.

Установку необходимых компонентов произведём на странице "Управление пакетами" (Приложения -> Установщик):

  • Tagger - компонент, который добавляет в MODX теги, категории и многое другое.
  • pdoTools - компонент, представляющий собой набор сниппетов, позволяющих решить очень большое количество задач. На этом уроке будем использовать сниппеты pdoResources и pdoPage.

Компонент Tagger

Работу с Tagger начнём с создания группы и тегов в ней. Для этого в верхнем меню нажмем на пункт Приложения и выберем подпункт Tagger. На открывшейся странице перейдём на вкладку Group и создадим новую группу с помощью кнопки "Create a new Group".

MODX Tagger - Создание группы для меток или тегов

Основные поля:

  • name - название группы (tags).
  • description - описание группы (теги к статьям).
  • place - место отображение тегов (in tab - во вкладке).
  • show for templates - для каких шаблонов отображать группу (2 - id шаблона статей).
  • allow blank - определяет, можно ли не указывать теги.
Внимание: Работа с Tagger всегда начинается с создания группы, т.к. теги не могут сами по себе существовать, они должны принадлежать к той или иной группе.

Перейдём на вкладку Tags и создадим теги в группе tags.

MODX Tagger - Создание новой метки или тега

Основные поля:

  • name - имя тега (например, HTML)
  • alias - псевдоним тега (например, html)
  • group - группа (выбираем ранее созданную группу tags)

После этого создадим ещё несколько тегов.

MODX Tagger - Список созданных тегов

Добавим к статьям, имеющим шаблон Пост (id=2), теги. Добавление тегов осуществляется во вкладке Tagger.

MODX Tagger - Добавление меток или хэштегов к ресурсу

Создание ресурса "Вывод статей по тегу"

Создадим ресурс "Вывод статей по тегу" и шаблон, который свяжем с ним. Результат данного действия показан на рисунке. Во вкладке "Настройки" укажем данному ресурсу URI - show-posts. Запомним идентификатор (id) данного ресурса (например, 20).

MODX Tagger - Создание ресурса, который будем использовать для вывода статей по метке

Вывод тегов, прикреплённых к статье

Для вывода тегов, добавленных к статье необходимо открыть шаблон (Пост) и вставить в него вызов сниппета TaggerGetTags:

[[TaggerGetTags?
  &resources=`[[*id]]`
  &rowTpl=`@INLINE <div class="btn-group"><span class="btn btn-primary btn-sm">#</span><a class="btn btn-info btn-sm" href="[[~20]]?tag=[[+alias]]">[[+tag]]</a></div>`
]]

Параметр:

&rowTpl - чанк, который используется для вывода каждого тега.

Плейсхолдеры:

  • [[+alias]] - псевдоним тега.
  • [[+tag]] - имя тега.

Вывод тегов организуем с помощью ссылок, каждая из которых будет иметь следующее значение атрибута href:

[[~20]]?tag=[[+alias]]

где:

  • [[~20]] - URL ресурса "Вывод статей по тегу". Данный ресурс будем использовать для вывода статей, имеющих указанный тег.
  • [[+alias]] - значение передаваемого GET-параметра tag. Данное значение будем использовать в ресурсе [[~20]] для создания запроса к базе данных, выбирающих из неё только записи, имеющие этот тег.
MODX - Вывод тегов на странице ресурса

Создание облака тегов

Для создания облака тегов воспользуемся сниппетом pdoResources. Но перед тем как переходить к выборке, рассмотрим MySQL схему компонента Tagger. Данная схема отображает связь между таблицами (классами) компонента Tagger и modResource.

MODX - Схема Tagger (+таблица modResource)

Из схемы видно, что компонент Tagger состоит из 3 таблиц (классов):

  • TaggerTag - список тегов.
  • TaggerTagResource - связывает modResource и TaggerTag. Т.е. каждая строчка содержит id тега и id ресурса.
  • TaggerGroup - список групп.

Класс modResource приведён для наглядности.

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

[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTag`
  &leftJoin=`{
    "TaggerTagResources": {
    "class": "TaggerTagResource",
    "on": "TaggerTag.id = TaggerTagResources.tag"
    }
  }`
  &select=`{
    "TaggerTag": "*",
    "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
  }`
  &groupby=`TaggerTag.id`
  &sortby=`TaggerTag.tag`
  &sortdir=`ASC`
  &tplWrapper=`@INLINE <div class="panel panel-primary"><div class="panel-heading"><span class="glyphicon glyphicon-tags"></span> Теги</div><div class="panel-body">[[+output]]</div></div>`
  &tpl=`@INLINE <a href="[[~20]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
]]

Вставим вышепредставленный код, например, в правую колонку шаблона Пост.

MODX - Облако тегов

Реализация страницы "Вывод статей по тегу"

Данная страница будет выводить список статей, которые имеют указанный тег. Как Вы уже наверно догадались, получать тег эта страница будет из URL (из GET параметра tag).

Рассмотрим этот момент более подробно. На страницах каждый тег оформлен в виде ссылки, которая имеет в своём составе параметр tag.

Например, тег bootstrap имеет следующий URL:

http://site.ru/show-posts?tag=bootstrap

Следовательно, для того чтобы вывести соответствующие ресурсы необходимо:

  1. Получить значение параметра tag из массива GET.
  2. Создать запрос для выборки необходимых данных.
  3. Указать данному запросу условие (where). Т.е. ограничить выборку только теми записями, которые имеют указанный тег.
  4. Создать чанк для оформления результатов.

Вставим в шаблон "Статьи по тегу" базовый каркас страницы и вызов сниппета pdoPage:

[[!pdoPage?
  &element = `pdoResources`
  &limit=`2`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `chunkTagRow`
]]
[[!+page.nav]]

Чанк chunkTagRow:

<div class="panel panel-default">
  <div class="panel-body">
    <h3 class="h4">[[+pagetitle]]</h3><p>[[+description]]</p>
    <p class="text-right"><a href="[[~[[+id]]]]" class="btn btn-primary" role="button">Читать далее...	</a></p>
  </div>
</div>
MODX - Вывод статей, имеющих соответствующий тег

Комментарии: 326

chillside
chillside

Добрый день! У меня modx 3 - все вроде супер работает, но мне не хватает вывода имени тэга.

На странице поиска по тегу у меня есть alias - но как получить имя? Сниппет showTag о котором тут писали не работает с 3 версией modx - может у кого есть актуальный код? Спасибо!
balocha2001
balocha2001

3 проблемы, которые не смог решить.

1) Как сделать так чтобы показала всех статей на странице вывода статей без выбора самого тега, а то при переходе на страницу, страница пустая ?

2) Фотографии статей не показывает. Как можно исправить ?

PdoPage на странице вывода статей по тег. 
<p>

Чанк newsElement

</p>
3) При создание тега, когда русскими буквами пишешь знак вопроса появляется вместо название тега на русском. Как это можно исправить ?

Денис
Денис

Здравствуйте!

При добавлении нового тега (на русском), при создании тикета, не создается псевдоним (алиас). И ссылка имеет следующий вид (без псевдонима):

https://gubtrk.ru/text?tag=

Можно ли сделать чтобы создавался псевдоним на англ. языке или транслитом? Или может есть другое решение. Записи при этом выводятся корректно по тегам.

Александр Мальцев
Александр Мальцев

Добрый день!

Проверьте, что у вас в MODX используется для транслита в системных настройках.
Денис
Денис

Стоит russian, установлен пакет translit

procesha
procesha

Тоже не поддерживает русский язык. где именно капаться ?

locviBG
locviBG

чуваки, у кого не создаются алиасы на русском , то просто отключите в системных настройках Tags Remove Accents

procesha
procesha

Все нашел как сделать!

Надо было в базе SQL поменять в таблице сравнения latin1-swedish-ci на utf8-general-ci и все стало на свои места и стало все русским и в админке и на сайте! Спасибо!

ivanmaverick
ivanmaverick
Здравствуйте, кто то пробовал подружить Polylang и Tagger?

Создал для каждого языка свою группу из тегов. На стр. с новостью вывел через &groups=`[[++lang:is=`ru`:then=`2`:else=`1`]]`

а как сделать вывод всех новостей на другом языке не знаю, сейчас на укр. версии сайта показывает все равно новости с рус. названием, но ссылка идет на укр. версию.


            [[!pdoPage?
              &element = `pdoResources`
              &loadModels=`tagger`
              &class=`TaggerTagResource`
                &leftJoin=`{
                    "NameTag": {
                      "class": "TaggerTag",
                      "on": "TaggerTagResource.tag = NameTag.id"
                    },
                    "Posts": {
                      "class": "msProduct",
                      "on": "TaggerTagResource.resource = Posts.id"
                    },
                    "Data": {
                      "class": "msProductData",
                      "on": "TaggerTagResource.resource = Data.id"
                    }
                  }`
                  &select=`{
                    "TaggerTagResource": "*",
                    "NameTag": "NameTag.tag, NameTag.alias",
                    "Posts": "Posts.id, Posts.pagetitle, Data.price, Data.image"
                  }`
              &where=`{
                "TaggerTagResource.tag:IN": [2],
                "Posts.published": "1",
                "Posts.deleted": "0"
              }`

              &sortby=`TaggerTagResource.resource`
              &sortdir=`DESC`  
              &tpl= `NewsTPL`
              &includeThumbs=`220x294`
              &includeTVs=`image`
              &limit=`3`
            ]]
mykhaltsov.oleksandr
mykhaltsov.oleksandr
Помогите разобраться.
Все сделал как в статье. Теги выводятся. Вот только у меня вопрос, можно ли на странице шаблона «Поиск по тегам» вывести все ресурсы. Ну, чтоб она пустая не была.
ivanmaverick
ivanmaverick
&where=`{
                    "NameTag.alias": "[[!#GET.tag]]",
                    "Posts.published": "1",
                    "Posts.deleted": "0"
                  }`
Сергей
Сергей
Добрый день. Не могли бы вы помочь? Дело в том что у меня есть страница, на ней есть 2 блока с постами и облако тегов . Посты я вывел кодом:

             [[!+page.nav]]
           [[!pdoPage?
&ajax = `1`
&ajaxMode=`button`
&elementClass=`modSnippet`
&element=`getResources`
&parents=`19410`
&tpl=`tpl.getResources.row`
&limit=`3`
&maxLimit = `100`
&includeTVs=`blog-main-image`
]] 
Дальше, если я пишу в чанке код для облака из вашего примера и пытаюсь их вывести, происходит дублирование постов вместо выдачи тегов.
Подскажите как решить эту проблему
Anna Shishkina
Anna Shishkina
Александр, здравствуйте! Ваш ресурс — самый лучший источник информации, многому научилась, многое получилось также благодаря Комментариям. Большое спасибо!
Долго пытаюсь сообразить — помогите пожалуйста:
На сайте сделана Регистрация с помощью Login. В форме регистрации есть поле «Ваше имя»:
<input type="text" name="fullname" class="form-control" value="[[!+reg.fullname]]">
Также есть поле «Ваш email». Именно поле с е-мейлом становится потом Username. То есть потом авторизация происходит по е-мейлу. А fullname подставляется в имя автора поста или автора комментария.
Также на сайте сделан Блог — на Tickets. И когда выводятся посты, то в качестве Автора поста выводится имя — fullname. Насколько я понимаю, это значение подтягивается из TicketMeta. Вот чанк вывода постов блога на страницу:
<div class="blog-image">
  <a href="[[~[[+id]]]]">
    <img src="[[+blog_img]]" alt="[[+pagetitle]]">
  </a>
</div>
<div class="blog-content">
  <a href="[[~[[+id]]]]" class="blog_meta">[[+date_ago]]</a> 
  <a href="[[~[[+id]]]]" class="blog_meta">[[+fullname]]</a>
  <h4 class="blog-title"><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h4>
  <a href="[[~[[+id]]]]" class="more">Подробнее <i class="fal fa-chevron-right"></i></a>
</div>
Когда же я пытаюсь вывести на аналогичную страницу посты по тэгу, то вместо Имени автора — fullname — выводится его username, то есть е-мейл. Не могу сообразить, как затянуть в вывод Имя автора.
Вот код вывода постов по тэгу:
<h3>Посты по тегу: #[[!showTag? &alias=`[[!#get.tag]]`]]</h3>
<h2 class="h3">Всего результатов: [[+page.total]]</h2>
[[!pdoPage?
  &element = `pdoResources`
  &limit=`8`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Ticket": {
      "class": "Ticket",
      "on": "TaggerTagResource.resource = Ticket.id"
    },
    "User": {
      "class": "modUser",
      "on": "Ticket.publishedby = User.id"
    },
    "TicketTotal": {
      "class": "TicketTotal",
      "on": "TicketTotal.id = Ticket.id"
    },
    "TV1": {
      "class": "modTemplateVarResource",
      "on": "Ticket.id = TV1.contentid and TV1.tmplvarid = 5"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Ticket": "Ticket.id, Ticket.pagetitle, Ticket.description, Ticket.publishedon",
    "User": "User.username as fullname",
    "TV1": "TV1.value as tv1",
    "TicketTotal": "*"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tpl= `tpl.Tickets.cat.blog_tag`
  &tplPageWrapper=`@INLINE <ul class="pagination-items text-center">[[+pages]]</ul>`
]]
Вот tpl.Tickets.cat.blog_tag:
Этот чанк аналогичен первому чанку вывода всех постов блога. Но для вывода даты публикации пришлось поставить не date_ago, а publishedon. Иначе не выводится.
<div class="blog-image">
  <a href="[[~[[+id]]]]">
    <img src="[[+tv1]]" alt="[[+pagetitle]]">
  </a>
</div>
<div class="blog-content">
  <a href="[[~[[+id]]]]" class="blog_meta">[[+publishedon:dateRU]]</a>
  <a href="[[~[[+id]]]]" class="blog_meta">[[+fullname]]</a>
  <h4 class="blog-title"><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h4>
  <a href="[[~[[+id]]]]" class="more">Подробнее <i class="fal fa-chevron-right"></i></a>
</div>
Александр Мальцев
Александр Мальцев
Здравствуйте! Спасибо за отзыв!
fullname находится в modUserProfile. Поэтому код нужно изменить:
...
"UserProfile": {
  "class": "modUserProfile",
  "on": "Ticket.publishedby = UserProfile.id"
},
...
&select=`{
  ...
  "UserProfile": "UserProfile.fullname as fullname",
  ...
}`
...
Anna Shishkina
Anna Shishkina
Александр, огромное спасибо!
Получилось!
Sergey
Sergey
Здравствуйте.
Подскажите пожалуйста, почему не работает такой вызов?
{set $par = $_modx->resource.parent | url}
{set $getTag = $_modx->resource.id | url | replace : $par : ''}

{'!mFilter2' | snippet : [
    'limit' => 18,
    'parents' => 2,
    'element' => 'msProducts',
    'tpls' => 'tpl.product-new-catalog',
    'tplOuter' => 'tpl.catalog-new-filter.outer',
    'tplPageWrapper' => 'tplPageWrapper',
    'tplPageNextEmpty' => '',
    'tplPagePrevEmpty' => '',
    'includeThumbs' => '360x270',
    'includeTVs' => 'new_stock',
    'sort' => 'TaggerTagResource.resource:ASC',

    'pageLinkScheme' => '[[+pageVarKey]]/[[+page]]/',
    'pageVarKey' => 'page',
    'page' => 1,
    'showLog' => 1,

    'loadModels' => 'tagger',
    'class' => 'TaggerTagResource',
    'leftJoin' => '{
            "NameTag": {
                "class": "TaggerTag",
                "on": "TaggerTagResource.tag = NameTag.id"
                },
            "Posts": {
                "class": "msProduct",
                "on": "TaggerTagResource.resource = Posts.id"
            },
            "Data": {
                "class": "msProductData",
                "on": "TaggerTagResource.resource = Data.id"
            }
        }',
    'select' => '{
            "TaggerTagResource": "*",
            "NameTag": "NameTag.tag, NameTag.alias",
            "Posts": "Posts.id, Posts.pagetitle, Data.price, Data.thumb, Data.image"
        }',
    'where' => '{"NameTag.alias" : "'~$getTag~'"}',

    'filters' => 'ms|vendor:vendors, 
                    ms|power,
                    tv|product_volume,
                    tv|product_interface, 
                    tv|product_inch, 
                    tv|product_speed,
                    tv|product_kit,
                    tv|product_memory_frequency,
                    tv|product_memory_speed,
                    tv|product_memory_standard, 
                    tv|product_memory_type',
    'tplFilter.outer.default' => 'tpl.filter.row-catalog-new',
    'tplFilter.row.default' => 'tpl.filter.checkbox-catalog-new'
    
]}
при чем если делать с pdopage все ок отрабатывает
Максим
Максим
Доброго времени суток, а не подскажите реально ли реализовать сортировку по группам? числовые, от A до Z и каждая буква русского алфавита отдельно, по вот такую структуру реализовать бы
<ul>
<ol>
		<li>0-9</li>
		<li><a href="#">11</a></li>
</ol>
<ol>
		<li>a-z</li>
		<li><a href="#">JavaScript</a></li>
</ol>
<ol>
		<li>А</li>
                <li><a href="#">Аб</a></li>
                <li><a href="#">Аывдаорыдва</a></li>
</ol>
<ol>
		<li>Б</li>
                <li><a href="#">Бвфыв</a></li>
                <li><a href="#">Бфыворфы</a></li>
</ol>                

            </ul>
Средствами JS частично такое реализовал, но вот думаю может на Mod`exe проще можно будет сделать?
Спасибо заранее
ANDREY KHILKOV
ANDREY KHILKOV
Добрый день. Возможно вывести на одной странице курсы и статьи с одинаковым тегом? Сейчас получается в двух чанках дублируется содержимое. Первый чанк выводится как и должен, второй дублирует первый. Пробовал второй сделать через pdoResources вместо pdoPage — результат аналогичный.
Первый вывод списка курсов:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`12`
  &parents=`6`
  &depth=`3`
  &pageVarKey=`cources`
  &pageNavVar=`cources.nav`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.template"
  }`
  &where=`{
    "NameTag.alias": "[[*alias]]",
    "Posts.template": 3
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE [[+output]]`
  &processTVs=`1`
  &includeTVs=`mainImage,courseLink,time,price,rating,reviews,shortDescription,students`
  &tplPageFirstEmpty=``
    &tplPageLastEmpty=``
    &tplPageFirst=`@INLINE <li class="control"><a href="[[+href]]">Primero</a></li>`
    &tplPageLast=`@INLINE <li class="control"><a href="[[+href]]">Último</a></li>`
    &tplPagePrev=`@INLINE <li class="control"><a href="[[+href]]"><</a></li>`
    &tplPageNext=`@INLINE <li class="control"><a href="[[+href]]">></a></li>`
  &tpl= `oneCourse-tpl`
]]
<div class="paging">
    <ul class="pageList">
        [[!+page.nav]]
    </ul>
</div>
Статьи:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`12`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &pageVarKey=`articles`
  &pageNavVar=`articles.nav`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.template"
  }`
  &where=`{
    "NameTag.alias": "[[*alias]]",
    "Posts.template": 10
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE [[+output]]`
  &processTVs=`1`
  &includeTVs=`mainImage`
  &tplPageFirstEmpty=``
    &tplPageLastEmpty=``
    &tplPageFirst=`@INLINE <li class="control"><a href="[[+href]]">Primero</a></li>`
    &tplPageLast=`@INLINE <li class="control"><a href="[[+href]]">Último</a></li>`
    &tplPagePrev=`@INLINE <li class="control"><a href="[[+href]]"><</a></li>`
    &tplPageNext=`@INLINE <li class="control"><a href="[[+href]]">></a></li>`
  &tpl= `blogItem-tpl`
]]
<div class="paging">
    <ul class="pageList">
        [[!+page.nav]]
    </ul>
</div>
Спасибо.
Александр Мальцев
Александр Мальцев
Здравствуйте!
Вам нужно объединить условия:
[[!pdoPage?
  ...
  &parents = `0`
  &where=`{
    "NameTag.alias": "[[*alias]]",
    "Posts.template:IN": [3,10]
  }` 
]]
ANDREY KHILKOV
ANDREY KHILKOV
Спасибо, нужно было в разных чанках вывести на одной странице. Получилось один блок вывести через pdoResources и поменять их местами (сначала pdoResources, потом pdoPage). Обычно 2 pdoPage работают с разными pageVarKey, поэтому спросил — может модуль как-то ограничивает это.
zhelanovgrey
zhelanovgrey
Здравствуйте, кто то пробовал подружить Localizator и Tagger?
Нужно выводить перевод по определенному тегу.
Вывод по тегу работает, но правильно подключить Localizator к выводу не удается.
[[!pdoPage?
    &element=`pdoResources`
    &limit=`5`
    &loadModels=`tagger`
    &class=`TaggerTagResource`
    &leftJoin=`{
        "NameTag": {
                "class": "TaggerTag",
                 "on": "TaggerTagResource.tag = NameTag.id"
        },
        "Posts": {
                "class": "modResource",
                "on": "TaggerTagResource.resource = Posts.id"
        },
        "TV1": {
             "class": "modTemplateVarResource",
             "on": "Posts.id = TV1.contentid and TV1.tmplvarid = 3"
        }
    }`
    &select=`{
        "TaggerTagResource": "*",
        "NameTag": "NameTag.tag, NameTag.alias",
        "Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.publishedon, Posts.content",
        "TV1": "TV1.value as tv1"
    }`
    &where=`{
        "NameTag.id": "[[+id]]"
    }`
    &sortby=`publishedon`
    &sortdir=`ASC`
    &tplFirst=`article_horizontal_tpl`
    &tpl=`article_prim_tpl`
]]
Буду рад любым подсказкам
Александр Мальцев
Александр Мальцев
Здравствуйте! Наиболее простой вариант — это просто при создании тегов сохранять в label их названия через || с указанием ключа языка.
Например:
ru=Кухня||en=Kitchen
Затем в приведённом вызове сниппета заменить «NameTag.alias» на «NameTag.label».
Теперь в чанке они будут выводиться в формате через ||.
Далее можно, например, используя Fenom преобразовать это значение в массив, и при переборе найти среди них значение, отвечающее языковой версии и вывести его. Получить ключ текущего языка можно из системного параметра cultureKey. Если Fenom использовать не хочется, то для этого дела можно написать простенький сниппет, который будет разбирать такое значение и в соответствии с текущим ключом языка возвращать соответствующее значение тега.
Игорь
Игорь
Здравствуйте.
Почему может не меняться [[+countTags]]?
Есть страница «Поиск по тегам», где выводятся все теги (вывод полностью по вашим примерам).
Некоторые ресурсы были уничтожены совсем. При этом [[+countTags]] остался таким, как если бы они были.
Теги в категориях блога считаются при этом верно: там выборка по &where=`{«modResource.parent:=»:[[*id]]}`.
Кэш чистил. Вроде всё перепроверил, и не могу понять. Здесь в комментариях ответа не нашёл.

Заранее спасибо за ответ и помощь.
Александр Мальцев
Александр Мальцев
Здравствуйте!
Попробуйте перенести код шаблона в чанк и указать его имя в качестве значения параметра tpl.
Ещё измените плейсхолдер на некэшируемый:
[[!+countTags]]
GoldBird
GoldBird
Почему-то выводит не все теги, например, которые были добавлены при редактировании ресурса не показываются.

Код:

[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTag`
  &innerJoin=`{
    "TaggerTagResources": {
	  "class": "TaggerTagResource",
	  "on": "TaggerTag.id = TaggerTagResources.tag"
    }
  }`
  &select=`{
    "TaggerTag": "*",
	  "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
	}`
  &groupby=`TaggerTag.id`
  &where=`{
      "TaggerTag.group": "1"
    }`
  &sortby=`TaggerTag.tag`
  &sortdir=`ASC`  
  &tplWrapper=`@INLINE <div class="panel panel-primary tags"><div class="panel-body">[[+output]]</div></div>`
  &tpl=`@INLINE <a href="{'tagPage' | config | url}?tag=[[+alias]]" title="[[+tag]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
]]
Стоит только группировка, так как 2 контекста, выше выведен для русского языка.
Maksim
Maksim
Добрый вечер! Сделал все по гайду и многие ответы нашел в отзывах.
Вопросы:
1.На странице вывода по тегу — вывожу теги у каждой статьи, у одной статьи 7 тегов, но выводит 7 одинаковых тегов — как поправить? Так же publishedon не подцепляется.
Чанк для вывода:
               <div class="col-lg-12 col-md-12" >
                    <div class="blog_box">                    
                        <div class="blog_details">
                                    <div class="date">[[+publishedon:date=`%d %B %Y`]]</div>
                                    <h2>
                                        <a href="[[~[[+id]]]]">[[+pagetitle:ellipsis=`50`]]</a>
                                    </h2>
                                    	<p>	 [[TaggerGetTags? &resources=`[[+id]]` &rowTpl=`@INLINE <a href="[[~1046]]?tag=[[+alias]]">[[+tag]]/a>`]]
					</p>	
                                    <p>[[+description:ellipsis=`100`]]</p>
                                    <a class="readmore" href="[[~[[+id]]]]">Подробнее</a>
                         </div>
                    </div>
              </div>
Вывод статей:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`14`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
    &sortdir=`DESC`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]",
    "Posts.published": "1",
    "Posts.deleted": "0"
  }`
  &sortby=`TaggerTagResource.resource`
  &tpl= `blog.tpl.search`
]]

2. Как сделать выбор тегов на странице, например, услуги по TV и чтобы подгружать из этих тегов статьи на страницу?
Александр Мальцев
Александр Мальцев
Привет!
1. Замените вызов сниппета TaggerGetTags на не кэшируемый.
2. Добавьте publishedon в выбираемые поля:
"Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.publishedon"
Maksim
Maksim
Благодарю за ответ!
А такой вопрос:
Как сделать выбор тегов на странице, например, услуги по TV и чтобы подгружать из этих тегов статьи на страницу?
Александр Мальцев
Александр Мальцев
Добавить к запросу с помощью параметра &leftJoin необходимые для выборки TV поля.
Олег
Олег
Здравствуйте, Александр!
Осваивая MODX, нашел вашу статью, создал по инструкции вывод тегов, все классно.
Но есть пара «НО».
Почему-то у меня на странице вывода результатов по тегу не выводится описание (introtext) + не получается вывести изображение статьи из phpThumboff.
Кроме того, ссылка на страницу никак не ЧПУ (
.../show-posts?tag=…
Подскажете где «копать»?
Александр Мальцев
Александр Мальцев
Здравствуйте!
Для подцепления данных из других таблиц нужно при выборке добавить их в запрос через leftJoin. В случае с introtext проверьте наличия данного поля в select.
Для реализации ЧПУ нужно добавить соответствующие правила в конфигурационный файл сервера или реализовывать это посредством создания плагина в MODX и написание в нём определённой логики.
cheizer
cheizer
Подскажите пожалуйста как вывести на странице тега, НАЗВАНИЕ тега а не ПСЕВДОНИМ?

Если нахожусь на странице тега «планируем» вот URL(регуляркой изменен) tag/planiruem

Вывожу на странице «РЕЗУЛЬТАТ ПО ТЕГУ #[[+tag]]» так вообще не выводит название тега.
А вот так «РЕЗУЛЬТАТ ПО ТЕГУ #[[!#GET.tag]]» выводит ALIAS а он на английском и получается
РЕЗУЛЬТАТ ПО ТЕГУ #PLANIRUEM а нужно ПЛАНИРУЕМ, тоесть поле tag нужно, в нем сам тег, но его не выводит на странице :( Как вывести?
cheizer
cheizer
Вроде нашел ответ в других комментариях про #[[+tag]] на странице, но есть другой вопрос, я не могу понять, как вывести все записи по одному тегу без гет параметра??????? Как его указать руками??? И какой сниппет использовать? Памагите!!! :(((
Александр Мальцев
Александр Мальцев
Нужно его указать в where:
&where=`{
  "NameTag.alias": "имя_алиаса"
}`
cheizer
cheizer
Благодарю!
cheizer
cheizer
Подскажите пожалуйста, теперь пытаюсь имя тега вписать не руками, а в цикле подставить в виде переменной, все на FENOM пишу, не пойму, может синтаксис неправильный, цикл работает, распечатывает все как надо, но если я добавляю в цикл вызов снипета, то выводит все записи с одинаковым тегом

Вот как подставляю переменную $row.section в снипете так:
'where' => '{«NameTag.alias»: $row.section}',

Вот целиком, этот вызов в цикле подставляется.
{'!pdoResources' | snippet : [
    'limit' => 1,
	'loadModels' => 'tagger',
	'class' => 'TaggerTagResource',
    'leftJoin' => '{
		 "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    },
    "intronews": {
		"class": "modTemplateVarResource",
		"on": "Posts.id = intronews.contentid and intronews.tmplvarid = 20"
	    },
	"autor": {
		"class": "modTemplateVarResource",
		"on": "Posts.id = autor.contentid and autor.tmplvarid = 19"
	   },
	   "image": {
		"class": "modTemplateVarResource",
		"on": "Posts.id = image.contentid and image.tmplvarid = 1"
	   }
	}',
	'select' => '{
	"TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle",
    "intronews": "intronews.value as intronews",
    "autor": "autor.value as autor",
    "image": "image.value as image"
	}',
	'where' => '{"NameTag.alias" : $row.section}',
	'sortby' => 'createdon',
	'sortdir' => 'desc',
	'tplWrapper' => '@INLINE {$output}'
	'tpl' => 'news_block',
]} 
Вот и не пойму, толи он не видит переменную в цикле, или из за того что я не правильно прописал ее?
'where' => '{«NameTag.alias»: $row.section}',
_Iris_
_Iris_
Здравствуйте, Александр!
Использую компонент Tickets, в том числе с созданием тикетов через фронтенд зарегистрированными пользователями.
Вы не сталкивались случайно с такой задачей как вывод на странице галереи изображений из TicketFile?
Не могу разобраться как это сделать, если используется Fenom.
Есть такой пример:
[[pdoResources:default=`/path/заглушка.png`? &class=`TicketFile` &where=`{"parent":[[*id]]}`  &sortby=`createdon`  &sortdir=`ASC`  &limit=`1`  &tpl=`@INLINE [[+url]]`]]
Но здесь выводится только одно изображение и не используется Fenom
_Iris_
_Iris_
Для вывода изображений использую
{'!pdoResources' | snippet:[
					'class'=>'TicketFile',
					'where'=>'{ "parent":[[*id]] }',
					'sortby'=>'createdon',
					'sortdir'=>'ASC',
					'tpl'=>'tpl.image' 
				]}
Но не получается доработать код чанка tpl.image:
<div class="big-gallery owl-carousel">									
{set $where = array('deleted' => 0, 'class' => 'Ticket', 'parent' => $ticket->id) }
{set $collection = $pdoFetch->getCollection('TicketFile', $where, array('sortby' => 'createdon', 'sortdir' => 'ASC') ) }
{foreach $collection as $item}
	<div class="item">
		<a href="{$item['url']}" rel="gallery" class="fancybox" data-fancybox="gal">
		<img src="{$item['url']}"></a>
	</div>
{/foreach}
</div>
Александр Мальцев
Александр Мальцев
Здравствуйте! Комментарий, добавленный к этой теме не соответствует ей. Если не знаете куда написать, то лучше создать новый вопрос.
Вывести изображения прикреплённые к тикету на Fenom можно так:
{'!pdoResources' | snippet:[
  'class' => 'TicketFile',
  'where' => ['parent' => $_modx->resource.id],
  'sortby' => 'createdon',
  'sortdir' => 'ASC',
  'tpl' => '@INLINE <li><a href="{$url}">{$name}</a></li>',
  'showLog' => 1
]}
_Iris_
_Iris_
Здравствуйте! Да, тема не соответствует, сначала показалось, что близкая. А удалить комментарий потом не получилось.
Спасибо большое за ответ! Как раз правильно задать параметр where И не получалось)
А решение нашлось такое, через сниппет:
<?php
$idx = $modx->resource->get('id');
$pdo = $modx->getService('pdoFetch');
$pdo->setConfig(array(
    'class' => 'TicketFile',
    'loadModels' => 'tickets'
));
$resources = $pdo->getCollection('TicketFile', array(
    'deleted' => false,
    'class' => 'Ticket',
     'parent' => $idx,
), array(
     'sortby' => 'TicketFile.id',
      )
    );
$tpl = '@INLINE <div class="item"><a href="{$url}" title="{$title}" rel="gallery" class="fancybox" data-fancybox="gal"><img src="{$url}" alt="{$_modx->resource.pagetitle | htmlent}" title="{$pagetitle | htmlent}" itemprop="image"></a></div>';
$output = '';
foreach ($resources as $resource) {
    $output .= $pdo->getChunk($tpl, $resource);
}
return $output;
И далее вызываем сниппет в нужной части. Только наверное правильнее назвать это слайдером из подгружаемых изображений, а не галереей.
Илья
Илья
Подскажите, а возможно к данным страницам добавить мета-тег «description».
Заранее спасибо!
Александр Мальцев
Александр Мальцев
Можно! Посмотрите как у вас это выполнено и добавьте его через &leftJoin.
Александр
Александр
Александр, огромное спасибо за урок. Не могли бы Вы помочь в таком моменте, сделал все по аналогии с Вашим примером, все работает, но не все элементы содержат теги, можно ли при загрузке страницы выводить все элементы, и с тегами и без, а если кликать по облаку, то те, что к нему относятся. За ранее спасибо. Код использую вот такой
[[!pdoPage?
  &element=`pdoResources`        
  &limit=`4`        
  &loadModels=`tagger` 
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
      "NameTag": "NameTag.tag, NameTag.alias",
      "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`               
  &tpl=`info-tpl`
  &parents=`5`
  &includeTVs=`video`  
  &tplPageWrapper=`@INLINE <nav aria-label=""><ul class="pagination justify-content-center align-items-center">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></nav>`
]]
Александр Мальцев
Александр Мальцев
Самый простой вариант — это использовать модификатор вывода. Т.е. когда нет get-параметра tag вызывать сниппет pdoPage без блока where, а когда есть, то с where.
Например:
[[!#GET.tag:is=``:then=`
  [[!pdoPage?
    ...
  ]]
`:else=`
  [[!pdoPage?
    ...
    &where=`{
      "NameTag.alias": "[[!#GET.tag]]"
    }`
    ...
  ]]
`]]
Александр
Александр
Спасибо огромное, Александр.
Александр
Александр
Помогите пожалуйста, может кто сталкивался с такой ситуацией, Воспользовался советом Александра, и сделал вывод с условием (что бы при загрузке страницы выводились все новости, если нажать на тег, то только новости по тегу), но при такой реализации почему то пропадает вывод пагинации страниц, т.е. не выводиться навигация пагинации, причем если условие убрать и оставить какой то один вариант, то все работает нормально. Код использую слудующий:


[[!pdoResources?
&loadModels=`tagger`
&class=`TaggerTag`
&leftJoin=`{
«TaggerTagResources»: {
«class»: «TaggerTagResource»,
«on»: «TaggerTag.id = TaggerTagResources.tag»
}
}`
&select=`{
«TaggerTag»: "*",
«TaggerTagResources»: «COUNT(TaggerTagResources.tag) as countTags»
}`
&groupby=`TaggerTag.id`
&sortby=`TaggerTag.tag`
&sortdir=`ASC`
&tplWrapper=`@INLINE
[[+output]]
`
&tpl=`@INLINE
[[+tag]]
[[+countTags]]
`
]]

[[!#GET.tag:is=``:then=`
[[!pdoPage?
&element=`pdoResources`
&tpl=`info-tpl`
&limit=`10`
&parents=`[[*context_key:is=`web`:then=`5`:else=`[[BabelTranslation:default=`5`? &resourceId=`5` &contextKey=`eng`]]`]]`
&sortby=`publishedon`
&sortdir=`DESC`
&includeContent=`1`
&includeTVs=`video`
&tplPageWrapper=`@INLINE
    [[+first]][[+prev]][[+pages]][[+next]][[+last]]
</nav`
]]
`:else=`
[[!pdoPage?
&element=`pdoResources`
&limit=`6`
&loadModels=`tagger`
&class=`TaggerTagResource`
&leftJoin=`{
«NameTag»: {
«class»: «TaggerTag»,
«on»: «TaggerTagResource.tag = NameTag.id»
},
«Posts»: {
«class»: «modResource»,
«on»: «TaggerTagResource.resource = Posts.id»
}
}`
&select=`{
«TaggerTagResource»: "*",
«NameTag»: «NameTag.tag, NameTag.alias»,
«Posts»: «Posts.id, Posts.pagetitle, Posts.description»
}`
&where=`{
«NameTag.alias»: "[[!#GET.tag]]"
}`
&sortby=`TaggerTagResource.resource`
&sortdir=`ASC`
&tpl=`info-tpl`
&parents=`[[*context_key:is=`web`:then=`5`:else=`[[BabelTranslation:default=`5`? &resourceId=`5` &contextKey=`eng`]]`]]`
&includeTVs=`video`
&tplPageWrapper=`@INLINE
    [[+first]][[+prev]][[+pages]][[+next]][[+last]]
</nav`
]]
`]]


[[!+page.nav]]
Александр Мальцев
Александр Мальцев
Попробуйте переписать этот код на Fenom.
Вадим
Вадим
Хороший урок, с modx не дружу и возник такой вопрос.
Как на странице категории, вывести теги товаров данной категории?
Заранее спасибо
Александр Мальцев
Александр Мальцев
Спасибо! А зачем тогда используете, если вы с MODX не дружите )
Для этого необходимо просто добавить условие:
[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTag`
  &leftJoin=`{
    "TaggerTagResources": {
	  "class": "TaggerTagResource",
	  "on": "TaggerTag.id = TaggerTagResources.tag"
    },
    "modResource": {
	  "class": "modResource",
	  "on": "TaggerTagResources.resource = modResource.id"
    }
  }`
  &select=`{
    "TaggerTag": "*", "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
	}`
  &where=`{"modResource.parent:=":[[*id]]}`
  &groupby=`TaggerTag.id`
  &sortby=`TaggerTag.tag`
  &sortdir=`ASC`  
  &tplWrapper=`@INLINE <div class="panel panel-primary"><div class="panel-heading"><span class="glyphicon glyphicon-tags"></span> Теги</div><div class="panel-body">[[+output]]</div></div>`
  &tpl=`@INLINE <a href="[[~20]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
]]
Вадим
Вадим
Сайт перешел по наследству.
Вставил ваш код, в итоге он выводит все товары категории (если в категории есть товар с тегом). А необходимо вывести теги товаров из этой категории.
Александр Мальцев
Александр Мальцев
Нет, он выводит теги, какие есть у товаров в этой категории. Вместе с тегом выводится цифра, показывающая какое количество тегов, имеются в данной категории у товаров. Посмотрите, может что-то не так сделали.
Вадим
Вадим
Спасибо, конфликтовало с &tplWrapper, убрал, и теги вывелись.
Анатолий
Анатолий
Добрый день! Вот уже два дня бьюсь как мне кажется над тривиальной задачей)
Есть несколько категорий тегов (групп тегов), например Цвет (белый, синий, красный), Размер (большой, малый) и т.д.
Как подключить эти группы в leftJoin pdoResources чтобы их вывести по группам с заголовками?
Родные параметры &rowTpl, &outTpl, [[+group_name]] тут не работают, я правильно понимаю что их как-то нужно добавить в выборку? Уже думал вызвать pdoResources 3 раза и в каждом указать свою группу, но &groups тоже не работает, выводятся все теги из всех групп подряд.
[[!pdoResources?
              &loadModels=`tagger`
              &class=`TaggerTag`
              &leftJoin=`{
                "TaggerTagResources": {
            	  "class": "TaggerTagResource",
            	  "on": "TaggerTag.id = TaggerTagResources.tag"
                }
              }`
              &select=`{
                "TaggerTag": "*",
            	  "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
            	}`
              &groupby=`TaggerTag.id`
              &sortby=`TaggerTag.group`
              &sortdir=`ASC`
              &tplWrapper=`@INLINE Теги[[+group_name]]<div class="panel-body">[[+output]]</div>`
              &tpl=`@INLINE <a href="[[~56]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
            ]]
Александр Мальцев
Александр Мальцев
Привет!
Это можно решить через сниппет:
<?php
$modx->addPackage('tagger', MODX_CORE_PATH . 'components/tagger/model/');
$query = $modx->newQuery('TaggerGroup');
$query->select('TaggerGroup.id as id, TaggerGroup.alias as alias');
$query->sortby('TaggerGroup.alias','ASC');
$query->prepare();
$query->stmt->execute();
$rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
$output = '';
foreach ($rows as $row) {
  $output_inner = '';
  $query_inner = $modx->newQuery('TaggerTag');
  $query_inner->leftJoin('TaggerTagResource','Resources');
  $query_inner->select('TaggerTag.tag as tag, TaggerTag.alias as alias, COUNT(Resources.tag) as countTags');
  $query_inner->groupby('TaggerTag.id');
  $query_inner->sortby('TaggerTag.tag','ASC');
  $query_inner->where(array('TaggerTag.group' => $row['id']));
  $query_inner->prepare();
  $query_inner->stmt->execute();
  $rows_inner = $query_inner->stmt->fetchAll(PDO::FETCH_ASSOC);
  foreach ($rows_inner as $row_inner) {
    $output_inner .= $modx->getChunk('tpl.Tagger.tag.row',array(
      'tag' => $row_inner['tag'],
      'alias' => $row_inner['alias'],
      'countTags' => $row_inner['countTags']
    ));
  }
  $output .= $modx->getChunk('tpl.Tagger.group.row',array(
    'output_inner' => $output_inner,
    'alias' => $row['alias'],
    'id' => $row['id']
  ));
}

return $output;
Чанк tpl.Tagger.group.row:
<div>Название группы тегов: [[+alias]]</div>
[[+output_inner]]
Чанк tpl.Tagger.tag.row:
<a href="[[~56]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>
Анатолий
Анатолий
Саша, шикарно работает, благодарю!
Только заменил
$query->select('TaggerGroup.id as id, TaggerGroup.alias as alias');
$query->sortby('TaggerGroup.alias','ASC');
на:
$query->select('TaggerGroup.id as id, TaggerGroup.name as alias');
$query->sortby('TaggerGroup.name','ASC');
чтобы выводились именно названия групп)
Так получается родные сниппеты taggera не могут решать подобные задачи?
Приходится писать свой сниппет?
Александр Мальцев
Александр Мальцев
Родные сниппеты это не позволяют сделать. Тут только писать что-то самому.
К тому же свой сниппет, предназначенный для конкретной задачи будет намного быстрее работать, т.к. он заточен именно под неё, а не представляет собой универсальное решение.
Александр
Александр
Помогите разобраться.
Вместо /tag.html?tag=[[+alias]] выводится ссылка /tag.html?tag=statya-1 (statya-1 это url текущей статьи, к которой относятся тэги)

Код такой:
        <ul>
[[!pdoPage?
&parents=`12`
&depth=`0`
&tpl=`TplStatia`
&sortdir=`ASC`
&limit=`2`
&includeContent=`1`
&tplPageWrapper=`@INLINE <div class="pagination"><div class="container"><ul>[[+pages]]</ul></div></div>`
&tplPage=`@INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li>`
&tplPageActive=`@INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li>`
]]
        </ul>
    </div>
</div>
[[!+page.nav]]
Чанк такой:
<li>
<h3><a href="[[+uri]]">[[+pagetitle]]</a></h3>
[[+content:ellipsis=`300`]]
<div class="article_cell_info">
    <span>[[+publishedon:date=`%d.%m.%Y`]]</span>
[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTag`
  &leftJoin=`{
    "TaggerTagResources": {
	  "class": "TaggerTagResource",
	  "on": "TaggerTag.id = TaggerTagResources.tag"
    }
  }`
  &select=`{
    "TaggerTag": "*"
	}`
  &groupby=`TaggerTag.id`
  &sortby=`TaggerTag.tag`
  &sortdir=`ASC`  
  &tplWrapper=`@INLINE <div class="tags">[[+output]]</div>`
  &tpl=`@INLINE <a href="[[~14]]?tag=[[+alias]]">[[+tag]]</a>`
]]
</div>
</li>
Александр
Александр
Переделал чанк так, тоже не помогает:
<li>
<h3><a href="[[+uri]]">[[+pagetitle]]</a></h3>
[[+content:ellipsis=`300`]]
<div class="article_cell_info">
    <span>[[+publishedon:date=`%d.%m.%Y`]]</span>
<div class="tags">
[[TaggerGetTags?
  &resources=`[[+id]]`
  &rowTpl=`@INLINE <a href="[[~14]]?tag=[[+alias]]">[[+tag]]</a>`
]]
</div>
</div>
</li>
Александр Мальцев
Александр Мальцев
Для производительности лучше конечно сразу выбрать данные и не помещать сниппет в чанк.
У ресурса тоже есть alias. В этом случае нужно установить плейсхолдеру другое имя:
&select=`{
  "TaggerTag": "TaggerTag.alias as tagalias, TaggerTag.tag as tag"
}`
&tpl=`@INLINE <a href="[[~14]]?tag=[[+tagalias]]">[[+tag]]</a>`
Можно поступить по другому, в сниппете, где выбираете поля ресурса, укажите в параметре select только те, которые нужны.
Александр
Александр
Что-то все равно не работает. Всем статьям выводит одни и те же теги, даже если у статьи вообще нет тегов.
Александр
Александр
Как здесь переопределить?
[[TaggerGetTags?
&resources=`[[+id]]`
&rowTpl=`@INLINE <a href="[[~14]]?tag=[[+alias]]">[[+tag]]</a>`
]]
Александр Мальцев
Александр Мальцев
Чтобы не было проблем лучше всё писать на Fenom:
{'!TaggerGetTags' | snippet : [
  'resources' => $id,
  'rowTpl' => '@INLINE <a href="{$_modx->makeUrl(14)}?tag={$alias}">{$tag}</a>'
]}  
Amsterdam
Amsterdam
Не могу понять, почему на странице с результатами, облако тегов не выводится?
Amsterdam
Amsterdam
PS При этом, если убрать вывод результатов, то теги в сайдбаре начинают выводиться. Что за конфликт получается. Подскажите пожалуйста?
Amsterdam
Amsterdam
Методом проб, удалось выяснить, что облако тегов на странице результатов не выводит, если вывод идет через pdoPage. Если поменять на pdoResources, то облако появляется. Не могу понять взаимосвязь…
Александр Мальцев
Александр Мальцев
С pdoPage тоже должно выводиться. Может что-то не так настроили… Если у вас на странице несколько pdoPage, то их необходимо соответственно настроить…
Amsterdam
Amsterdam
Нет, вывод pdoPage был только один. Так и не смог понять, в чем дело. Может быть позже дойдет, отпишусь здесь…

И попутно возник такой вопрос — не использовали ли вы для вывода превьюшек к статьям каталога ресурсов Asset Manager в качестве галереи? Не получается пока его заинклюдить. Непосредственно в tpl чанке pdoResources выводом через сниппет getPageAssets картинка выводится, но это конечно не слишком хороший вариант
Amsterdam
Amsterdam
Amsterdam
Amsterdam
Вывод сейчас такой:

{$_modx->runSnippet('pdoResources', [
    'parents' => 4,
    'limit' => 0,
    'tpl' => 'faceResults',
    'tplWrapper' => '@INLINE <div class="vp-portfolio__items-wrap">{$output}</div>'
])}
а уже в чанке faceResults обработка и вытягивание картинок:

[[getPageAssets? 
 &page_id=`[[+id]]` 
 &limit=`1` 
 &outerTpl=`[[+content]]` 
 &innerTpl=`<img src="[[+Asset.url]]" alt="">`
 ]]
Александр Мальцев
Александр Мальцев
Его не получится присоединить, т.к. дополнение «Asset Manager» создаёт таблицы в БД без префикса. Необходимо либо ждать когда пофиксят компонент, либо писать свой сниппет для этого дела.
Amsterdam
Amsterdam
Понял. Спасибо, Александр. Чрезвычайно жаль. Компонент весьма хороший. В качестве галереи подходит прекрасно. Присутствует drag n drop, фото сортируются перетаскиванием, есть поля для alt и title. Единственное, пока нет пагинации в админке, если фото много, то становится не слишком удобно. Но по сути пустяк.

Самое обидное, что, получается, нет возможности заинключидь. Подтолкнуть бы автора к этой доработке. К сожалению, не знаю английский достаточно хорошо, что бы адекватно написать об этом
Александр Мальцев
Александр Мальцев
Стоит попробовать. Для этого можно воспользоваться переводчиком (например, Google Translate). Написать текст на русском, а затем его перевести на английский.
Михаил
Михаил
Добрый вечер. Бьюсь уже часов 5 не могу вывести на новом сайте текстовое превью статей на главной.
[[pdoResources?
  &parents=`4`
  &limit=`3`
  &includeContent=`1`
  &includeTVs=`images`
  &tpl=`main_news`
]]
Чанк:
<div class="one-third columns">
  <div class="blog-item">
    <div class="image"><img src="[[+tv.images:phpthumbof=`w=350&h=236&zc=1`]]" alt="" /></div>
    <div class="date-position">
      <div class="title"><a href="[[~[[+id]]]]">[[+pagetitle]]</a></div>
      <div class="date"><i class="fa fa-calendar"></i> <span>[[+publishedon:date=`%d.%m.%Y`]]</span></div>
    </div>
    <div class="hr-line"></div>
    <div class="content-box">
      <div class="description">[[+introtext]]</div>
      <div class="readmore"><a href="[[~[[+id]]]]"><i class="fa fa-genderless"></i><i class="fa fa-genderless"></i><i class="fa fa-genderless"></i>
        </a></div>
    </div>
  </div>
</div>
[[+introtext]] — этот плейс не срабатывает и на старых сайтах я заметил частично исчезли превьюшки.
Max V.
Max V.
Добрый день. Ещё вот такой вопрос.
Сделал человекоподобные юрл через .htaccess (типа, как здесь — itchief.ru/lessons/modx-revo/modx-tag-cloud#comment-1350), но столкнулся со следующей проблемой.
По неправильным ссылкам, типа сайт.ру/tags/ и сайт.ру/tags/любые_буквы показывает — «Всего результатов: 0».
Как сделать так, что бы отдавало ошибку 404? Не хочется на сайте дубли плодить.
Александр Мальцев
Александр Мальцев
Добрый! Можно создать плагин, который будет отслеживать событие OnWebPageInit. В данном плагине проверять страницу, количество результатов. И если результатов 0, то выдавать ошибку 404 с помощью $modx->sendErrorPage().
Борис
Борис
Александр привет, помогите с реализацией!
Никак не получается вывести изображение в tv на странице статей по тегам, которые реализованы Tagger'ом. А сами статьи работают через Tickets.
Делал вывод тегов по этой вашей статье, все получилось, но картинку не получается вывести, точнее она выводится, но в таком виде:
<img src="picture.jpg">
То есть начало урла не подставляется.

В шаблоне статей по тегам вывожу таким образом:
[[!pdoPage?
	&element = `pdoResources`
	&limit=`2`
	&loadModels=`tagger`
	&class=`TaggerTagResource`
	&leftJoin=`{
	"NameTag": {
	"class": "TaggerTag",
	"on": "TaggerTagResource.tag = NameTag.id"
	},
	"Posts": {
	"class": "modResource",
	"on": "TaggerTagResource.resource = Posts.id"
	},
	"TV1": {
	"class": "modTemplateVarResource",
	"on": "Posts.id = TV1.contentid and TV1.tmplvarid = 1"
	}
	}`
	&select=`{
	"TaggerTagResource": "*",
	"NameTag": "NameTag.tag, NameTag.alias",
	"Posts": "Posts.id, Posts.pagetitle, Posts.introtext, Posts.publishedon",
	"TV1": "TV1.value as tv1"
	}`
	&where=`{
	"NameTag.alias": "[[!#GET.tag]]",
	"Posts.published": "1"
	}`
	&sortby=`TaggerTagResource.resource`
	&sortdir=`ASC`  
	&tplWrapper =`@INLINE <h2 class="sayit_element_heading sayit_view_type_1">Всего результатов: [[+page.total]]</h2>[[+output]]`
	&tpl= `tag.tpl`
]]
Чанк tag.tpl такой:
<div class="panel panel-default">
  <div class="panel-body">
    <h3 class="h4">[[+pagetitle]]</h3>
	<p>[[+introtext]]</p>
	<p>[[+publishedon:date=`%d %b %Y`]]</p>
    <p class="text-right"><a href="[[~[[+id]]]]" class="btn btn-primary" role="button">Читать далее...	</a></p>
	<img src="[[+tv1]]">
  </div>
</div>
Что не так делаю, подскажите пожалуйста!
Александр Мальцев
Александр Мальцев
Если в TV поле хранятся только имена файлов изображений, то можно просто добавить путь до них:
<img src="assets/path_to/[[+tv1]]">
Борис
Борис
Ну так я пробовал делать, но у меня некоторые статьи без фоток превьюшек, а ещё я бы хотел эти превьюшки уменьшать к примеру через phpthumbon, потому что я на странице с выводом всех статей, вывожу превью как раз уменьшенной копии, хотел так же делать и на странице статей по тегам!
Борис
Борис
Написал в итоге условие которое в зависимости есть или нет картинки у поста, выводит нужную, ну и ресайзит снипетом, а урл подставлять пришлось, другого выхода не нашел:
{if $_pls['tv1']}
	  <div class="col col-3 sayit_blog_item_fimage_cont sayit_js_bg_image" data-src="[[!phpthumbon? &input=`[[++assets_url]]images/tickets/[[+tv1]]` &options=`w=164&h=164&zc=1&q=96`]]"></div>
	  {else}
	  <div class="col col-3 sayit_blog_item_fimage_cont sayit_js_bg_image" data-src="[[++assets_url]]tpl/img/clipart/places/hashtag.jpg" style="height:164px;"></div>
	  {/if}
Александр Мальцев
Александр Мальцев
У TV поля есть такая настройка как источники файлов. Попробуйте установить в этой настройке правильное значение источника файлов. Это настройка должна добавлять к адресу картинки путь до него.
Борис
Борис
Да это понятно, я источник файлов настроил специально отдельный под тикеты, и там пути прописаны у меня корректные типа от assets/…
Александр Мальцев
Александр Мальцев
Значит, он их не подхватывает. В этом случае можно написать свой сниппет, результаты которого уже разбивать на страницы с помощью pdoPage.
Михаил
Михаил
Спасибо за статью. Ваши уроки самые внятные в рунете.
Вы не могли бы подсказать как на странице вывода результатов выводились новости с картинками? Уже несколько раз и чанк с одиночным выводом новости проверил, в обычном пдо выводе с картинками выходит, а через теги без.
Max V.
Max V.
Добавьте в pdoPage:
&processTVs=`1`
&includeTVs=`tv_изображения`
Борис
Борис
Да нет же, тут в коментах ниже Александр же писал о том, что tv не будут работать через класс TaggerTagResource, так как у этого класа нет никаких TV, поэтому нужно джойтить и выводить так к примеру:
&class=`TaggerTagResource`
&leftJoin=`{
"NameTag": {
"class": "TaggerTag",
"on": "TaggerTagResource.tag = NameTag.id"
},
"Posts": {
"class": "modResource",
"on": "TaggerTagResource.resource = Posts.id"
},
"TV1": {
"class": "modTemplateVarResource",
"on": "Posts.id = TV1.contentid and TV1.tmplvarid = 1"
}
}`
&select=`{
"TaggerTagResource": "*",
"NameTag": "NameTag.tag, NameTag.alias",
"Posts": "Posts.id, Posts.pagetitle, Posts.introtext, Posts.publishedon",
"TV1": "TV1.value as tv1"
}`
Max V.
Max V.
Здравствуйте!
Подскажите, а возможен вывод [[+countTags]] в отдельной статье, через TaggerGetTags?
Что-то типа:
[[TaggerGetTags?
&resources=`[[*id]]`
&rowTpl=`@INLINE <div class="btn-group"><span class="btn btn-primary btn-sm">[[+countTags]]</span><a class="btn btn-info btn-sm" href="[[~20]]?tag=[[+alias]]">[[+tag]]</a></div>`
]]
Александр Мальцев
Александр Мальцев
Здравствуйте!
Укажите в параметре &resources необходимый идентификатор статьи.
&resources=`5`
Max V.
Max V.
Вы меня не поняли)
Задача просто вывести счётчик тэгов [[+countTags]] на страницах ресурсов (а не в ленте или сайдбаре). Вывожу через сниппет TaggerGetTags (код привёл выше) — счётчик не отображается.
Дмитрий
Дмитрий
Добрый день, подскажите пожалуйста можно ли реализовать 2 таких момента:
синтегрировать с формой поиска по сайту (напр. simplesearch) что бы при вводе поискового запроса в форму, подтянулись не только страницы с этим словом но и с тегами.
И можно ли вывести автоматически через pdoTools группировку: все группы тегов+список тегов к группам?
Александр Мальцев
Александр Мальцев
Добрый! В simplesearch есть параметр customPackages, который позволяет включить поиск по таблицам. Но готового решения нет. Нужно попробовать настроить этот параметр.
Да, с помощью pdoTools можно вывести группы и список тегов к каждой из них.
Дмитрий
Дмитрий
Спасибо, все получилось, только проблема есть не хочет выводить TV картинку, вывожу так:
<div id="pdopage" class="aligncenter">
  [[!+page.nav]]
  <div class="rows aligncenter category-rows">
[[!pdoPage?
  &element = `pdoResources`
  &parents=`18`
  &limit=`10`
  &loadModels=`tagger,simplerating`
  &class=`TaggerTagResource`
  &leftJoin=`{ 
    "NameTag": { "class": "TaggerTag", "on": "TaggerTagResource.tag = NameTag.id" },
    "Posts": { "class": "modResource", "on": "TaggerTagResource.resource = Posts.id" },
    "SimpleRating": { "class":"SimpleRating", "on": "Posts.id = SimpleRating.resource" },
    "TV": { "class": "modTemplateVarResource", "on": "TaggerTagResource.resource = TV.contentid and TV.tmplvarid = 3" } }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.introtext",
    "SimpleRating":"rating_value,rating_count",
    "TV": "TV.value as image"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &includeTVs=`image`
  &sortdir=`ASC`  
  &tpl= `product-card-tpl`
  &ajaxMode=`scroll`
]]
</div>
</div>
содержимое product-card-tpl:
<div class="product-list">
    <div class="product-card-title">
            <a href="[[~16]]?id=[[+id]]">[[+pagetitle]]</a>
        <p>Рейтинг посетителей:</p> 
        <div class="rating zoom_07">
        <div class="rating__best">
          <div class="rating__current" data-id="[[+id]]" style="display: block; width: [[+rating_value:mpy=`130`:div=`5`]]px;"></div>
          <div class="rating__star rating__star_5" data-title="5"></div>
          <div class="rating__star rating__star_4" data-title="4"></div>
          <div class="rating__star rating__star_3" data-title="3"></div>
          <div class="rating__star rating__star_2" data-title="2"></div>
          <div class="rating__star rating__star_1" data-title="1"></div>
        </div>
        </div>
    </div>
<div class="product-card-body">
    <div>
        <p>[[+introtext:ellipsis=`450`]]</p>
    </div>
    <div class="product-card-right">
            <a href="[[~16]]?id=[[+id]]"><img src="[[+tv.image:default=`[[+tv.image2]]`:phpthumbon=`w=150&q=80`]]" alt=""></a>
        
            <div class="btn-group"><a class="btn btn-info btn-sm product-card-btn" href="[[~16]]?id=[[+id]]">ОФОРМИТЬ</a></div>
            
        <a href="[[~[[+id]]]]" class="portfolio-button">Подробнее</a>
    </div>
</div>
</div>
Пробовал вариант строки
"TV": {    "class": "modTemplateVarResource", "on": "TV.contentid = Ticket.id AND TV.tmplvarid = 6" }
Александр Мальцев
Александр Мальцев
Вы же TV значения поля выбираете так:
TV.value as image
А в чанке обращаетесь вот так tv.image:
[[+tv.image:default=`[[+tv.image2]]`:phpthumbon=`w=150&q=80`]]
Т.е. вам необходимо:
[[+image:default=`[[+tv.image2]]`:phpthumbon=`w=150&q=80`]]
Параметр &includeTVs использовать не нужно, вы это сделали самостоятельно с помощью &leftJoin.
Влад
Влад
Здравствуйте Александр!
Я в тупике, помогите пожалуйста разобраться…

Оформляю каталог, состоящий их карточек товаров. Вывожу ресурсы с помощью pdoPage.
В товаре используются 2 плагина: tagger и simplerating (как и в примере выше)

[[!pdoPage?
    &parents=`[[*id]]`
    &element = `pdoResources`
    &limit=`9`
    &tpl=`product-item`
    &ajaxMode=`scroll`
    &ajaxElemWrapper=`#products`
    &ajaxElemRows=`#products .rows`
    &ajaxElemPagination=`#products .pagination`
    &ajaxElemLink=`#products .pagination a`
    &frontend_css=`0`
    &processTVs=`1`
    &includeTVs=`product-image`
    &loadModels=`tagger, simplerating`
    &class=`TaggerTagResource`
    &leftJoin=`{ 
       "NameTag": {
          "class": "TaggerTag",
          "on": "TaggerTagResource.tag = NameTag.id" 
       },
          "Posts": {
          "class": "modResource", 
          "on": "TaggerTagResource.resource = Posts.id" 
       },
       "SimpleRating": {
           "class":"SimpleRating", 
          "on": "Posts.id = SimpleRating.resource" 
       }
    }`
    &select=`{
       "TaggerTagResource": "*",
       "NameTag": "NameTag.tag, NameTag.alias",
       "Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.introtext",
       "SimpleRating":"rating_value, rating_count"
    }`
]]
Таким образом формируется каталог и на первый взгляд все работает, но нет… Проблема в том, что параметр &parents=`[[*id]]` теперь игнорируется. И во всех категориях отображаются все товары которые вообще есть на сайте.

С проблемой воевал сам, но решения не нашел. Буду признателен за любую помощь.
Влад
Влад
Отбой, понял, что копипастить нехорошо. Поэтому разобрался как работает join, проанализировал лог и сделал наконец сам.

&loadModels=`tagger, simplerating`
&leftJoin=`{
  "TaggerTagResource": {
    "class": "TaggerTagResource", 
    "on": "modResource.id = TaggerTagResource.resource" 
  },
  "NameTag": {
    "class": "TaggerTag",
    "on": "TaggerTagResource.tag = NameTag.id" 
  },
  "SimpleRating": {
    "class": "SimpleRating", 
    "on": "modResource.id = SimpleRating.resource" 
  }
}`
&select=`{
  "modResource": "*",
  "TaggerTagResource": "*",
  "NameTag": "NameTag.tag, NameTag.alias",
  "SimpleRating":"rating_value, rating_count"
}`
Александр Мальцев
Александр Мальцев
Отлично!
Дмитрий
Дмитрий
Скажите, как можно реализовать вывод тегов (Tagger) в форму TicketForm, чтобы когда пользователь пишет статью смог сам выбрать теги.
Спасибо за ответ
Александр Мальцев
Александр Мальцев
Ответ на аналогичный вопрос есть в этом комментарии.
Дмитрий
Дмитрий
Не видел того комментария, но именно так и сделал ).
Спасибо Вам. Крутой сайт. Многое для себя тут взял!!!
Игорь
Игорь
Доброго времени суток.
Подскажите, а как отсортировать теги в облаке тегов не по алфавиту, а по полую Rank?
Чтобы иметь возможность вывести метки/теги в нужном порядке редактируя Rank у каждой метки.
Спасибо заранее.
		[[!mFilter2?
			&element=`pdoResources`
			&parents=`[[*id]]`
			&limit=`10`
			&showUnpublished=`1`
			&showHidden=`1`
			&sortby=`menuindex`
			&sortdir=`DESC`
			&ajaxMode=`default`
			&includeContent=`1`
			&includeTVs=`klient-logo,klient-gorod,data-zakaza,img-zakaza,gallery-rabota,nashi-raboti`
			&filters=`
				tagger|2:nashi-raboti,
			`
			&suggestionsRadio=`tv|nashi-raboti`
			&_filterOptions=`{"autoLoad":1}`
			&showLog=`0`
			&tplOuter=`proects-filter-outer`
			&tpls=`poslednie-proekti-tpl-razdel`
			&tplFilter.outer.proects=`nashi-raboti.tpl.filter.outer`
			&tplFilter.row.proects=`nashi-raboti.tpl.filter.radio`
			&aliases=`
				tagger|2==proects`
		]]
Александр Мальцев
Александр Мальцев
Добрый вечер.
Попробуйте задать сортировку по этому полю в фильтре.
Александр
Александр
Добрый день! Возникло 2 вопроса. Надеюсь на вашу помощь, и сразу прошу прощения, если не нашел ответа здесь сам.
1. Как вывести название тега в общем списке всех статей?

Вывожу все статьи следующим образом:
{'!pdoPage' | snippet : [
'ajaxMode' => 'default',
'tpl' => '@INLINE <div>
{$pagetitle}

<p>НАЗВАНИЕ ТЕГА: ???</p>

<a class="btn btn-very-small" href="{$uri}">Читать</a>
</div>',
'limit' => 6,
'includeTVs' => 'blog_cover',
'tvPrefix' => '',
'includeContent' => 1,
'pageLinkScheme' => '/[[+pageVarKey]]-[[+page]]',
'tplPageWrapper' => '@INLINE <div class="col-md-12 col-sm-12 col-xs-12 text-center margin-100px-top sm-margin-50px-top position-relative wow fadeInUp" style="visibility: hidden; animation-name: none;">
<div class="pagination text-small text-uppercase text-extra-dark-gray"><ul>{$prev}{$pages}{$next}</ul></div></div>',
'tplPage' => '@INLINE <li><a href="{$href}">{$pageNo}</a></li>',
'tplPageActive' => '@INLINE <li class="active"><a href="{$href}">{$pageNo}</a></li>',
'tplPagePrev' => '@INLINE <li rel="prev"><a href="{$href}"><i class="fa fa-long-arrow-left margin-5px-right xs-display-none"></i> Назад</a></li>',
'tplPageNext' => '@INLINE <li rel="next"><a href="{$href}">Дальше <i class="fa fa-long-arrow-right margin-5px-left xs-display-none"></i></a></li>',
'tplPagePrevEmpty' => '@INLINE ',
'tplPageNextEmpty' => '@INLINE ',
'ajaxElemWrapper' => '#child_list',
'ajaxElemRows' => '#child_list .rows',
'ajaxElemPagination' => '#child_list .pagination',
'ajaxElemLink' => '#child_list .pagination a',
]}
{$_modx->getPlaceholder('page.nav')}
2. Как вывести название тегов в приложении collections? Т.е. там нужно добавить столбец с названием тега.
Александр Мальцев
Александр Мальцев
Добрый день!
1. Поместить вызов сниппета в чанк, указанный в качестве значения параметра tpl:
[[!TaggerGetTags?
  &resources=`[[+id]]`
  &rowTpl=`@INLINE <div class="btn-group"><span class="btn btn-primary btn-sm">#</span><a class="btn btn-info btn-sm" href="[[~20]]?tag=[[+alias]]">[[+tag]]</a></div>`
]]
2. Не сталкивался с такой задачей. Можно попробовать это осуществить с помощью @Bindings.
Alexander F.
Alexander F.
Если зайти в сниппет TaggerGetCurrentTag, закомментировать последнюю строку, и дописать:
return implode($tagSeparator, $tags);
А потом вызвать сниппет так:
[[!TaggerGetCurrentTag? &tagTpl=`@INLINE [[+tag]]`]]
то сниппет выведет текущий выбранный тэг.

Просто и удобно :)
Женя
Женя
Александр, приветствую. Как можно осуществить «Похожие статьи» по тегам, если:
— в параметр GET ничего не передается (т.е. если зайти через облако тегов, формируется страница «Поиск по тегам» через GET параметр, а дальше идет сама статья, где нет параметра GET
— тегов у статьи больше одного
Александр Мальцев
Александр Мальцев
Для этого GET параметр и не нужен. У страницы есть поле id. Посредством него можно узнать связанные с ним теги. А на основании них получить похожие ресурсы.
Это сделать можно с помощью создания сниппета (например, RelatedResources).
Код сниппета RelatedResources:
<?php

// 1. Получаем теги текущего ресурса
$modx->addPackage('tagger', MODX_CORE_PATH . 'components/tagger/model/');
$query = $modx->newQuery('TaggerTagResource');
$query->where(array('resource' => $id));
$query->select('TaggerTagResource.tag as tag, TaggerTagResource.resource as resource');
$query->prepare();
$query->stmt->execute();
$rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
$tags = array();
foreach ($rows as $row) {
  $tags[] = $row['tag'];
}

// 2. Получаем другие ресурсы, в которых есть полученные теги
$query = $modx->newQuery('TaggerTagResource');
$query->where(array('tag:IN' => $tags, 'resource:!=' => $id));
$query->select('DISTINCT TaggerTagResource.resource as resource');
$query->sortby('RAND()');
$query->limit(5);
$query->prepare();
$query->stmt->execute();
$rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
$resources = array();
foreach ($rows as $row) {
  $resources[] = $row['resource'];
}

// 3. Получаем поля похожих ресурсов
$query = $modx->newQuery('modResource');
$query->where(array('id:IN' => $resources));
$query->select('modResource.id as id, modResource.pagetitle as pagetitle');
$query->prepare();
$query->stmt->execute();
$rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
$result = '';
foreach ($rows as $row) {
  $result .= $modx->getChunk('tpl.RelatedResources.row',array(
    'id' => $row['id'],
    'pagetitle' => $row['pagetitle']
  ));
}

return $result;
Кроме этого необходимо ещё создать чанк tpl.RelatedResources.row (для оформления строки результата):
<li><a href="[[~[[+id]]]]">[[+pagetitle]]</a></li>
Использование сниппета в шаблоне:
<ol>
[[!RelatedResources? 
    &id=`[[*id]]`
]]    
</ol>
wry
wry
Добрый день. Вы не подскажете, как добавить сюда TV? Хотел бы подключить изображения для выводимых ресурсов. Заранее благодарю.
wry
wry
Получилось через такую конструкцию:
[[pdoResources? 
&parents=`0`
&includeContent=`1`
&tpl=`crosslink_tpl_text`
&where=`[[TaggerGetRelatedWhere? &groups=`1`]]`
]]
Может кому-то понадобится
Аноним
Аноним
Здравствуйте.
Возникла такая проблема — после переноса папки core за пределы public_html не работает больше фильтр.
Ошибка такая:
msearch2/msearch2.class.php : 242) [mSearch2] Custom path is not exists: "полный путь/public_html/снова полный путь но уже правильный/core/components/msearch2/custom/filters"
msearch2.class.php : 1135) [mSearch2] Method "getTaggerValues" not exists in class "mse2FiltersHandler". Could not retrieve filters from "tagger"
Подскажите, почему так происходит? Это лечится или придется жертвовать защитой сайта?
Александр Мальцев
Александр Мальцев
Здравствуйте.
Жертвовать защитой сайта не стоит. Просто проверьте, как формируются пути в методе getTaggerValues. Исправьте их на правильные.
ALex
ALex
Добрый день. Воспользовался данным гайдом для создания тегов на сайте. Указал возможность вписывать тег именно в окне ресурса. После сохранения ресурса иногда случается зависание админки с бесконечным сохранением.
В логах вот такая штука
Maximum execution time of 60 seconds exceeded
после увеличение времени ожидания вот такая
4016661 upstream timed out (110: Connection timed out) while reading response header from upstream, client
Premature end of script headers: index.php
Александр Мальцев
Александр Мальцев
В журнале MODX есть ошибки? Если поменять расположение тегов в ресурсу, ситуация повторяется?
Дмитрий
Дмитрий
Приветствую!

Александр, благодарю за отличное руководство – все изложено очень доступно и понятно. Класс!

Прошу помоши по вопросу:

Требуется вывести главный тег, который является основным для страницы.
Например: у страницы есть теги – «Окрашивание», «Уход за волосами», «Услуги».

Основной тег – «Уход за волосами». Выводится в одном месте шаблона

Остальные теги – в конце статьи.

Вопрос: как можно назначить и вывести основной тег?

В админке теги размещаются в собственном порядке, который соответствует их id. Я посмотрел на таблицу в базе данных modx_tagger_tag_resources – там видно, что при назначении тегов они сортируются уже по порядку их присвоения к ресурсу.

Как вариант – можно сделать вывод тегов страницы с лимитом в 1. И сортировкой от старых тегов к новым. Основным тегом будет тот, что добавлен первым. Здесь есть минус – с админки не понятно, какой тег – основной.

Второй вариант – делать отдельно две группы тегов: одна – для основного тега, другая – для остальных, но мне кажется – это лишнее дублирование сущностей.

Возможно сталкивались с подобной задачей – в какую сторону лучше смотреть?

Благодарю!
Александр Мальцев
Александр Мальцев
Здравствуйте!

С помощью Tagger вы такое не сможете осуществить. В Tagger нет основных тегов, есть только ранг. Ранг — это просто некоторое число, которое можно использовать для сортировки. Но оно привязано к тегу, а не к ресурсу. Поэтому использовать его для решения данной задачи не получится.

Про сортировку не совсем понял. При назначении тега ресурсу в базу данных не сохраняется никакая временная метка, поэтому узнать какой тег был добавлен первым, а какой вторым не удастся. Компонент Tagger позволяет сортировать теги только по alias или рангу.

Решить задачу можно различными способами, но я наверно бы сделал так. Создал бы просто какое-то дополнительное поле (например, с помощью TV). Это поле использовал бы для указания основного тега из списка уже добавленных к данному ресурсу тегов с помощью Tagger. Наполнение списка нужными значениями организовал бы посредством сниппета или использовал бы @SELECT Binding.
Дмитрий
Дмитрий
Александр, благодарю за консультацию!

Буду реализовывать!
Аноним
Аноним
Добрый день, совершенно не поняла, как мне сделать поиск по тегам. Установлен msearch2 и tagger

Обычно, когда делала поиск, то вызывала дополнительные поля (чекбоксы, радиобатоны). А как сделать такую фильтрацию по tagger не понимаю. Вот предположим у меня статьи. У них есть метка «новость, статья, полезно». Как на страницу вывести все новости и дать аякс поиск по меткам?

[[!mFilter2?
    &filters=`
    tv|vid`
    &showEmptyFilters=`1`
    &tpls=`tpl-new`
    &limit=`12`
    &parents=`[[*id]]`
    &processTVs=`1`
    &sort=`createdon:asc`
    &tvPrefix=``
    &ajaxMode=`default`
    &element=`pdoResources`
   	&includeTVs=`vid,images`
    &tplFilter.outer.vid=`tpl.mFilter2.filter.outer`
    &tplFilter.row.vid=`tpl.mFilter2.filter.checkbox`
    &aliases=`
        tv|vid==vid`
]]
Александр Мальцев
Александр Мальцев
Добрый вечер.
В mSearch2 нет готового класса-обработчика фильтров для Tagger.
Чтобы это осуществить необходимо:
1. Скачать класс-обработчик фильтров для mSearch2 (для работы с Tagger): yadi.sk/d/YIDLToaX3Mv5QZ.
2. Поместить его в директорию filter (\core\components\msearch2\custom\filter\).
3. В системных настройка в качестве значения параметра mse2_filters_handler_class ввести значение taggerCustomFilter.

После этого использовать его так (1 — id группы):
[[!mFilter2? 
    &filters=`
        tagger|1:tgroup
    `
]]
Несколько групп:
[[!mFilter2?
    &filters=`
        tagger|1:tgroup,
        tagger|2:tgroup
    `
]]
Игорь
Игорь
Вот только не выстраиваются теги по параметру Rank. То есть, если есть тег с Ранк 1, и ему его заменить на другой, он по факту так и остаётся на той же позиции, что и до смены его Rank. В чем может быть ситуация?
Сергей
Сергей
Добрый день!
Подскажите пожалуйста, как сделать вывод по 1 или нескольким alias указанных в TV поле ресурса (alias указаны через запятую)?
[[!pdoPage?
  &element = `pdoResources`
  &limit=`12`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "modResource": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = modResource.id"
    },
    "300x225": {
      "class":"msResourceFile",
      "alias":"300x225",
      "on": "300x225.resource_id = modResource.id AND 300x225.path LIKE '%/300x225/' AND 300x225.rank=0"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "modResource":"*",
    "300x225":"300x225.url as 300x225"
  }`
  &where=`{
    "NameTag.alias": "tag-tv",
    "Posts.published": "1"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <p class="text-right">Всего результатов: [[+page.total]]</p><div class="catalog-menu">[[+output]]</div>`
  &tpl=`TagChunkRow`
]]

[[!+page.nav]]
Александр Мальцев
Александр Мальцев
Условие:
&where=`{
  "NameTag.alias:IN": [ [[*tag-tv]] ],
  "modResource.published": "1"
}`
В ресурсе указывать теги через запятую в двойных кавычках:
"алиас1","алиас2"
Сергей
Сергей
Огромное спасибо!
Сергей
Сергей
Подскажите пожалуйста, как отсортировать по очерёдности как в меню админки с учетом расположения в меню родителей и про родителей?
Александр Мальцев
Александр Мальцев
По умолчанию ресурсы в дереве меню выстраиваются в соответствии со значением menuindex:
&sortby=`modResource.menuindex`
&sortdir=`ASC`
Сергей
Сергей
Здравствуйте!
Не срабатывает, вложенность выводимых страниц от 1 до 7, menuindex родителей и всех про родителей по цепочки вверх нужно учесть при выводе. Подскажите пожалуйста решение.

Я так понял, это довольно частая проблема, может снипет кто напишет!
Александр Мальцев
Александр Мальцев
Здравствуйте!
Если ресурсов немного, то каждому ресурсу можно присвоить menuindex:
--ресурс (1)
--ресурс (2)
--ресурс (3)
--контейнер (4)
--ресурс (401)
--ресурс (402)
--ресурс (5)
--контейнер (6)
--ресурс (601)
--ресурс (602)
--ресурс (603)
--ресурс (7)

Если же писать какой-то алгоритм, то… Есть же ресурсы, которые не показываются в дереве. Кроме этого, частенько бывает так, что ресурсы имеют одинаковый menuindex. Кроме этого в системных настройках можно изменить поле, по которому будут сортироваться ресурсы в дереве. Т.е. нюансов много…
Можно просто назначать menuindex с помощью плагина при сохранении ресурса.
Сергей
Сергей
Спасибо за ответ! Ресурсов очень много и их часто перемещают по дереву нужен сниппет! Может кто сниппет создаст под любое количество вложенности?
Александр Мальцев
Александр Мальцев
Так сниппет для этого уже есть и называется он pdoMenu.
[[!pdoMenu?
  &loadModels=`tagger`
  &parents = `0`
  &leftJoin=`{
    "TaggerTagResource": {
      "class": "TaggerTagResource",
      "on": "TaggerTagResource.resource = modResource.id"
    },
    "TaggerTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = TaggerTag.id"
    }
  }`
  &where=`{
    "TaggerTag.alias": "ПСЕВДОНИМ_ТЕГА",
    "modResource.published": "1"
  }`
  &sortby=`menuindex`
  &sortdir=`ASC`
]]
Сергей
Сергей
Не понял в чем разница, Ваш пример с pdoMenu сортирует также, по меню индекс без учёта родителей и про радетелей!
Александр Мальцев
Александр Мальцев
Как в админке: скриншот.
Сергей
Сергей
Вот как получается (скриншот).
Сергей
Сергей
Здравствуйте! Подскажите пожалуйста, как добавить фотки к выборке из ms2gallery.
Фотки вывожу на сайте используя вот такой код, не пойму как его добавить на страницу «Статьи по тегу»?
...
&leftJoin=`{
		"300x225": {"class":"msResourceFile","alias":"300x225", "on": "300x225.resource_id = modResource.id AND 300x225.path LIKE '%/300x225/' AND 300x225.rank=0"}
	}`
&select=`{
		"modResource":"*"
		,"300x225":"300x225.url as 300x225"
	}`
Александр Мальцев
Александр Мальцев
Не проверял, но должно быть что-то наподобие этого:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`2`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "modResource": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = modResource.id"
    },
    "300x225": {
      "class":"msResourceFile",
      "alias":"300x225",
      "on": "300x225.resource_id = modResource.id AND 300x225.path LIKE '%/300x225/' AND 300x225.rank=0"
    }
  }`
  &select=`{
    "modResource":"*",
    "300x225":"300x225.url as 300x225"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `chunkTagRow`
]]
[[!+page.nav]]
Сергей
Сергей
Не работает выводит Array…
Сергей
Сергей
Спасибо огромное работает!!! (не заметил tpl у меня другой)
Сергей
Сергей
Добрый день!
Подскажите как вывести имя выбранного тега на странице «Статьи по тегу» в эту строчку

[[!pdoPage?
.....
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов по тегу "ИМЯ ТЕГА": [[+page.total]]</h2>[[+output]]`
....
]]
[[!+page.nav]]
Александр Мальцев
Александр Мальцев
[[!#GET.tag]]
Сергей
Сергей
Так выводит Псевдоним, а нужно Название
Сергей
Сергей
Спасибо огромное! в коментах нашел ваше решение «сниппет showTag»
Archi
Archi
Здравствуйте! Почему на странице «Вывод по категориям» не отображается [[+publishedon]]?!
Вывод в шаблоне:
	[[!pdoPage?
									  &element=`pdoResources`
									  &loadModels=`tagger`
									  &class=`TaggerTagResource`
									  &leftJoin=`{
									    "NameTag": {
									      "class": "TaggerTag",
									      "on": "TaggerTagResource.tag = NameTag.id"
									    },
									    "Posts": {
									      "class": "modResource",
									      "on": "TaggerTagResource.resource = Posts.id"
									    }
									  }`
									  &select=`{
									    "TaggerTagResource": "*",
									    "NameTag": "NameTag.tag, NameTag.alias",
									    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
									  }`
									  &where=`{
									    "NameTag.alias": "[[!#GET.tag]]"
									  }`
									  &sortby=`TaggerTagResource.resource`
									  &sortdir=`ASC`  
									  &tplWrapper=`@INLINE <h2>Всего результатов: [[+page.total]]</h2>[[+output]]`
									  &tpl=`tpl-postPreview`
										&limit=`6`
										&includeTVs=`postImage`
										&tplPagePrev=`@INLINE <li class="control"><a href="[[+href]]"><i class="fa fa-angle-left"></i></a></li>`
										&tplPageNext=`@INLINE <li class="control"><a href="[[+href]]"><i class="fa fa-angle-right"></i></a></li>`
										&tplPageWrapper=`@INLINE <div class="pagination"><ul class="pagination">[[+prev]][[+pages]][[+next]]</ul></div>`
										&tplPage=`@INLINE <li class="page"><a href="[[+href]]">[[+pageNo]]</a></li>`
										&tplPageActive=`@INLINE <li class="page active"><a href="[[+href]]">[[+pageNo]]</a></li>`
										]]
										[[!+page.nav]]
Tpl:
<div class="post-preview">
									<a href="[[~[[+id]]]]" class="btn post-preview-link">
										<div class="post-preview-image">
											<img src="[[!pdoField? &id=`[[+id]]` &field=`postImage`]]" alt="[[+pagetitle]]" class="responsive-img">
											<div class="image-plus"><i class="fa fa-plus-circle"></i></div>
										</div>
									</a>
									<div class="post-preview-content">
										<span class="post-preview-author">[[+longtitle]]</span>
										<span class="post-preview-title"><h2>[[+pagetitle]]</h2></span>
										<span class="post-preview-tag">
											[[TaggerGetTags?
											&resources=`[[+id]]`
											&separator=` | `
											&limit=`3`
											&rowTpl=`tpl-tagLink-article`
											]]
										</span>
										<span class="post-preview-date">								
                                                                                   [[+publishedon:date=`%d.%m.%Yг.`]]
                                                                                </span>
									</div>
								</div>
Даже если менять Phx для publishedon — ничего не происходит
Александр Мальцев
Александр Мальцев
Добрый день. Это связано с тем, что вы его не добавили в выборку:
"Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.publishedon"
Серый
Серый
Народ, а что за плэйсхолдер у этого Taggera такой [[+active]]?
Я его помещаю, в tpl тега, а он пустой везде.
Я надеялся, что можно сделать что-то на вроде активного пункта меню…
Вот у меня такой чанк Tpl:
<li><a href="[[~18]]?tag=[[+alias]]">[[+tag]]<span class="badge [[+active]]"><!--[[+countTags]]--></span></a></li>
Что не так делаю?
Александр Мальцев
Александр Мальцев
Плейсхолдеры устанавливают в основном сниппеты. Для того чтобы использовать плейсхолдер active, его нужно установить.
Алексей
Алексей
Вам удалось сделать активным пунктом меню? тоже самое хочу сделать, пока не получается.
Алексей
Алексей
&tpl=`@INLINE <li><a href="[[~12]]?tag=[[+alias]]" class="button small btn btn-info btn-sm [[!#GET.tag:is=`[[+tag]]`:then=`active`]]">[[+tag]]</a></li>`
— пробывал так, не работает
Серый
Серый
Увы… Я плюнул на эту затею и сделал отдельное дерево ресурсов, в теле каждого ресурса вывожу нужный тег, а меню формирую через PdoMenu. Активным подсвечивается, конечно, только когда внутри этого раздела, если зайдешь в публикацию актив слетает и крошек хлебных не сделать при моем уровне путёвых…
Буду на будущее учить ворд-впресс, а то чот никто не пишет как сделать такую же структуру как там, когда один материал может находиться в нескольких разделах и при этом разделы можно отображать в меню :((
Алексей
Алексей
ошибка
Алексей
Алексей
Уточните как можно плейсхолдер active установить?
Александр Мальцев
Александр Мальцев
Попробуйте вместо @INLINE кода использовать чанк. Иначе теги которые он содержит будут обработаны до вызова pdoPage.
Александр Мальцев
Александр Мальцев
Например, создания облака тегов (без использования сторонних дополнений):
1. Сниппет TagCloud:
<?php
$modx->addPackage('tagger', MODX_CORE_PATH . 'components/tagger/model/');
$query = $modx->newQuery('TaggerTag');
$query->leftJoin('TaggerTagResource','Resources');
$query->select('TaggerTag.tag as tag, TaggerTag.alias as alias, COUNT(Resources.tag) as countTags');
$query->groupby('TaggerTag.id');
$query->sortby('TaggerTag.tag','ASC');
$query->prepare();
$query->stmt->execute();
$rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
if (isset($_GET['tag'])) {
  $tag = filter_var($_GET['tag'], FILTER_SANITIZE_STRING);
}
$output = '';
foreach ($rows as $row) {
  // устанавливаем параметр (плейсхолдер) active, который будет доступен в чанке TagCloudRow
  if (isset($tag)) {
    if ($row['alias']===$tag) {
      $row['active'] = ' active';
    } else {
      $row['active'] = '';      
    }
  }
  // формируем тег для облака (передаём чанку необходимые параметры, включая active)
  $output .= $modx->getChunk('TagCloudRow',array(
    'tag' => $row['tag'],
    'alias' => $row['alias'],
    'countTags' => $row['countTags'],
    'active' => $row['active']
  ));
}

$output = $modx->getChunk('TagCloudOuter',array(
  'output' => $output  
));

return $output;
2. Чанк TagCloudRow:
<a href="[[~20]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge[[+active]]">[[+countTags]]</span></a> 
3. Чанк TagCloudOuter:
<div class="panel panel-primary"><div class="panel-heading"><span class="glyphicon glyphicon-tags"></span> Теги</div><div class="panel-body">[[+output]]</div></div> 
Причём скорость работы этого решения будет выше (т.к. ничего не используем лишнего). Да, и количество запросов к базе будет намного меньше.
Алексей
Алексей
в чанк попробывал, также
Алексей
Алексей
спасибо, так и сделал.
Александр Мальцев
Александр Мальцев
Так тоже должно работать…
Попробуйте [[+tag]] заменить на [[+alias]]:
&tpl=`@INLINE <li><a href="[[~12]]?tag=[[+alias]]" class="button small btn btn-info btn-sm [[!#GET.tag:is=`[[+alias]]`:then=`active`]]">[[+tag]]</a></li>`
Алексей
Алексей
пробывал, не знаю, почему то не работает. Но вам огромное спасибо, с помощью сниппета TagCloud всё получилось.
Сергей
Сергей
Подскажите пожалуйста, как передавать в ваш снипет ID группы тегов для выборки?
[[TagCloud?
...???
]]
Александр Мальцев
Александр Мальцев
Добавить в сниппет условие where:
if (isset($group)) {
  $query->where(array('group' => $group));  
}
После этого передавать в сниппет необходимое значение (id группы):
[[!TagCloud? &group=`1`]]
Сергей
Сергей
Добрый день! Не срабатывает, выводит все.
[[!TagCloud? &group=`2`]]
<?php
$modx->addPackage('tagger', MODX_CORE_PATH . 'components/tagger/model/');
$query = $modx->newQuery('TaggerTag');
$query->leftJoin('TaggerTagResource','Resources');
$query->select('TaggerTag.tag as tag, TaggerTag.alias as alias, COUNT(Resources.tag) as countTags');
$query->groupby('TaggerTag.id');
$query->sortby('TaggerTag.tag','ASC');
$query->prepare();
$query->stmt->execute();
$rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
if (isset($group)) {
  $query->where(array('group' => $group));  
}
if (isset($_GET['tag'])) {
  $tag = filter_var($_GET['tag'], FILTER_SANITIZE_STRING);
}
$output = '';
foreach ($rows as $row) {

  if (isset($tag)) {
    if ($row['alias']===$tag) {
      $row['active'] = ' active';
    } else {
      $row['active'] = '';
    }
  }

  $output .= $modx->getChunk('TagCloudRow',array(
    'tag' => $row['tag'],
    'alias' => $row['alias'],
    'countTags' => $row['countTags'],
    'active' => $row['active']
  ));
}

$output = $modx->getChunk('TagCloudOuter',array(
  'output' => $output  
));

return $output;
Александр Мальцев
Александр Мальцев
Условие добавили не туда.
<?php
$modx->addPackage('tagger', MODX_CORE_PATH . 'components/tagger/model/');
$query = $modx->newQuery('TaggerTag');
$query->leftJoin('TaggerTagResource','Resources');
if (isset($group)) {
  $query->where(array('group' => $group));  
}
...
Сергей
Сергей
Спасибо! Работает и ещё один вопрос как отключить пустые теги (у которых 0)?
Александр Мальцев
Александр Мальцев
Замените leftJoin на innerJoin.
Сергей
Сергей
Спасибо всё работает отлично!!!
Сергей
Сергей
Подскажите пожалуйста ещё, как убрать в облаке тегов не Опубликованные ресурсы (количество)?
Александр Мальцев
Александр Мальцев
Необходимо присоединить таблицу modResource и добавить условие:
<?php
$modx->addPackage('tagger', MODX_CORE_PATH . 'components/tagger/model/');
$query = $modx->newQuery('TaggerTag');
$query->innerJoin('TaggerTagResource','Resources');
$query->leftJoin('modResource', 'modResource', "Resources.resource = modResource.id");
if (isset($group)) {
  $query->where(array('group' => $group));  
}
$query->where(array('modResource.published' => 1));
$query->select('TaggerTag.tag as tag, TaggerTag.alias as alias, COUNT(Resources.tag) as countTags');
...
Сергей
Сергей
Всё работает отлично!!! Спасибо за Ваш труд и помощь! Поддержу сайт!
Александр Мальцев
Александр Мальцев
Спасибо!
Игорь
Игорь
А у меня почему то везде работает, кроме одной страницы: основной раздел.
Почему-то показывает пустые и неправильно, соответственно, считает кол-во ресурсов с ними.
Вывожу так:
[[!pdoResources?
                    &limit=`0`
                    &loadModels=`tagger`
                    &class=`TaggerTag`
                    &innerJoin=`{
                        "TaggerTagResources": {
                        "class": "TaggerTagResource",
                        "on": "TaggerTag.id = TaggerTagResources.tag"
                        }
                    }`
                    &select=`{
                        "TaggerTag": "*",
                        "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
                    }`
                    &groupby=`TaggerTag.id`
                    &sortby=`TaggerTag.tag`
                    &sortdir=`ASC` 
                    &tpl=`tag-cloud-tpl`
]]
Александр Мальцев
Александр Мальцев
Может у ресурса флажок «Кэшируемый» установлен?
Игорь
Игорь
Да, именно так :-) Написал тут, и потом сразу же дошло) Спасибо за ответ.
Тут еще вопрос заодно: как присвоить активному тегу класс? :-)
Александр Мальцев
Александр Мальцев
Для этого нужно в чанке сравнить tag с тем который у вас запросе и добавить в класс active.
В комментариях есть пример сниппета TagCloud. Он позволяет создать облако тегов и присвоить активному тегу класс active.
Игорь
Игорь
Благодарю.
Алексей
Алексей
Доброго дня, уже всю голову сломал. Вывожу теги на текущей странице. И хочу, чтобы текущая страница исключалась при выводе, т.к. она является контейнером. Подскажите пожалуйста.
Вывожу так:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`10`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.introtext, Posts.publishedon"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`publishedon`
  &includeContent=`1`
&includeTVs=`image_post`
&processTVs=`1`
&pageNavVar=`podrazdel.navi`
&pageVarKey=`podrazdel`

  &tpl= `menu_chunkTagRow`
  &tplPage=`	@INLINE <li><a class="page" href="[[+href]]">[[+pageNo]]</a></li>`
&tplPageWrapper=`	@INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div>`
&tplPageActive=`	@INLINE <li class="active"><a class="page active" href="[[+href]]">[[+pageNo]]</a></li>`
&tplPageFirst=`	@INLINE <li class="control"><a class="button" href="[[+href]]">Первая</a></li>`
&tplPageLast=`	@INLINE <li class="control"><a class="button" href="[[+href]]">Последняя</a></li>`
&tplPagePrev=`	@INLINE <li class="control"><a class="button small" href="[[+href]]">назад</a></li>`
&tplPageNext=`	@INLINE <li class="control"><a class="button small" href="[[+href]]">вперед</a></li>`
&tplPageSkip=`	@INLINE <li class="disabled"><span>...</span></li>`
&tplPageFirstEmpty=`	@INLINE <li class="control"><span class="button disabled">Первая</span></li>`
&tplPageLastEmpty=`	@INLINE <li class="control"><span class="button disabled">Последняя</span></li>`
&tplPagePrevEmpty=`	@INLINE <li class="disabled"><span class="button small disabled">назад</span></li>`
&tplPageNextEmpty=`	@INLINE <li class="disabled"><span class="button small disabled">вперед</span></li>`
]]
Александр Мальцев
Александр Мальцев
Добавьте в условие parent (например, только ресурсы, имеющие в качестве родителя ресурс с id=5).
&where=`{
  "NameTag.alias": "[[!#GET.tag]]",
  "Posts.parent" : 5
}`
Алексей
Алексей
&where=`{
    "NameTag.alias": "[[!#GET.tag]]",
    "modResource.parent:=":"-5"
  }`
Так?
Алексей
Алексей
Круто, спасибо!!!
Александр Мальцев
Александр Мальцев
Чтобы просто исключить ресурс:
&where=`{
  "NameTag.alias": "[[!#GET.tag]]",
  "Posts.id:!=": "5"
}`
Алексей
Алексей
Возможно, чтобы тег title страницу менялся при поиске по тегу?
Алексей
Алексей
Доброго дня, если несколько ресурсов? Попытался через запятую указать, так не работает. Получается, что работает только на ресурс под id 5, остальные почему-то игнорирует.
&where=`{
  "NameTag.alias": "[[!#GET.tag]]",
  "Posts.parent" : 5,6,7
}`
Александр Мальцев
Александр Мальцев
Добрый! Необходимо использовать IN:
"Posts.parent:IN": [5,6,7]
Алексей
Алексей
Спасибо
Александр Мальцев
Александр Мальцев
При формировании на сервере можно так:
<title>Поиск по тегу [[!#GET.tag]]</title>
Amsterdam
Amsterdam
Выводит. Но английское url. А что бы именно название тега на кириллице?
Александр Мальцев
Александр Мальцев
Для этого нужно выбрать, например, посредством pdoResources alias тега по tag:
[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTag`
  &select=`{"TaggerTag": "alias as alias"}`
  &sortby=`TaggerTag.alias`
  &where = `{"TaggerTag.tag":"[[#GET.tag]]"}`
  &tpl = `@INLINE [[+alias]]`
  &limit = `1`
]]
Anton
Anton
Добрый день.
Подскажите пожалуйста не разумному)!,
а как при помощи такого вывода в pdoResources,
с использованием &select указать, что мне нужно выводить и tv параметры.
И можно-ли вообще это сделать.
Я хочу чтобы статьи относящиеся к данному тегу выводились с изображениями.

Стандартным вызовом &includeTVs=`img-article,title-img` tv параметры не выводятся,
как их правильно указать в &select?

Заранее спасибо!!!
Александр Мальцев
Александр Мальцев
Добрый! Перед тем как что-то выбирать из таблицы, её сначала необходимо присоединить (например, с помощью leftJoin). Стандартным способом это может не работать, когда в качестве базового класса используется не modResource, а какой-то другой класс… Синтаксис формата leftJoin будет зависеть от того, какой вы используете запрос.
Anton
Anton
Спасибо.
Только сразу другие вопросы возникли.
Почему в принципе в случае если в сниппете pdoResources используется
&select, то стандартный &includeTVs=`tv-1,tv-2`, не выводит эти параметры.
И где можно посмотреть в какой таблице находятся tv параметры и синтаксис,
как эту таблицу можно подключить и потом использовать её элементы?
Александр Мальцев
Александр Мальцев
Например, в сниппете, с помощью которого мы осуществляем вывод статьей по тегу, в качестве базового класса используется не ресурс (modResource), а TaggerTagResource. У данного класса (таблицы) нет никаких TV полей, поэтому выбрать их нельзя. Если вы хотите в этом разобраться, то почитайте статью про xPDO. xPDO — это основа, на которой положена работа всей системы MODX. Но, также не помешают знания по SQL и PDO.
Посмотреть таблицы MODX можно, например, с помощью инструмента phpMyAdmin.
Добавления TV (id которого равно 1) к сниппету, с помощью которого осуществляется выбор статей по тегу, будет выполняться так:
[[!pdoPage?
  &element = `pdoResources`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    },
    "TV1": {
      "class": "modTemplateVarResource",
      "on": "Posts.id = TV1.contentid and TV1.tmplvarid = 1"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description",
    "TV1": "TV1.value as tv1"
  }`
  ...
В чанке chunkTagRow получить значение поля tv1 можно так:
<p>Значение TV1: [[+tv1]]</p>
Если вам необходимо выбрать ещё одно TV:
"TV1": {
  "class": "modTemplateVarResource",
  "on": "Posts.id = TV1.contentid and TV1.tmplvarid = 1"
},
"TV2": {
  "class": "modTemplateVarResource",
  "on": "Posts.id = TV2.contentid and TV2.tmplvarid = 5"
}
...
&select=`{
  "TaggerTagResource": "*",
  "NameTag": "NameTag.tag, NameTag.alias",
  "Posts": "Posts.id, Posts.pagetitle, Posts.description",
  "TV1": "TV1.value as tv1",
  "TV2": "TV2.value as tv2",
}`
...
Anton
Anton
Спасибо большое!
Валерий
Валерий
Хочу уточнить (только что протестил).
Понял, что Tagger перестал работать с кириллицей. На другом проекте и на старой своей версии он спокойно преобразовывал кириллицу в латиницу. Теперь Tagger для первого тега создает псевдоним "-1", для второго " " (пустая строка), а дальше начинает бесконечно сохранять материал, как бы намекая, что ничего у меня не выйдет :)
Александр Мальцев
Александр Мальцев
Есть такая ошибка. Об этом разработчику компонента уже сообщили (https://github.com/modxcms/Tagger/issues/105). Самое простое решение (пока автор не обновит компонент) откатиться на старую его версию Tagger (1.8).
Валерий
Валерий
Добрый день!

Такой вопрос: вы уже пользовались новой версией Tagger? Т.е. последним его обновлением.
Дело в том, что он перестал формировать «псевдоним», когда добавляется новый тег. Я ставил его на чистую систему, кеш очищал, переустанавливал. НО, после добавления второго тега (да, именно второго рандомного тега), третий в таблице в колонке «псевдоним» показывает -1 и все. Тега нет, сохранить он его не может.

Вручную я могу поменять псевдоним и все работает, но это же не дело… Возможно, вы уже нашли решение?
alex87.ru
alex87.ru
Спасибо за статью. Подскажите пожалуйста что добавить в ваш код (прикреплен ниже) для вывода облака тегов, чтобы выводились не все теги, а только теги к примеру из 2й группы (пусть ее имя будет tag2)

[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTag`
  &leftJoin=`{
    "TaggerTagResources": {
	  "class": "TaggerTagResource",
	  "on": "TaggerTag.id = TaggerTagResources.tag"
    }
  }`
  &select=`{
    "TaggerTag": "*",
	  "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
	}`
  &groupby=`TaggerTag.id`
  &sortby=`TaggerTag.tag`
  &sortdir=`ASC`  
  &tplWrapper=`@INLINE <div class="panel panel-primary"><div class="panel-heading"><span class="glyphicon glyphicon-tags"></span> Теги</div><div class="panel-body">[[+output]]</div></div>`
  &tpl=`@INLINE <a href="[[~20]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
]]
Александр Мальцев
Александр Мальцев
Для выбора тегов из определённой группы по её id (например, 2), добавьте в запрос условие:
&where=`{
  "TaggerTag.group": "2"
}`
alex87.ru
alex87.ru
Спасибо) Помогло)
Женёк
Женёк
Нужна помощь!

Есть Категория (id 8)

В ней есть ресурсы. У ресурсов указаны теги:
Проект 1 (тег1 = id1)
Проект 2 (тег2 = id2)


Есть ресурсы, у каждого из которых в tv (tags_tv) указан id тега.
В этих ресурсах нужно вывести все проекты, с id тега, который в tv указан.

Должно получиться что то вроде такого:
{'!pdoResources' | snippet : [
            'parents' => '8',
            'limit' => '0',
            'includeTVs' => 'preview_portfolio_tv,tags_tv',
            'tvPrefix' => '',
            'processTVs' => '1',
            'where' => '[[!TaggerGetResourcesWhere? &tags=`[[*tags_tv]]`]]',
            'tpl' => 'portfolio_row.tpl'
]}
Александр Мальцев
Александр Мальцев
Попробуйте сделать следующее. Подсоединить к запросу с помощью leftJoin ещё два класса (таблицы) TaggerTagResource и TaggerTag. После этого у вас будут доступны теги ресурсов. Теперь просто изменить условие where на следующее (выберем только те ресурсы, у которых (alias или tag) имеет значение tags_tv текущего ресурса):
"TaggerTag.alias": "[[*tags_tv]]"
Женёк
Женёк
Не могли бы вы подробнее написать как leftJoin составить правильно?
Для меня пока сложно все это.
Александр Мальцев
Александр Мальцев
В статье и комментариях много разных примеров.
Не совсем понятно, что у вас и с чем там как связано.
Например, для того чтобы получить все ресурсы, у которых родитель имеет id = 8 и один из тегов равен bootstrap будет так:
[[!pdoResources?
  &loadModels=`tagger`
  &class=`modResource`
  &parents=`8`
  &leftJoin=`{
    "TaggerTagResource": {
      "class": "TaggerTagResource",
      "on": "TaggerTagResource.resource = modResource.id"
    },
    "TaggerTag": {
      "class": "TaggerTag",
      "on": "TaggerTag.id = TaggerTagResource.tag"
    }
  }`
  &select=`{
    "modResource": "*",
    "TaggerTag": "TaggerTag.tag, TaggerTag.alias"
  }`
  &where=`{
    "TaggerTag.tag": "bootstrap"
  }`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE Всего результатов: [[+page.total]]
<ul>[[+output]]</ul>`
  &tpl= `@INLINE <li>[[+pagetitle]]</li>`
  &showLog=`1`
]]
Женёк
Женёк
Все правильно вы поняли.
Спасибо огромное, все работает как надо!
atszenara
atszenara
Вопрос на миллион)) Как сделать добавление тегов при создании тикета с фронта?
Александр Мальцев
Александр Мальцев
В этом случае теги лучше организовать с помощью TV, т.к. сниппет TicketForm по умолчанию с ними работает.
Для этого необходимо будет создать копию чанка tpl.Tickets.form.create, например, под именем tplTicketsFormCreate. Открыть его и в HTML форму добавить input с именем созданного TV-поля (например, tags).
<div class="form-group">
  <label for="ticket-tags">Теги</label>
  <input type="text" class="form-control" placeholder="[[%ticket_tags]]" name="tags" value="" maxlength="150" id="ticket-tags">
  <span class="error"></span>
</div>
После указать имя TV-поля в вызове сниппета TicketForm:
[[!TicketForm? 
  &allowedFields=`tags`
  &tplFormCreate=`tplTicketsFormCreate`
]]
Сергей
Сергей
Добрый день, спасибо за очень полезную статью! Решил ею воспользоваться, но возникла проблема, и был бы очень благодарен, если бы помогли.

Есть магазин на miniShop2 + Babel (2 языка). Хочу вывести в сайдбар TagCloud по товарам, чтобы можно было отдельно фильтровать по тегам. Установил Tagger и добавил каждому товару Теги на разном языке.

В сайдбаре теги вывожу для каждого контекста (языка) свои:
[[TaggerGetTags? &outTpl=`tag_links_wrap_tpl` &contexts=`[[*context_key]]` &rowTpl=`tag_links_tpl`]]
А вот результат по тегу вывожу так:
[[!pdoPage?
  &element = `msProducts`
  &limit=`2`
  &loadModels=`tagger`
  &includeContent=`introtext`
  &includeThumbs=`220x294`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `Prod_List_Tpl`
]]
Когда использую &element=`msProducts`ничего не выводится, а если ставлю pdoResources, то результат выводится, но не видно Цены [[+price]] и КартинкиПревью [[+thumb]] которые, скорее всего, есть только в msProducts. &includeThumbs=`220x294` только у msProducts есть.

Можно как то соединить pdoPage с msProducts и tagger?
Александр Мальцев
Александр Мальцев
Исходя из модели необходимо вместо modResource просто использовать msProduct. Параметр element не надо изменять, здесь необходимо указывать сниппет (например, pdoResources) который будет выполнять выборку данных.
"Posts": {
  "class": "msProduct",
  "on": "TaggerTagResource.resource = Posts.id"
}
Сергей
Сергей
Спасибо Александр!
Результат вывода теперь выводится правильно, вот только без цены и картинки как и было раньше, но после часа поисков нашел решение. Нужно было добавить в &leftJoin msProductData и в &select уже добавить Data.price, Data.thumb.
Вот может кому понадобиться:

[[!pdoPage?
  &element = `pdoResources`
  &limit=`2`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "msProduct",
      "on": "TaggerTagResource.resource = Posts.id"
    },
    "Data": {
      "class": "msProductData",
      "on": "TaggerTagResource.resource = Data.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Data.price, Data.thumb"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &includeThumbs=`220x294`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `Prod_List_Tpl`
]]
А в ТэгКлауд что в сайдбаре я сделал так:
[[TaggerGetTags? &outTpl=`tag_links_wrap_tpl` &contexts=`[[*context_key]]` 
&rowTpl=`tag_links_tpl_[[++cultureKey]]`]]
для каждого языка создал разные чанки tag_links_tpl_ru и tag_links_tpl_en чтобы можно было проставить правильные ссылки на теги.
<a class="tag-link" href="[[~520]]?tag=[[+alias]]">[[+tag]] <span>([[+cnt]])</span></a>
где 520 — это ID документа для вывода результата на RU, а для EN id 519
Серый
Серый
Подскажите пожалуйста, как должен выглядеть код для pdoTools, что бы вывести все ресурсы, имеющие определенный набор тегов?
Я делаю такую штуку и у меня ничего не получается:
[[!pdoResources? &where=`[[!TaggerGetResourcesWhere? &id=`«1»,«2»`]]`]]
Делал и по алиасам тегов Tagger`a, и по русским названиям — не пашет.
Так-то инструмент прикольный, хотелось бы разобраться…
Серый
Серый
Сделал такой код:
[[!pdoPage?
  &element = `pdoResources`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "NameTag.alias": "po-derevu"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `device-card`
]]
Вроде работает как надо, но уж больно громоздким кажется.
Может что-то лишнее есть, что не обязательно использовать?
Александр Мальцев
Александр Мальцев
Если по alias то так.
Если необходимо по id, то таблицу TaggerTag можно не присоединять:
[[!pdoPage?
  &element = `pdoResources`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "TaggerTagResource.tag:IN": [1,2]
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `device-card`
]]
Если вы хотите это сделать более удобным для использования, то можете создать сниппет.
Серый
Серый
Хотить-то я хотю, но толку покамест маловато))
Кстати, в итоге остановился вот на каком варианте:
[[!pdoResources? 
	&parents=`родитель ресурсов`
	&tpl=`чанк`
	&where=`[[!TaggerGetResourcesWhere? &matchAll=`1` &tags=`tag1,tag2`]]`
	&limit="сколько штук выводить. 0 - если без все что есть"
]]
где `tag1,tag2` — список англоязычных алиасов.
А вообще, в идеале хотелось бы такую штуку замутить, что делаешь такой шаблон для ресурса которому тоже назначаешь Tagger`ом теги, а он выводит в себе другие ресурсы (например, детей какого-нибудь родителя, которого можно и в шаблоне задать), которые соответствуют либо выбранным для этого ресурся тегам, либо выбранному сочетанию)))
И если еще внутри админки в каком-нибудь Collections сделать фильтр по тегам — ваще будет сказка)))
Женёк
Женёк
Статья бомба!

Теги выводятся из всех ресурсов, а нужно только из определенного родителя.
Подскажите, как вывести облако тегов из определенного parents?
[[!pdoResources?
&loadModels=`tagger`
&class=`TaggerTag`
&leftJoin=`{
    "TaggerTagResources": {
        "class": "TaggerTagResource",
        "on": "TaggerTag.id = TaggerTagResources.tag"
    }
}`
&select=`{
"TaggerTag": "*",
"TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
}`
&groupby=`TaggerTag.id`
&sortby=`TaggerTag.tag`
&sortdir=`ASC`
&tpl=`@INLINE
    <li class="filter" data-filter=".[[+tag]]">
        <span>[[+tag]]</span>
    </li>`
]]
Александр Мальцев
Александр Мальцев
Спасибо. Для этого необходимо присоединить объект modResource и добавить условие WHERE:
[[!pdoResources?
&loadModels=`tagger`
&class=`TaggerTag`
&innerJoin = `{
  "TaggerTagResource": {
    "class": "TaggerTagResource",
    "on": "TaggerTag.id = TaggerTagResource.tag"
  },
  "modResource": {
    "class": "modResource",
    "on": "modResource.id = TaggerTagResource.resource"
  }
}`
&where=`{
  "modResource.parent:=":"32"
}`
&select=`{
  "TaggerTag": "*",
  "TaggerTagResource": "COUNT(TaggerTagResource.tag) as countTags, TaggerTagResource.resource"
}`
&groupby=`TaggerTag.id`
&sortby=`TaggerTag.tag`
&sortdir=`ASC`
&tpl=`@INLINE
  <li class="filter" data-filter=".[[+tag]]">
    <span>[[+tag]] ([[+countTags]])</span>
  </li>`
]]
Вместо 32 укажите значение необходимого id родительского ресурса.
Максим
Максим
Классное дополнение но очень не удобно забивать новые теги, новая вкладка, новый раздел, либо не удобно либо много места занимает в админке мне кажется было бы лучше сделать как стандартное тв поле, по примеру минишопа, группы тегов тоже не понятно зачем, в минишопе их тоже нет а все работает, самый главный минус из за странного размещения поля на данном снипете он не работает в группе товаров modx.
Александр Мальцев
Александр Мальцев
Данный пакет позволяет установить место, где будет отображаться поле для ввода тегов в ресурсе. Т.е. кроме отдельной вкладки, там доступны ещё и другие параметры, в том числе и на вкладке дополнительных параметров.
Если вам нужные более простой вариант тегов, то их можно выполнить и в виде дополнительного поля (TV). Если же вы хотите иметь какой контроль над тегами, то с TV придётся это всё реализовывать. А здесь многое доступно из «коробки». Например, можно легко переименовать тег, при установлении тегов использовать только созданные, а также ограничить количество тегов, которые можно установить ресурсу. Кроме этого тегам можно назначать псевдонимы и многое другое. Т.е. использовать TV или компонент Tagger решать вам, всё зависит от задачи. Группы тегов нужны для того чтобы разным ресурсам (в зависимости от их привязки к шаблонам) можно было назначать теги из разных групп. Это может понадобиться, например, если у вас на сайте есть разные категории и ресурсам в зависимости от категории, в которой они расположены необходимо назначить теги с той или другой группы.
Максим
Максим
Александр, спасибо, но вот эта проблема остается в категории товаров не выводится поле для ввода тегов, все места перепробовал, на других ресурсах работает, не могли бы вы мне помочь нашел дополнение для ввода тегов tvsuperselect. Возможно ли эти 2 дополнения объединить?
itchief.ru/assets/uploadify/a/9/5/a95d93e2d7e43dc37abf2da0a3d8da71.png
Максим
Максим
Я так понимаю в tagger можно заменить строчку, откуда с базы данных будут браться теги?
Подскажите что туда можно вписать если я прав?
Александр Мальцев
Александр Мальцев
Лучше выбрать какое-то одно дополнение, отвечающее вашей задаче и использовать его. Кроме этого поле для ввода тегов Tagger нормально выводится в категории товаров miniShop2 как в отдельной вкладке, так и в других местах в зависимости от его настройки.
momcom
momcom
На главной странице теги начинают выводить контент статей.
_http://buyforex.ru/
и на странице «Вывод статей по тегу» тоже подцепляют контент этой страницы.
_http://buyforex.ru/tag.html?tag=nachinayushhim
Как поправить?
Александр Мальцев
Александр Мальцев
Проверьте чанк, который используется для вывода результатов работы сниппета.
momcom
momcom
[[!pdoResources?
      &loadModels=`tagger`[[- Список компонентов, через запятую, чьи модели нужно загрузить для
                   построения запроса. Например: &loadModels=`ms2gallery,msearch2`.]]
      &class=`TaggerTag`
      &leftJoin=`{
        "TaggerTagResources": {
    	  "class": "TaggerTagResource",
    	  "on": "TaggerTag.id = TaggerTagResources.tag"
        }
      }`
      &select=`{
        "TaggerTag": "*",
    	  "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
    	}`
      &groupby=`TaggerTag.id`
      &sortby=`TaggerTag.tag`
      &sortdir=`ASC`  
      &tplWrapper=`@INLINE <div class="panel panel-primary"><div class="panel-heading"><span class="glyphicon glyphicon-tags"></span> Теги</div><div class="panel-body">[[+output]]</div></div>`
      &tpl=`@INLINE <a href="[[~53]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
    ]]
То что смог выяснить так это что через output выводятся данные. Дальше продвинуться пока не удалось. Подскажите что делать дальше.
Александр Мальцев
Александр Мальцев
Попробуйте заменить содержимое параметра &tplWrapper на обычный чанк.
Или не используйте данный параметр, и содержимое сниппета поместите в эту обёртку:
<div class="panel panel-primary">
  <div class="panel-heading">
    <span class="glyphicon glyphicon-tags"></span> Теги
  </div>
  <div class="panel-body">
    [[!pdoResources? ... ]]
  </div>
</div>
momcom
momcom
Получился вариант с обёрткой и удалением параметра &tplWrapper
Спасибо!
Alex
Alex
Не могли бы вы подсказать правильный вывод тикетов по тегам.
Александр Мальцев
Александр Мальцев
Просто необходимо вместо класса modResource использовать Ticket.
[[!pdoPage?
  &element = `pdoResources`
  &limit=`2`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Ticket": {
      "class": "Ticket",
      "on": "TaggerTagResource.resource = Ticket.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Ticket": "Ticket.id, Ticket.pagetitle, Ticket.description"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `chunkTagRow`
]]
[[!+page.nav]]
Alex
Alex
Спасибо но с таким примером оно работает так же как и с классом modResource разницы никакой нет.
Если пытаешься добавить к выводу в чанке дату то ничего не отображается так же как и при добавлении раздела.
Картинку тоже нет возможности вывести если картинка в тв.
Александр Мальцев
Александр Мальцев
Для этого необходимо добавить в запрос дополнительные объекты и выбрать из них необходимые поля.
Можете посмотреть этот комментарий:
itchief.ru/lessons/modx-revo/modx-tag-cloud#comment-3767

Например, для того чтобы выбрать дату публикации (publishedon), её просто необходимо добавить в параметр &select:
"Ticket": "Ticket.id, Ticket.pagetitle, Ticket.description, Ticket.publishedon",
Для вывода раздела необходимо добавить в параметр &leftJoin объект TicketsSection:
"TicketSection": {
  "class": "TicketsSection",
  "on": "TicketSection.id = Ticket.parent"
},
А также то, что необходимо выбрать в &select:
"TicketSection": "TicketSection.id as idSection, TicketSection.pagetitle as pagetitleSection",
Тоже самое и для TV (например, имеющий id=6).
В параметр &leftJoin:
    "TV": {
      "class": "modTemplateVarResource",
      "on": "TV.contentid = Ticket.id AND TV.tmplvarid = 6"
    }
В параметр &select:
"TV": "TV.value as image"
Например, в итоге вызов сниппета может быть таким:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`2`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Ticket": {
      "class": "Ticket",
      "on": "TaggerTagResource.resource = Ticket.id"
    },
    "User": {
      "class": "modUser",
      "on": "Ticket.publishedby = User.id"
    },
    "TicketTotal": {
      "class": "TicketTotal",
      "on": "TicketTotal.id = Ticket.id"
    },
    "TicketSection": {
      "class": "TicketsSection",
      "on": "TicketSection.id = Ticket.parent"
    },
    "TV": {
      "class": "modTemplateVarResource",
      "on": "TV.contentid = Ticket.id AND TV.tmplvarid = 6"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Ticket": "Ticket.id, Ticket.pagetitle, Ticket.description, Ticket.publishedon",
    "User": "User.username as username",
    "TicketTotal": "*",
    "TicketSection": "TicketSection.id as idSection, TicketSection.pagetitle as pagetitleSection",
    "TV": "TV.value as image"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `chunkTagRow`
]]
[[!+page.nav]]
А чанк chunkTagRow таким:
<div class="panel panel-default">
  <div class="panel-body">
    <h3 class="h4">[[+pagetitle]]</h3><p>[[+description]]</p>
    <p>Дата публикации: [[+publishedon:date=`%d.%m.%Y`]]</p>
    <p>Раздел: <a href="[[~[[+idSection]]]]">[[+pagetitleSection]]</a></p>
    <p>Имя пользователя: [[+username]]</p>
    <p>Количество просмотров: [[+views]]</p>
    <p>Количество комментариев: [[+comments]]</p>
    <p>Избранное (количество): [[+stars]]</p>
    <p>Рейтинг: [[+rating]], плюсовой: [[+rating_plus]], минусовой: [[+rating_minus]]</p>
    <p>Изображение: [[+image]]</p>
    <p class="text-right"><a href="[[~[[+id]]]]" class="btn btn-primary" role="button">Читать далее...	</a></p>
  </div>
</div>
Alex
Alex
Спасибо огромное думаю многим пригодится.
Roman
Roman
Добрый день,
Есть пару вопросов, может поможете:
1. Как вывести название тега на странице «Вывод статей по тегу»
2. Нашел частичный ответ в комментариях: связать вывод статей по тегам c Tickets — «необходимо настроить параметр &select и при необходимости, если нужны данные из других таблиц (объектов), присоединить их с помощью &leftJoin». Но реализация «хромает». Как получить для тикетов данные: автор, просмотры, рейтинг для вывода?
Спасибо
Александр Мальцев
Александр Мальцев
Здравствуйте.
Название тега можно вывести на страницу так:
<h1>Статьи по тегу: [[!#get.tag]]</h1>
Реализовать вывод статей, выполненных посредством дополнения MODX Revolution Tickets, на странице «Вывод статей по тегу» можно так:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`5`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Ticket": {
      "class": "Ticket",
      "on": "TaggerTagResource.resource = Ticket.id"
    },
    "User": {
      "class": "modUser",
      "on": "Ticket.publishedby = User.id"
    },
    "TicketTotal": {
      "class": "TicketTotal",
      "on": "TicketTotal.id = Ticket.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Ticket": "Ticket.id, Ticket.pagetitle, Ticket.description",
    "User": "User.username as username",
    "TicketTotal": "*"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `chunkTagRow`
]]
[[!+page.nav]]
Ну и соответственно добавить необходимые плейсхолдеры в чанк (в данном случае chunkTagRow):
<div class="panel panel-default">
  <div class="panel-body">
    <h3 class="h4">[[+pagetitle]]</h3><p>[[+description]]</p>
    <p>Имя пользователя: [[+username]]</p>
    <p>Количество просмотров: [[+views]]</p>
    <p>Количество комментариев: [[+comments]]</p>
    <p>Избранное (количество): [[+stars]]</p>
    <p>Рейтинг: [[+rating]], плюсовой: [[+rating_plus]], минусовой: [[+rating_minus]]</p>
    <p class="text-right"><a href="[[~[[+id]]]]" class="btn btn-primary" role="button">Читать далее...	</a></p>
  </div>
</div>
Roman
Roman
Добрый день, Александр!
Спасибо от всей души! очень помогли!
Roman
Roman
Добрый день, Александр!
Хотел еще спросить, про «вывод названия тега»,
<h1>Статьи по тегу: [[!#get.tag]]</h1>
(Статьи по тегу: derevo)
так выводится alias тега.
Есть возможность вывести именно «название тега» (Статьи по тегу: Дерево), а не alias?
Спасибо
Александр Мальцев
Александр Мальцев
Написать сниппет (например, showTag):
$tag = $modx->sanitizeString($_GET['tag']);
$where = '{"tag":"'.$tag.'"}';
return $modx->runSnippet('pdoResources', array(
  'loadModels' => 'tagger',
  'class' => 'TaggerTag',
  'tpl' => '@INLINE <p>Статьи по тегу [[+tag]]</p>',
  'where' => $where,
  'sortby' => 'id',
  'limit' => 1
));
Добавить его вызов в необходимое место на странице:
[[!showTag]]
Roman
Roman
Приветствую Александр,
Спасибо большое! Очень помогли! Может и не только мне
Roman
Roman
Попробовал: создал сниппет и добавлял вызов и в шаблон, и в ресурс — тег не выводит.
Если правильно понял, то проблема может $where
или я что-то не так делаю
Александр Мальцев
Александр Мальцев
Да нет, не должно.
Попробуйте тогда по-другому (без использования сторонних компонентов).
Код сниппета showTag:
$modx->addPackage('tagger',MODX_CORE_PATH.'components/tagger/model/');
if (isset($scriptProperties['alias'])) {
  $alias = $scriptProperties['alias'];
  $criteria = array(
    'alias'=>$alias,
  );
  $tag = $modx->getObject('TaggerTag',$criteria);
  if ($tag) {
    $nameTag = $tag->get('tag');
    return $nameTag;
  }
}
return;
Вызов сниппета showTag (в качестве параметра &alias указываем алиас тега ):
[[!showTag? &alias=`bootstrap`]]
[[!showTag? &alias=`[[!#get.tag]]`]]
В качестве результата сниппет возвращает название тега.
Roman
Roman
Приветствую Александр!
Спасибо за помощь! Этот сниппет вывел имя тега.
Еще раз спасибо!
Александр
Александр
Добрый день!
Возможно ли вывести облако тегов не на странице материала, а только на странице родительского каталога материалов, к которому относится этот материал?
Спасибо!
Тим
Тим
[[*isfolder:is=`1`:then=`[[чанк_облака_тегов]]`:else=`[[чанк_материала]]`]]
Выведет чанк тегов только в документах-контейнерах.
Александр
Александр
Так не работает. Мне нужно что бы соответствующее облако выводилось только в том контейнере, в котором материал имеет тег. Сейчас же во всех контейнерах выводится группа тегов, которая к контейнеру не имеет отношение.

Пример: контейнер1. В нем материал1 с тегом «тест1». И контейнер2. В нем материал2 с тегом «тест2».
Нужно вывести в контейнере1 тег «тест1», а в контейнере2- «тест2».
Может есть возможность присвоить группу тегов к определенному контейнеру?
Александр Мальцев
Александр Мальцев
Запрос будет сложный. Здесь либо писать свой сниппет, ли использовать группы. Группу можно назначить к шаблонам.
Тим
Тим
Приветствую, никак не получается связать вывод статей по тегам c Tickets.
[[!pdoPage?
  &element = `getTickets`
  &limit=`2`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "Ticket",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`  
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `tpl.main-block-list`
  &showLog=`1`
]]
[[!+page.nav]]
Лог:
0.0000319: Loaded model "tagger" from "/core/components/tagger/model/"
0.0000560: Query parameters are prepared.
0.0000660: xPDO query object created
0.0002029: leftJoined TicketsSection as Section
0.0001142: leftJoined modUser as User
0.0001090: leftJoined modUserProfile as Profile
0.0008969: leftJoined TicketTotal as Total
0.0006142: leftJoined TaggerTag as NameTag
0.0001180: leftJoined Ticket as Posts
0.0000050: Grouped by Ticket.id
0.0001419: Added selection of TicketsSection: SQL_CALC_FOUND_ROWS `id` AS `section.id`, `type` AS `section.type`, `contentType` AS `section.contentType`, `pagetitle` AS `section.pagetitle`, `longtitle` AS `section.longtitle`, `description` AS `section.description`, `alias` AS `section.alias`, `link_attributes` AS `section.link_attributes`, `published` AS `section.published`, `pub_date` AS `section.pub_date`, `unpub_date` AS `section.unpub_date`, `parent` AS `section.parent`, `isfolder` AS `section.isfolder`, `introtext` AS `section.introtext`, `richtext` AS `section.richtext`, `template` AS `section.template`, `menuindex` AS `section.menuindex`, `searchable` AS `section.searchable`, `cacheable` AS `section.cacheable`, `createdby` AS `section.createdby`, `createdon` AS `section.createdon`, `editedby` AS `section.editedby`, `editedon` AS `section.editedon`, `deleted` AS `section.deleted`, `deletedon` AS `section.deletedon`, `deletedby` AS `section.deletedby`, `publishedon` AS `section.publishedon`, `publishedby` AS `section.publishedby`, `menutitle` AS `section.menutitle`, `donthit` AS `section.donthit`, `privateweb` AS `section.privateweb`, `privatemgr` AS `section.privatemgr`, `content_dispo` AS `section.content_dispo`, `hidemenu` AS `section.hidemenu`, `class_key` AS `section.class_key`, `context_key` AS `section.context_key`, `content_type` AS `section.content_type`, `uri` AS `section.uri`, `uri_override` AS `section.uri_override`, `hide_children_in_tree` AS `section.hide_children_in_tree`, `show_in_tree` AS `section.show_in_tree`, `properties` AS `section.properties`
0.0000222: Added selection of modUser: `username`
0.0000350: Added selection of modUserProfile: `internalKey`, `fullname`, `email`, `phone`, `mobilephone`, `blocked`, `blockeduntil`, `blockedafter`, `logincount`, `lastlogin`, `thislogin`, `failedlogincount`, `sessionid`, `dob`, `gender`, `address`, `country`, `city`, `state`, `zip`, `fax`, `photo`, `comment`, `website`, `extended`
0.0000460: Added selection of Ticket: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0001130: Added selection of TicketTotal: `comments`, `views`, `stars`, `rating`, `rating_plus`, `rating_minus`
0.0000679: Added selection of TaggerTagResource: `tag`, `resource`
0.0000339: Added selection of TaggerTag: NameTag.tag, NameTag.alias
0.0000231: Added selection of Ticket: Posts.id, Posts.pagetitle, Posts.description
0.0001919: Added where condition: class_key=Ticket, NameTag.alias=test
0.0000770: Sorted by TaggerTagResource.resource, ASC
0.0000069: Limited to 2, offset 0
0.0006270: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `Section`.`id` AS `section.id`, `Section`.`type` AS `section.type`, `Section`.`contentType` AS `section.contentType`, `Section`.`pagetitle` AS `section.pagetitle`, `Section`.`longtitle` AS `section.longtitle`, `Section`.`description` AS `section.description`, `Section`.`alias` AS `section.alias`, `Section`.`link_attributes` AS `section.link_attributes`, `Section`.`published` AS `section.published`, `Section`.`pub_date` AS `section.pub_date`, `Section`.`unpub_date` AS `section.unpub_date`, `Section`.`parent` AS `section.parent`, `Section`.`isfolder` AS `section.isfolder`, `Section`.`introtext` AS `section.introtext`, `Section`.`richtext` AS `section.richtext`, `Section`.`template` AS `section.template`, `Section`.`menuindex` AS `section.menuindex`, `Section`.`searchable` AS `section.searchable`, `Section`.`cacheable` AS `section.cacheable`, `Section`.`createdby` AS `section.createdby`, `Section`.`createdon` AS `section.createdon`, `Section`.`editedby` AS `section.editedby`, `Section`.`editedon` AS `section.editedon`, `Section`.`deleted` AS `section.deleted`, `Section`.`deletedon` AS `section.deletedon`, `Section`.`deletedby` AS `section.deletedby`, `Section`.`publishedon` AS `section.publishedon`, `Section`.`publishedby` AS `section.publishedby`, `Section`.`menutitle` AS `section.menutitle`, `Section`.`donthit` AS `section.donthit`, `Section`.`privateweb` AS `section.privateweb`, `Section`.`privatemgr` AS `section.privatemgr`, `Section`.`content_dispo` AS `section.content_dispo`, `Section`.`hidemenu` AS `section.hidemenu`, `Section`.`class_key` AS `section.class_key`, `Section`.`context_key` AS `section.context_key`, `Section`.`content_type` AS `section.content_type`, `Section`.`uri` AS `section.uri`, `Section`.`uri_override` AS `section.uri_override`, `Section`.`hide_children_in_tree` AS `section.hide_children_in_tree`, `Section`.`show_in_tree` AS `section.show_in_tree`, `Section`.`properties` AS `section.properties`, `User`.`username`, `Profile`.`internalKey`, `Profile`.`fullname`, `Profile`.`email`, `Profile`.`phone`, `Profile`.`mobilephone`, `Profile`.`blocked`, `Profile`.`blockeduntil`, `Profile`.`blockedafter`, `Profile`.`logincount`, `Profile`.`lastlogin`, `Profile`.`thislogin`, `Profile`.`failedlogincount`, `Profile`.`sessionid`, `Profile`.`dob`, `Profile`.`gender`, `Profile`.`address`, `Profile`.`country`, `Profile`.`city`, `Profile`.`state`, `Profile`.`zip`, `Profile`.`fax`, `Profile`.`photo`, `Profile`.`comment`, `Profile`.`website`, `Profile`.`extended`, `Ticket`.`id`, `Ticket`.`type`, `Ticket`.`contentType`, `Ticket`.`pagetitle`, `Ticket`.`longtitle`, `Ticket`.`description`, `Ticket`.`alias`, `Ticket`.`link_attributes`, `Ticket`.`published`, `Ticket`.`pub_date`, `Ticket`.`unpub_date`, `Ticket`.`parent`, `Ticket`.`isfolder`, `Ticket`.`introtext`, `Ticket`.`richtext`, `Ticket`.`template`, `Ticket`.`menuindex`, `Ticket`.`searchable`, `Ticket`.`cacheable`, `Ticket`.`createdby`, `Ticket`.`createdon`, `Ticket`.`editedby`, `Ticket`.`editedon`, `Ticket`.`deleted`, `Ticket`.`deletedon`, `Ticket`.`deletedby`, `Ticket`.`publishedon`, `Ticket`.`publishedby`, `Ticket`.`menutitle`, `Ticket`.`donthit`, `Ticket`.`privateweb`, `Ticket`.`privatemgr`, `Ticket`.`content_dispo`, `Ticket`.`hidemenu`, `Ticket`.`class_key`, `Ticket`.`context_key`, `Ticket`.`content_type`, `Ticket`.`uri`, `Ticket`.`uri_override`, `Ticket`.`hide_children_in_tree`, `Ticket`.`show_in_tree`, `Ticket`.`properties`, `Total`.`comments`, `Total`.`views`, `Total`.`stars`, `Total`.`rating`, `Total`.`rating_plus`, `Total`.`rating_minus`, `TaggerTagResource`.`tag`, `TaggerTagResource`.`resource`, NameTag.tag, NameTag.alias, Posts.id, Posts.pagetitle, Posts.description FROM `modx_tagger_tag_resources` AS `TaggerTagResource` LEFT JOIN `modx_site_content` `Section` ON `Section`.`id` = `Ticket`.`parent` LEFT JOIN `modx_users` `User` ON `User`.`id` = `Ticket`.`createdby` LEFT JOIN `modx_user_attributes` `Profile` ON `Profile`.`internalKey` = `User`.`id` LEFT JOIN `modx_tickets_totals` `Total` ON  LEFT JOIN `modx_tagger_tags` `NameTag` ON TaggerTagResource.tag = NameTag.id LEFT JOIN `modx_site_content` `Posts` ON TaggerTagResource.resource = Posts.id WHERE  ( `TaggerTagResource`.`class_key` = 'Ticket' AND `NameTag`.`alias` = 'test' )  GROUP BY Ticket.id ORDER BY TaggerTagResource.resource ASC LIMIT 2 "
0.0003991: Could not process query, error #1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN `modx_tagger_tags` `NameTag` ON TaggerTagResource.tag = NameTag.id LEFT JOI' at line 1
0.0000250: Returning processed chunks
0.0156150: Total time
13 631 488: Memory usage
Пробовал использовать стандартный &where=`[[!TaggerGetResourcesWhere? &tags=`tag` &where=`{«isfolder»: 0}`]]` тоже не получилось.
Посмотрите, пожалуйста, что может быть не так.
Александр Мальцев
Александр Мальцев
Не используйте getTickets. Вместо него применяйте pdoResources. Это связано с тем, что сниппет getTicket не может выполнить то же самое, что и pdoResources, хоть и базируется на его основе.
Тим
Тим
Спасибо за ответ! Пробовал такой вариант, не получилось с помощью pdoResources получить переменные getTickets.
Александр Мальцев
Александр Мальцев
Для этого необходимо настроить параметр &select и при необходимости, если нужны данные из других таблиц (объектов), присоединить их с помощью &leftJoin.
Валерий
Валерий
Александр, добрый день.
В комментариях не нашел ответа, может быть так подскажите.

Я использую вывод материалов через pdoPage с TV-полями (4 поля). У меня так и не вышло заставить систему видеть эти поля на страничке вывода тегов. Большее, что вышло — это вывести одно из полей. Такой записью (лишнее удалил):

&leftJoin=`{
"Tv": {
    "class": "modTemplateVarResource",
    "on": "TaggerTagResource.resource = Tv.contentid AND Tv.tmplvarid = 28"
}
}`
&select=`{
    "Tv": "Tv.value as switch_style"
}`
Если добавлять в строку «Tv.value as switch_style» через запятую «Tv.value as preview_300_img», то выводится все равно одно поле, последнее. Это и понятно. А как сформировать конструкцию так, чтобы подключить 4 TV?

Спасибо.
Валерий
Валерий
На данный момент сделал при помощи FastField — [[#[[+id]].switch_style]], но эта конструкция выполняется почти в 12 раз медленней (Total time: ~ 0.01 без нее против ~ 0.12 с ней). Что ужасно, с учетом, что всего 4 записи выводится…
Александр Мальцев
Александр Мальцев
Здравствуйте, Валерий.
Для этого необходимо подключить несколько TV-полей (а не одно):
&leftJoin=`{
  ...,  
  "TV1": {
    "class": "modTemplateVarResource",
    "on": "TaggerTagResource.resource = TV1.contentid and TV1.tmplvarid=2"
  },
  "TV2": {
    "class": "modTemplateVarResource",
    "on": "TaggerTagResource.resource = TV2.contentid and TV2.tmplvarid=3"
  },
  ...
}`
&select=`{
  ...,
  "TV1": "TV1.value as tv1",
  "TV2": "TV2.value as tv2",
  ...
}`
Валерий
Валерий
Все-таки наращивать таким образом… Спасибо за пример! :) Так заработало. Но забавный момент — эта запись оказалось занимает больше времени, чем моя версия с FastField… При этом, первый раз FastField отнимает почти столько же секунд (около 0.28) и чуть больше оперативной памяти (если я правильно читаю логи — 11 010 048), но во второй и последующие уже почти на 1 секунды быстрее и памяти столько же, сколько запись через LeftJoin.
Александр Мальцев
Александр Мальцев
Тогда можно написать свой собственный сниппет.
Аноним
Аноним
Добрый день, Александр.
Нашел ваш сайт, при попытке настроить Tagger для работы с магазином Minishop2 и mfilter2.
Я понимаю, что вполне может быть вы не сталкивались с этими дополнениями, но решил попытать удачу.
Если сможете, подскажите пожалуйста, как можно заставить товары фильтроваться по тегам Taggera.
Насколько я знаю для вывода в minishop используется тот же pdopage и pdoresources.
Я нашел заметку, все сделал вроде как нужно modx.pro/news/6318-minishop2-tagger/
Осталось лишь написать правильный вызов сниппета, а с этим беда(
Заранее огромная благодарнасть за любую помощь, даже за намек куда копать.
Александр Мальцев
Александр Мальцев
Добрый. В minishop 2 есть же своя система тегов (скриншот).
Аноним
Аноним
Беда в том, что эти теги не совсем полноценные в части построения урл, если использовать их, то будут например такие ссылки:
sitename.ru/catalog/odezhda/?tag=Для детей
А требовались нормальные с транслитом и без get запросов, поэтому пришлось воспользоваться сторонним плагином, с отдельной таблицей, в которой есть поле alias.
В любом случае спасибо, что откликнулись. Два дня мучений и я справился с этим, расширив класс mfiter2.
Аноним
Аноним
Здравствуйте, у меня такая проблема!
Начал тестировать сайт и вот что заметил.

1) Главный вопрос! После удаления нескольких статей, у которых были теги, в облаке тегов они продолжали висеть. Сейчас в итоге есть одна статья с двумя тегами, остальные удалил, почистил кэш. В облаке тегов остались все теги активными и количество статей осталось прежним, как будто он запомнил id статей и продолжает их выводить, не смотря на то что они удалены.

Облако вставлено на самой странице «Статьи» и «Поиск по тегам».
Теги выводятся в «Статьи», «Поиск по тегам», «Статья»
Код облака:
[[!pdoResources?
    &loadModels=`tagger`
    &class=`TaggerTag`
    &leftJoin=`{
        "TaggerTagResources": {
            "class": "TaggerTagResource",
            "on": "TaggerTag.id = TaggerTagResources.tag"
        }
    }`
    &select=`{
        "TaggerTag": "*",
        "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
    }`
    &groupby=`TaggerTag.id`
    &sortby=`TaggerTag.tag`
    &sortdir=`ASC`  
    &tpl=`@INLINE <a href="[[~70]]?tag=[[+alias]]">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
]]
2) Так же в настройках пакета обнаружил, что настройки не работают вообще. Какие бы я галочки не убирал или ставил, они не на что не влияют.
a) Создать тег в настройках статьи я не могу, не смотря на то что галочка стоит (Разрешать создание новых).
b) Удалять не используемые теги — не удаляет
c) При попытке ввести новый тег, выпадает список из уже имеющихся, хотя в настройках стоит показывать «Поле тегов». Но показывает и поле и список.
Может что у меня не так, не знаю.
Заранее спасибо :)
Аноним
Аноним
Второй пункт исправил, пришлось все переустановить. Но вот с удаление все так же. Причем на странице «Поиск по тегам» выводит пустые чанки удаленных статей. Я думаю это не сложно делается, но понятия не имею как это исправить.
Александр Мальцев
Александр Мальцев
Добавьте условие, чтобы он не выбирал удалённые:
[[!pdoResources?
    &loadModels=`tagger`
    &class=`TaggerTag`
    &leftJoin=`{
        "TaggerTagResources": {
            "class": "TaggerTagResource",
            "on": "TaggerTag.id = TaggerTagResources.tag"
        },
        "Posts": {
          "class": "modResource",
          "on": "TaggerTagResources.resource = Posts.id"
        }
    }`
    &where=`{
      "Posts.deleted": "0"
    }`
    &select=`{
        "TaggerTag": "*",
        "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
    }`
    &groupby=`TaggerTag.id`
    &sortby=`TaggerTag.tag`
    &sortdir=`ASC`  
    &tpl=`@INLINE <a href="[[~70]]?tag=[[+alias]]">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
]]
Аноним
Аноним
Вот еще проблема, я думаю это связанно как то с привязкой к id. Если запись не опубликована, то в «Поиск по тегам она отображается» :(
Александр Мальцев
Александр Мальцев
Для создания новых — одной галочки «Разрешать создание новых» недостаточно. Ещё необходимо установить галочку «Разрешённые типы», иначе Вы не сможете вводить значение в это поле.

Удалять не используемые теги работает только если этих тегов нет в базе данных.

Там всё просто достаточно разобраться, что означает каждая из галочек.
Александр Мальцев
Александр Мальцев
Да, по связям в таблицах.
Добавьте условие, чтобы вызов сниппета выбирал только опубликовынные:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`5`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description, Posts.published"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]",
    "Posts.published": "1"
  }`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`
  &tplWrapper =`@INLINE <h2 class="h3">Всего результатов: [[+page.total]]</h2>[[+output]]`
  &tpl= `chunkTagRow`
]]
[[!+page.nav]]
Тогда и выше в коде замени
"Posts.deleted": "0"
на
"Posts.published": "1"
Аноним
Аноним
Все работает, огромное спасибо. Отдельное спасибо за оперативность!
Аноним
Аноним
Была страница на которой с помощью pdoresources выводились дочерние. После установки tagger и прикрепления группы к шаблону дочерних элементов, перестало заходить на страницу где выводились дочерние, 404. Тэгов даже создать не успел. Что я сделал не так?
Александр Мальцев
Александр Мальцев
Смотрите журнал ошибок MODX, может он что подскажет.
Владимир
Владимир
Привет всем.
show for templates без доп. условия (например связи с родительским ресурсом) расстроил. В трех контекстах у меня одинаковые шаблоны для трех разных языков, а вот теги надо разные. Соответственно, в админке сейчас выводятся все три варианта (три группы), боюсь менеджеры будут путаться.
Может у кого то есть мысли, простой костыль, что бы показывать в админке строго в связи с родительским ресурсом?
Аноним
Аноним
Сделал такую выборку вместе с ms2Gallery:
[[!pdoPage?
	&element=`getTickets`
	&tpl=`tpl.begin.blog` 
	&includeContent=`1`
	&ajaxMode=`default`
	&limit=`6`
	&hideContainers=`1`
        &class=`TaggerTagResource`
	&loadModels=`ms2gallery,tagger` 
	&tplPageWrapper=`@INLINE <nav class="pagination-wrapper"><ul class="pagination">[[+prev]][[+pages]][[+next]]</ul></nav>`
	&leftJoin=`{
	"600x400": {"class":"msResourceFile","alias":"600x400", "on": "600x400.resource_id = Ticket.id AND 600x400.path LIKE '%/600x400/' AND 600x400.rank=0"},
	"NameTag": {"class": "TaggerTag","on": "TaggerTagResource.tag = NameTag.id"},
    "Posts": {"class": "modResource","on": "TaggerTagResource.resource = Posts.id"}
	}`
	&select=`{
	"Ticket":"*",
	"600x400":"600x400.url as 600x400",
	"TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
	}`
	&where=`{
    "NameTag.alias": "[[!#GET.tag]]"
	}`
	&sortby=`TaggerTagResource.resource`
	&sortdir=`ASC`
	&showLog=`1`
	]]
Пишет что у него поля выборки нет
0.0000272: Loaded model "ms2gallery" from "//home/admin/web/10lic.ru/private/core/components/ms2gallery/model/"
0.0000100: Loaded model "tagger" from "//home/admin/web/10lic.ru/private/core/components/tagger/model/"
0.0000472: Query parameters are prepared.
0.0000439: xPDO query object created
0.0002000: leftJoined TicketsSection as Section
0.0001440: leftJoined modUser as User
0.0001509: leftJoined modUserProfile as Profile
0.0001478: leftJoined msResourceFile as 600x400
0.0006709: leftJoined TaggerTag as NameTag
0.0001569: leftJoined modResource as Posts
0.0000041: Grouped by Ticket.id
0.0001259: Added selection of TicketsSection: SQL_CALC_FOUND_ROWS `id` AS `section.id`, `type` AS `section.type`, `contentType` AS `section.contentType`, `pagetitle` AS `section.pagetitle`, `longtitle` AS `section.longtitle`, `description` AS `section.description`, `alias` AS `section.alias`, `link_attributes` AS `section.link_attributes`, `published` AS `section.published`, `pub_date` AS `section.pub_date`, `unpub_date` AS `section.unpub_date`, `parent` AS `section.parent`, `isfolder` AS `section.isfolder`, `introtext` AS `section.introtext`, `richtext` AS `section.richtext`, `template` AS `section.template`, `menuindex` AS `section.menuindex`, `searchable` AS `section.searchable`, `cacheable` AS `section.cacheable`, `createdby` AS `section.createdby`, `createdon` AS `section.createdon`, `editedby` AS `section.editedby`, `editedon` AS `section.editedon`, `deleted` AS `section.deleted`, `deletedon` AS `section.deletedon`, `deletedby` AS `section.deletedby`, `publishedon` AS `section.publishedon`, `publishedby` AS `section.publishedby`, `menutitle` AS `section.menutitle`, `donthit` AS `section.donthit`, `privateweb` AS `section.privateweb`, `privatemgr` AS `section.privatemgr`, `content_dispo` AS `section.content_dispo`, `hidemenu` AS `section.hidemenu`, `class_key` AS `section.class_key`, `context_key` AS `section.context_key`, `content_type` AS `section.content_type`, `uri` AS `section.uri`, `uri_override` AS `section.uri_override`, `hide_children_in_tree` AS `section.hide_children_in_tree`, `show_in_tree` AS `section.show_in_tree`, `properties` AS `section.properties`
0.0000241: Added selection of modUser: `username`
0.0000470: Added selection of modUserProfile: `internalKey`, `fullname`, `email`, `phone`, `mobilephone`, `blocked`, `blockeduntil`, `blockedafter`, `logincount`, `lastlogin`, `thislogin`, `failedlogincount`, `sessionid`, `dob`, `gender`, `address`, `country`, `city`, `state`, `zip`, `fax`, `photo`, `comment`, `website`, `extended`
0.0002232: Added selection of Ticket: `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000331: Added selection of msResourceFile: 600x400.url as 600x400
0.0000858: Added selection of TaggerTagResource: `tag`, `resource`
0.0000339: Added selection of TaggerTag: NameTag.tag, NameTag.alias
0.0000319: Added selection of modResource: Posts.id, Posts.pagetitle, Posts.description
0.0002210: Added where condition: class_key=Ticket, NameTag.alias=esn
0.0000720: Sorted by TaggerTagResource.resource, ASC
0.0000060: Limited to 6, offset 0
0.0007141: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `Section`.`id` AS `section.id`, `Section`.`type` AS `section.type`, `Section`.`contentType` AS `section.contentType`, `Section`.`pagetitle` AS `section.pagetitle`, `Section`.`longtitle` AS `section.longtitle`, `Section`.`description` AS `section.description`, `Section`.`alias` AS `section.alias`, `Section`.`link_attributes` AS `section.link_attributes`, `Section`.`published` AS `section.published`, `Section`.`pub_date` AS `section.pub_date`, `Section`.`unpub_date` AS `section.unpub_date`, `Section`.`parent` AS `section.parent`, `Section`.`isfolder` AS `section.isfolder`, `Section`.`introtext` AS `section.introtext`, `Section`.`richtext` AS `section.richtext`, `Section`.`template` AS `section.template`, `Section`.`menuindex` AS `section.menuindex`, `Section`.`searchable` AS `section.searchable`, `Section`.`cacheable` AS `section.cacheable`, `Section`.`createdby` AS `section.createdby`, `Section`.`createdon` AS `section.createdon`, `Section`.`editedby` AS `section.editedby`, `Section`.`editedon` AS `section.editedon`, `Section`.`deleted` AS `section.deleted`, `Section`.`deletedon` AS `section.deletedon`, `Section`.`deletedby` AS `section.deletedby`, `Section`.`publishedon` AS `section.publishedon`, `Section`.`publishedby` AS `section.publishedby`, `Section`.`menutitle` AS `section.menutitle`, `Section`.`donthit` AS `section.donthit`, `Section`.`privateweb` AS `section.privateweb`, `Section`.`privatemgr` AS `section.privatemgr`, `Section`.`content_dispo` AS `section.content_dispo`, `Section`.`hidemenu` AS `section.hidemenu`, `Section`.`class_key` AS `section.class_key`, `Section`.`context_key` AS `section.context_key`, `Section`.`content_type` AS `section.content_type`, `Section`.`uri` AS `section.uri`, `Section`.`uri_override` AS `section.uri_override`, `Section`.`hide_children_in_tree` AS `section.hide_children_in_tree`, `Section`.`show_in_tree` AS `section.show_in_tree`, `Section`.`properties` AS `section.properties`, `User`.`username`, `Profile`.`internalKey`, `Profile`.`fullname`, `Profile`.`email`, `Profile`.`phone`, `Profile`.`mobilephone`, `Profile`.`blocked`, `Profile`.`blockeduntil`, `Profile`.`blockedafter`, `Profile`.`logincount`, `Profile`.`lastlogin`, `Profile`.`thislogin`, `Profile`.`failedlogincount`, `Profile`.`sessionid`, `Profile`.`dob`, `Profile`.`gender`, `Profile`.`address`, `Profile`.`country`, `Profile`.`city`, `Profile`.`state`, `Profile`.`zip`, `Profile`.`fax`, `Profile`.`photo`, `Profile`.`comment`, `Profile`.`website`, `Profile`.`extended`, `Ticket`.`id`, `Ticket`.`type`, `Ticket`.`contentType`, `Ticket`.`pagetitle`, `Ticket`.`longtitle`, `Ticket`.`description`, `Ticket`.`alias`, `Ticket`.`link_attributes`, `Ticket`.`published`, `Ticket`.`pub_date`, `Ticket`.`unpub_date`, `Ticket`.`parent`, `Ticket`.`isfolder`, `Ticket`.`introtext`, `Ticket`.`content`, `Ticket`.`richtext`, `Ticket`.`template`, `Ticket`.`menuindex`, `Ticket`.`searchable`, `Ticket`.`cacheable`, `Ticket`.`createdby`, `Ticket`.`createdon`, `Ticket`.`editedby`, `Ticket`.`editedon`, `Ticket`.`deleted`, `Ticket`.`deletedon`, `Ticket`.`deletedby`, `Ticket`.`publishedon`, `Ticket`.`publishedby`, `Ticket`.`menutitle`, `Ticket`.`donthit`, `Ticket`.`privateweb`, `Ticket`.`privatemgr`, `Ticket`.`content_dispo`, `Ticket`.`hidemenu`, `Ticket`.`class_key`, `Ticket`.`context_key`, `Ticket`.`content_type`, `Ticket`.`uri`, `Ticket`.`uri_override`, `Ticket`.`hide_children_in_tree`, `Ticket`.`show_in_tree`, `Ticket`.`properties`, 600x400.url as 600x400, `TaggerTagResource`.`tag`, `TaggerTagResource`.`resource`, NameTag.tag, NameTag.alias, Posts.id, Posts.pagetitle, Posts.description FROM `lic10_tagger_tag_resources` AS `TaggerTagResource` LEFT JOIN `lic10_site_content` `Section` ON `Section`.`id` = `Ticket`.`parent` LEFT JOIN `lic10_users` `User` ON `User`.`id` = `Ticket`.`createdby` LEFT JOIN `lic10_user_attributes` `Profile` ON `Profile`.`internalKey` = `User`.`id` LEFT JOIN `lic10_ms2_resource_files` `600x400` ON 600x400.resource_id = Ticket.id AND 600x400.path LIKE '%/600x400/' AND 600x400.rank=0 LEFT JOIN `lic10_tagger_tags` `NameTag` ON TaggerTagResource.tag = NameTag.id LEFT JOIN `lic10_site_content` `Posts` ON TaggerTagResource.resource = Posts.id WHERE  ( `TaggerTagResource`.`class_key` = 'Ticket' AND `NameTag`.`alias` = 'esn' )  GROUP BY Ticket.id ORDER BY TaggerTagResource.resource ASC LIMIT 6 "
0.0009739: Could not process query, error #1054: Unknown column 'Ticket.id' in 'field list'
0.0000122: Returning processed chunks
0.3597610: Total time
13 893 632: Memory usage
Помогите пожалуйста
Александр Мальцев
Александр Мальцев
У Вас ошибка в первом leftJoin, т.к. она, не как ни связана с TaggerTagResource.
Аноним
Аноним
Такой вывод нужен из-за использования 1-го изображения галереи ms2gallery, чтобы потом не заполнять отдельно фото анонса. Как же быть в этой ситуации, сможете подсказать? Спасибо
Александр Мальцев
Александр Мальцев
Попробуйте в первом leftJoin поменять Ticket.id на TaggerTagResource.resource.
Аноним
Аноним
Я в отчаянии
&leftJoin=`{
	"600x400": {"class":"msResourceFile","alias":"600x400", "on": "600x400.resource_id = TaggerTagResource.resource AND 600x400.path LIKE '%/600x400/' AND 600x400.rank=0"},
	"NameTag": {"class": "TaggerTag","on": "TaggerTagResource.tag = NameTag.id"},
    "Posts": {"class": "modResource","on": "TaggerTagResource.resource = Posts.id"}
	}`
0.0008740: Could not process query, error #1054: Unknown column 'Ticket.id' in 'field list'
Аноним
Аноним
Заработало только с &element=`pdoResources` вместо &element=`getTickets` только теперь [[+fullname]] не работает и другие плюшки тикета
Аноним
Аноним
Здравствуйте! У меня такая же проблема, вы разобрались как подружить Tickets и Tagger?
Александр Мальцев
Александр Мальцев
Используйте вместо modResource его расширенную версию Ticket
"Posts": { "class": "Ticket", "on": "TaggerTagResources.resource = Posts.id"}
Аноним
Аноним
Здравствуйте, большое спасибо за урок.
У меня возникла не большая проблема как у комментария выше. Не выводятся tv параметры на странице «вывод стайте по тегу» уж не знаю что и делать, всю голову сломал. Подскажите пожалуйста как можно наладить вывод tv параметров.
Вот такая ошибка в логах.
[2016-04-14 02:34:48] (ERROR @ /index.php) [pdoTools] Instantiated a derived class "TaggerTagResource" that is not a subclass of the "modResource", so tvs not joining.
Александр Мальцев
Александр Мальцев
Здравствуйте.
В этой статье работа с тегами осуществляется с помощью компонента Tagger. TV поля не используются.
Аноним
Аноним
А возможно подключить при выводе статей по тегу дополнительно к статье tv поле? Просто у меня через tv поле выводиться изображение к статье, а tagger выводит теги и он работает корректно.
Аноним
Аноним
И еще у меня проблемка — для вывода getProducts я настроил для getPages параметры пагинатора внутри выражения:
[[!getPage?
    &elementClass=`modSnippet`
    &element=`getProducts`
    &tpl=`device-card`
    &sortby=`pagetitle`
    &includeTVs=`1`
    &includeTVList=`price1,image`
    &limit=`10`
    &pageFirstTpl=` <li> <a [[+classes]] href="[[+href]]">Первая</a> </li> `
    &pageLastTpl=` <li> <a [[+classes]] href="[[+href]]">Последняя</a> </li> `
    &pageNextTpl=` <li> <a style="font-size:21px;line-height:17px;"[[+classes]] href="[[+href]]">→</a> </li> `
    &pagePrevTpl=` <li> <a style="font-size:21px;line-height:17px;"[[+classes]] href="[[+href]]">←</a> </li> `
    &pageActiveTpl=` <li class="active"> <a [[+classes]]">[[+pageNo]]</a> </li> `
]]
<p style="display: inline-block;width: 100%;">
	<ul class="pagination">
		[[!+page.nav]]
	</ul>
</p>
А когда помещаю все эти &page...Tpl в приведенное у вас выражение вставлял, почему-то не работает((
Александр Мальцев
Александр Мальцев
Сниппету getPage нельзя таким образом задавать шаблоны (tpl). Изменение стандартных шаблонов в getPage осуществляется через набор свойств.
Аноним
Аноним
Спасибо за туториал!
Я пытаюсь настроить небольшой магазинчик на базе Shopkeeper`a, с tagManager`ом не срастается никак, поэтому я решил воспользоваться компонентом Tagger и без вашего урока сам бы ни за что!
Вобщем, всё хорошо, всё как надо, но на странице вывода связанных с тегом товаров не выводится цена товара, указанная в TV-поле. Причем, картинка, добавляемая также через TV отображается нормально, а цену не выводит((
Может быть как-то можно организовать вывод товаров по тегу через getProducts? Ну или просто что б цену выводил…
Аноним
Аноним
Александр, поможете сделать выборку в два этапа?
А со вторым вопросом?
Александр Мальцев
Александр Мальцев
Саша, не надо дублировать вопросы.
Ответ на 1 вопрос:
itchief.ru/modx/tagger#comment-1821
Чтобы разобраться со вторым вопросом (пустая страница). Для начала посмотри, какая ошибка возникает.
Аноним
Аноним
И ещё вопрос. В чанке «news_blog_item»(который отвечает за вывод отдельного поста в категории), если я вставляю
[[!TaggerGetTags?
  &resources=`[[+id]]` 
  &rowTpl=`@INLINE <a href="[[~29]]?tag=[[+alias]]">#[[+tag]]</a>`
]]
теги выводятся нормально, но в ссылке вместо "[[+alias]]" выводится псевдоним поста "[[*alias]]". Почему может не срабатывать вывод алиаса тега?
Посты вывожу на странице коллекции так:
[[!pdoPage? &element=`pdoResources` &showHidden=`1` &tpl=`news_blog_item` &limit=`1` &includeTVs=`image` &parents=`[[*id]]` &hideContainers=`1` &pageNavVar=`page.nav`]] Страница [[+page]] из [[+pageCount]] [[!+page.nav]]
Аноним
Аноним
Выводи так. Тогда будет алиас тега.
У меня в .haccess прописано так
RewriteRule ^tag/(.*)$ /tag?tag=$1 [L]
и работает.
Не надо создавать новый тип содержимого. Достаточно в текущем удалить расширение. У меня тоже ссылки без html.
Александр Мальцев
Александр Мальцев
Попробуй вместо @INLINE использовать чанк.
Аноним
Аноним
Приветствую, Александр)
Я только начинаю свое знакомство с Modx и пока дается трудновато. Поэтому прошу помочь заставить работать countTags в постах, если выводим их через pdoResources. Как?
[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "ListTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = ListTag.id"
    },
    "Article": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Article.id"
    }
  }`
  &select=`{
    "ListTag": "ListTag.tag as tagName, ListTag.alias as tagAlias"
  }`
  &where=`{
    "Article.id": "[[*id]]"
  }`
  &sortby=`ListTag.alias`
  &sortdir=`ASC`  
  &tpl= `@INLINE <a href="[[~23]]?tag=[[+tagAlias]]">#[[+tagName]] ([[+countTags]])</a>`
]]
Большое спасибо за itchief.ru/modx/tagger#comment-1392

Также нашел здесь же в комментариях способ привести ЧПУ к виду /tag/…
Так вот у меня 23 ресурс выводит статьи по тегу и ссылки имеют вид "/articles/tag?tag=jquery". Ссылку формировал как указано здесь itchief.ru/lessons/modx-revo/modx-tag-cloud#comment-1361 и .htaccess правил соответственно, но выводится белая страница при переходе /articles/tag/… что я сделал не так?
Александр Мальцев
Александр Мальцев
Здравствуйте.
Первый вопрос не совсем понял. Что Вы хотите сделать?
Во втором — необходимо проверить правильность URL (URI) в .htaccess, ресурсах и в параметрах сниппетов.
Аноним
Аноним
[[+countTags]] — не выводится счетчик с общим количеством статей по тегу. Идет выборка через pdoResources, но не в облако тегов в сайдбар, а в каждой статье. Соответственно не понимаю, что дописать в данный код, чтобы начали выводится [[+countTags]] к каждому тегу из ListTag.

Касаемо URL меня стоит Translit и ссылки выводятся без .html на конце(Создал новый Тип содержимого HTML-NO). Формируя ссылки на теги [[+tag]] и добавив в .htaccess RewriteRule ^articles/(.*)$ /articles?tag=$1 [L] пустая страница при переходе по тегу
Александр Мальцев
Александр Мальцев
Тут необходимо выбрать в 2 этапа (например, с помощью pdoResources).
1 Этап. Создаём сниппет (например, mySnippet). Он будет выбирать теги текущего ресурса и выдавать на выходе некоторую строку (условие).
<?php
$pdo = $modx->getService('pdoTools');
$data = $modx->runSnippet('pdoResources', array(
  'loadModels'=>'tagger',
  'class'=>'TaggerTagResource',
  'select' => array(
    'TaggerTagResource' => 'TaggerTagResource.tag'
  ),
  'where' => array(
    'TaggerTagResource.resource' => $resource 
  ),
  'sortby'=> 'TaggerTagResource.tag',
  'sortdir' =>'asc',
  'showLog' => '0',
  'outputSeparator' => ',',
  'tpl' => '@INLINE [[+tag]]'
));
$data = '{"tag:IN":['.$data.']}';
return $data;
На выходе получим что-то такое (где 2,4 — это id тегов текущего ресурса):
{"tag:IN":[2,4]}
2. Выбрать теги с количеством и оставить только те из них, которые соответствуют текущему ресурсу (т.е., например, 2 и 4):
[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &select=`{
    "TaggerTagResource": "TaggerTagResource.tag as tag, COUNT(TaggerTagResource.resource) as countTags",
    "TaggerTag" : "TaggerTag.alias"
  }`
  &leftJoin=`{
    "TaggerTag": {
      "class": "TaggerTag",
      "on": "TaggerTag.id = TaggerTagResource.tag"
    }
  }`
  &where=`[[!mySnippet? &resource=`[[*id]]`]]`	
  &groupby=`TaggerTagResource.tag`
  &sortby=`TaggerTagResource.tag`
  &sortdir=`ASC`  
  &tpl=`@INLINE <a href="[[~23]]?tag=[[+tag]]" class="btn btn-primary">[[+alias]] <span class="badge">[[+countTags]]</span></a>`
]]
Аноним
Аноним
Шеф, может пригодится кому)
Сделал себе такие настройки и стало просто сказка) (скриншот)
Расположил под контентом, чтобы можно было всё сразу на одной странице делать) Теги можно создавать прямо при создании/редактировании материала. Не надо заранее заморачиваться. Неиспользуемые удаляются. И теги сами выводятся под списком, остаётся только мышкой нажать на нужные.
Аноним
Аноним
Александр, Вы можете прокомментировать, чем Ваше решение отличается от _http://realadmin.ru/saytostroy/key-word-in-modx.html? Вроде тоже самое можно сделать, только проще. Спасибо
Александр Мальцев
Александр Мальцев
Решение в представленной ссылке базируется на TV-поле. Для выборки данных используется tagLister и getResources. Здесь приведено решение на базе компонента Tagger. Функционал Tagger намного больше, чем у одного TV-поля. Вот основное отличие. Чтобы что-то дальше сравнивать необходимо проводить анализ быстродействия. Если функционал особо не нужен, то какое решение будет быстрее, то лучше. Жалко, что в указанном ресурсе нет картинок, чтобы посмотреть, что хоть там получилось…
Аноним
Аноним
Я правильно понимаю, что с помощью групп Tagger-а можно выводить теги разных категорий публикаций и разделять их? Т.е. у меня есть новости и есть раздел с нормативной базой и их можно независимо теггировать и выводить.
Александр Мальцев
Александр Мальцев
Tagger позволяет создавать группы, а уже к группам привязывать теги. Т.е. теги, например, у одной группы будут одни, а у другой — будут другие. Группы тоже можно привязывать к различным ресурсам (а точнее шаблонам).Т.е. новости могут иметь один набор тегов, а нормативная база — другие.
Аноним
Аноним
Шеф, возникло два вопроса)
1. На странице с одной статьёй облако тегов, которое в правой колонке, выводится без проблем. Но на главной странице блога и на всех таких страницах (т.е. разделы с тикетами которые) вместо облака тегов подгружаются статьи в виде блога, как на самой странице. Я так понимаю это из-за плейсхолдера [[+output]], который, по ходу, тоже Тикетсом используется. Может надо какие-то манипуляции сделать как здесь со сниппетом mSearch?

2. Как сделать, чтобы сами теги ещё отображались в статьях на главной странице блога? С параметром
&resources=`[[*id]]`
ничего не выводит, видимо, не может id подцепить. А без этого параметра выводятся все используемые теги.
Александр Мальцев
Александр Мальцев
Но, не используй output.
Сделай следующим образом:
<div class="panel panel-primary">
  <div class="panel-heading">
    <span class="glyphicon glyphicon-tags"></span> Теги
  </div>
  <div class="panel-body">
    [[!pdoResources?
      &loadModels=`tagger`
      &class=`TaggerTag`
      &leftJoin=`{
        "TaggerTagResources": {
	  "class": "TaggerTagResource",
	  "on": "TaggerTag.id = TaggerTagResources.tag"
        }
      }`
      &select=`{
        "TaggerTag": "*",
	"TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
      }`
      &groupby=`TaggerTag.id`
      &sortby=`TaggerTag.tag`
      &sortdir=`ASC`  
      &tpl=`@INLINE <a href="[[~20]]?tag=[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
    ]]
  </div>
</div>
Если вывод статей осуществляешь с помощью getTicket, то необходимо сделать следующее:
1. Сделать копию чанка tpl.Tickets.list.row, например, с именем tpl.Tickets.list.row2.
2. Открыть чанк и добавить в него вызов TagerGetTags, например, под названием статьи:
<div class="tickets-row">
  <h3 class="title"><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h3>
  [[TaggerGetTags?
    &resources=`[[+id]]`
    &rowTpl=`@INLINE <div class="btn-group"><span class="btn btn-primary btn-sm">#</span><a class="btn btn-info btn-sm" href="[[~20]]?tag=[[+alias]]">[[+tag]]</a></div>`
  ]]
3. Указать данный чанк в качестве параметра &tpl:
[[!pdoPage? &element=`getTickets` &tpl=`tpl.Tickets.list.row2` &limit=`5`]]
[[!+page.nav]]
Аноним
Аноним
Александр, очередной раз огромная благодарность тебе! Всё работает. Думал, что без output не будут теги выводится)
По п.п. 1,2,3 у меня и так все было сделано) Надо только было
&resources=`[[*id]]`
заменить на
&resources=`[[+id]]`
Но появился такой косячок:
Ссылка вида
&rowTpl=`@INLINE <a href="[[~44]]?tag=[[+alias]]"><i class="fa fa-hashtag"></i>[[+tag]]</a>`
в статьях и облаке ведёт как и надо на _http://site.ru/show-posts?tag=алиас тега
А в разделах с тикетами, то бишь на главной станице блога на _http://site.ru/show-posts?tag=алиас статьи
Я так понимаю [[+alias]] перехватывается Тикетсом) Как тут-то быть?)
Александр Мальцев
Александр Мальцев
Дать другие имена:
&select=`{
  "TaggerTag": "TaggerTag.tag as tagName, TaggerTag.alias as tagAlias",
  "TaggerTagResources": "COUNT(TaggerTagResources.tag) as countTags"
}`
Ну и соответственно использовать их при выводе:
&tpl=`@INLINE <a href="[[~20]]?tag=[[+tagAlias]]" class="btn btn-primary">[[+tagName]] <span class="badge">[[+countTags]]</span></a>`
Аноним
Аноним
В облаке тегов работает как положено. А вот в самих статьях и на странице блога не подхватывает новые имена. По аналогии даже не пойму, что туда добавить нужно) Пробовал добавить select такой же. Не работает.
Я только не могу понять, как самому в этом начать соображать) Учить php и sql?
Александр Мальцев
Александр Мальцев
Это можно сделать с помощью pdoResources:
[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "ListTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = ListTag.id"
    },
    "Article": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Article.id"
    }
  }`
  &select=`{
    "ListTag": "ListTag.tag as tagName, ListTag.alias as tagAlias"
  }`
  &where=`{
    "Article.id": "[[*id]]"
  }`
  &sortby=`ListTag.alias`
  &sortdir=`ASC`  
  &tpl= `@INLINE <div class="btn-group"><span class="btn btn-primary btn-sm">#</span><a class="btn btn-info btn-sm" href="[[~20]]?tag=[[+tagAlias]]">[[+tagName]]</a></div>`
]]
Аноним
Аноним
От души!
Аноним
Аноним
Александр, а как сделать вывод тегов только определенной группы при этом решении?
Аноним
Аноним
Пробовал через .htaccess сделать красивый урл, но ничего не выходит.
RewriteRule ^tag/([^/]+)$ /tag?tag=$1 [L]
Аноним
Аноним
Зачем такой огород, когда можно сразу сделать нужную ссылку?)
Аноним
Аноним
Спасибо за статью! Подскажите, пожалуйста, как на странице вывода списка статей по тегу получить его название.
Александр Мальцев
Александр Мальцев
Здравствуйте, тег и его alias находится в таблице (классе) TaggerTag.
Получить его можно следующим образом:
[[!pdoResources?
  &loadModels=`tagger`
  &class=`TaggerTag`
	&where=`{
	"TaggerTag.alias": "modx"
  }`
  &select=`{
    "TaggerTag": "[[!#GET.tag]]"
	}`
  &sortby=`TaggerTag.tag`
  &tpl=`@INLINE <h3>Тег: [[+tag]]</h3>`
  &fastMode=`1`
]]
Аноним
Аноним
Шеф, не пойму куда этот код затусовать, чтобы в шаблоне вывода статей по тегу можно было бы добавить его имя.
Например,
&tplWrapper =`@INLINE <h2 class="h3">Всего результатов по тегу [[+tagName]]: [[+page.total]]</h2>[[+output]]`
Или как нибудь ещё.
Александр Мальцев
Александр Мальцев
Плейсхолдер tagName можно использовать только в чанке, указанном в качестве значения параметра tpl.
Аноним
Аноним
Шеф, вот тут-то мне, видимо, нужен развёрнутый ответ) Я не пойму куда и как правильно вставить этот код, чтобы на странице «Статьи по тегу» можно было вывести его название. А то получается Всего результатов: и дальше пошёл список статей. Не совсем понятно по какому тегу они выведены. Пробовал ради эксперимента вставить этот код перед и после вызова сниппета pdoPage, ничего не происходит.
Догадался только изменить код в вызове сниппета pdoPage
"NameTag": "NameTag.tag as tagName, NameTag.alias as tagAlias",
и добавить
<h1>Всего результатов по тегу <i class="fa fa-hashtag"></i>[[+tagName]]: [[+page.total]]</h1>
в чанк, указанном в качестве значения параметра tpl.
Но тогда получается Всего результатов по тегу Разное: 4 перед каждой статьёй.
Как быть то?)
Александр Мальцев
Александр Мальцев
В шаблоне:
[[!pdoPage?
  &element = `pdoResources`
  &limit=`2`
  &loadModels=`tagger`
  &class=`TaggerTagResource`
  &leftJoin=`{
    "NameTag": {
      "class": "TaggerTag",
      "on": "TaggerTagResource.tag = NameTag.id"
    },
    "Posts": {
      "class": "modResource",
      "on": "TaggerTagResource.resource = Posts.id"
    }
  }`
  &select=`{
    "TaggerTagResource": "*",
    "NameTag": "NameTag.tag, NameTag.alias",
    "Posts": "Posts.id, Posts.pagetitle, Posts.description"
  }`
  &where=`{
    "NameTag.alias": "[[!#GET.tag]]"
  }`
  &tplWrapper =
    `@INLINE <h2 class="h3">Всего результатов ([[+page.total]]) по тегу  
    [[!pdoResources?
      &loadModels=`tagger`
      &class=`TaggerTag`
      &where=`{
	"TaggerTag.alias": "[[!#GET.tag]]"
      }`
      &select=`{
        "TaggerTag": "TaggerTag.tag as tagPage"
      }`
      &sortby=`TaggerTag.tag`
      &tpl=`@INLINE [[!+tagPage]]`
    ]]
    </h2>[[+output]]`
  &tpl= `chunkTagRow`
  &sortby=`TaggerTagResource.resource`
  &sortdir=`ASC`
]]
[[!+page.nav]]
Аноним
Аноним
Огромная благодарность тебе! Я даже и не думал, что так можно. Буду рад очередным новым и полезным урокам.
Аноним
Аноним
Шеф, лучи добра тебе за очередной полезные материал!
Только надо в параметры вывода тегов добавить
&resources=`[[*id]]`
А то так он выводит ко всем статьям одинаковые теги, добавленные в разные статьи.
Пол дня голову ломал из-за чего так) Уже хотел у тебя тут снова помощи просить, но рад, что сам догадался)
И ещё
allow tag — определяет, можно ли не указывать теги.
Allow blank же)
Аноним
Аноним
Спасибо за подробную статью.
Подскажите пожалуйста, теги на кириллице поддерживаются? и возможно ли формировать красивый урл к тегам для поисковой индексации?
Спасибо!
Аноним
Аноним
Конечно поддерживаются. Что мешает попробовать?)
В статье же всё написано
Например, тег bootstrap имеет следующий URL:
http://site.ru/show-posts?tag=bootstrap
Или это некрасивый урл?)
Аноним
Аноним
Да, я уже опробовал кириллицу. У меня просто до этого было проблема с похожим компонентом, поэтому и спросил.
Красивый урл это вот так: site.ru/tags/name_tag/ — можно такой сделать?
Аноним
Аноним
Вывод тегов организуем с помощью ссылок, каждая из которых будет иметь следующее значение атрибута href:
[[~20]]?tag=[[+alias]]
где:
[[~20]] — URL ресурса «Вывод статей по тегу». Данный ресурс будем использовать для вывода статей, имеющих указанный тег.
[[+alias]] — значение передаваемого GET-параметра tag. Данное значение будем использовать в ресурсе [[~20]] для создания запроса к базе данных, выбирающих из неё только записи, имеющие этот тег.
Следовательно:
<a href="[[~20]]/[[+alias]]">
Либо
<a href="[[~20]]/[[+tag]]">
если алиас отличается от имени. При этом псевдоним страницы должен быть tags.
Аноним
Аноним
У вас нет параметра. Такая конструкция буде 404

Данная страница будет выводить список статей, которые имеют указанный тег. Как Вы уже наверно догадались, получать тег эта страница будет из URL (из GET параметра tag).
Александр Мальцев
Александр Мальцев
Спасибо, Алексей.
Александр Мальцев
Александр Мальцев
Добавьте в .htaccess правило:
RewriteRule ^show-posts/(.*)$ /show-posts?tag=$1 [L]
Аноним
Аноним
К сожалению не работает.
Александр Мальцев
Александр Мальцев
Чтобы это работало необходимо очистить кэш сайта.
В итоге будет: _http://mysite.ru/show-posts/modx == _http://mysite.ru/show-posts?tag=modx
Аноним
Аноним
Я чистил кэш. Не работает, и к тому же перестают выводиться тегированые записи.
Аноним
Аноним
Действительно. Я что-то подумал, что можно самому урл сформировать.
Александр Мальцев
Александр Мальцев
URL тоже надо формировать:
&tpl=`@INLINE <a href="[[~20]]/[[+alias]]" class="btn btn-primary">[[+tag]] <span class="badge">[[+countTags]]</span></a>`
В итоге получается следующая картина:
_http://mysite.ru/show-posts/modx
_http://mysite.ru/show-posts/bootstrap
и т.д.
Но, у нас то этих страниц нет. А есть только одна страница:
_http://mysite.ru/show-posts
Которая может принимать GET-параметр tag:
_http://mysite.ru/show-posts?tag=modx
_http://mysite.ru/show-posts?tag=bootstrap
и т.д.
И чтобы всё это работало необходимо дополнительно написать правило в .htaccess, которое делало бы следующее
_http://mysite.ru/show-posts/modx => _http://mysite.ru/show-posts?tag=modx
_http://mysite.ru/show-posts/bootstrap => _http://mysite.ru/show-posts?tag=bootstrap
и т.д.
Т.е. RewriteRule ^show-posts/(.*)$ /show-posts?tag=$1 [L] или какое-то другое в зависимости от сервера.
Аноним
Аноним
Очередная порция лучей добра тебе) У меня всё работает)
Аноним
Аноним
С делал как Александр ниже написал. У меня всё работает. Ты бы хоть код свой привёл)
Аноним
Аноним
Александр, большое спасибо вам! Все работает!
GoldBird
GoldBird
Добрый день,

у меня не работает для английского контекста данное правило. i.imgur.com/73PIMlf.png

Русский язык (/ru/) выводит корректно, а основной язык (/) никак не хочет выводить результаты, показывает лишь мою страницу 404 для этого контекста.

RewriteEngine On
RewriteBase /

RewriteRule ^ru/posts/([^/]*)$ /ru/posts?tag=$1 [L]
RewriteRule ^/posts/([^/]*)$ /posts?tag=$1 [L]
Помогите, пожалуйста, как правильно их объединить?

Кэш чистил, чуть ниже (на скриншоте скрыто) правило редиректа для одной странице, оно никак не влияет.
Silence
Silence
Александр, добрый вечер.
Бьюсь над этими красивыми урлами уже неделю, но даже поддержка моего хостинга предложила «спросить в интернете». Хостинг TimeWeb, раньше на другом проекте красивые урлы у Tagger работали.

Подскажите, пожалуйста, может быть у вас есть опыт других записей в htaccess, кроме вышеуказанной вами:
RewriteRule ^show-posts/(.*)$ /show-posts?tag=$1 [L]
В поддержке пытались сделать так:

RewriteCond %{REQUEST_URI} ^vyvod-tegov/$
RewriteCond %{QUERY_STRING} ^tag=1$
RewriteRule ^vyvod-tegov/$ /vyvod-tegov?tag=$1 [L]
Тоже не работает.

Ссылку формирую так:
<a href="[[~145]][[+alias]]">[[+tag]]</a>
Silence
Silence

Всем добрый день.

Может быть кто-то сталкивался с проблемой вывода статей по тегу на связке ModxRevo 3.03 и Tagger 2.0.0. Сами теги проставляются корректно, даже с кириллицей и формированием alias проблем нет, но вот на странице вывода тега, при помощи инструкции Александра, ничего не отображается. В логах ошибки, такое ощущение, что компонент сильно поменял структуру, но я не знаю, где найти новую:
09:57:35 ERROR
Path specified for package tagger is not a valid or accessible directory:  /core/components/tagger/model/ 
Could not load class: TaggerTagResource from mysql.taggertagresource
Could not load class TaggerTagResource
[pdoTools] Could not join TVs to the class "TaggerTagResource" that is not a subclass of the "modResource". Try to specify correct class in the "joinTVsTo" parameter.
Could not load class: TaggerTag from mysql.taggertag
No class specified for loadClass
Could not load class
TaggerTagResource::getSelectColumns() is not a valid static method.
No class specified for loadClass
Could not load class: TaggerTagResource from mysql.taggertagresource
[pdoTools] Error 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN `modx_saassite_content` `Posts` ON TaggerTagResource.resource = Posts.' at line 1
Silence
Silence

Одним сообщением не влезло. Вот вывод, который я пытаюсь сделать:

[[!pdoPage?
            &element=`pdoResources`
            &parents=`4`
            &limit=`2`
            &includeTVs=`img_prev,blog_date_prev,blog_anounce`
            &tpl=`other_item`
            &loadModels=`tagger`
            &class=`TaggerTagResource`
            &leftJoin=`{
                "NameTag": {
                  "class": "TaggerTag",
                  "on": "TaggerTagResource.tag = NameTag.id"
                },
                "Posts": {
                  "class": "modResource",
                  "on": "TaggerTagResource.resource = Posts.id"
                }
            }`
            &select=`{
                "TaggerTagResource": "*",
                "NameTag": "NameTag.tag, NameTag.alias",
                "Posts": "Posts.id, Posts.pagetitle, Posts.description"
            }`
            &where=`{
            "NameTag.alias": "[[!#GET.tag]]"
            }`
            &sortdir=`ASC`
            &tplPageWrapper=`@INLINE <ul class="pagination">[[+prev]][[+pages]][[+next]]</ul>`
            &tplPage=`@INLINE <li class="pagination-item"><a class="pagination-link" href="[[+href]]">[[+pageNo]]</a></li>`
            &tplPageActive=`@INLINE <li class="pagination-item pagination-item_active"><span>[[+pageNo]]</span></li>`
            &tplPagePrev=`@INLINE <li class="pagination__arrow_control pagination__arrow pagination__arrow_left"><a href="[[+href]]"></a></li>`
            &tplPageNext=`@INLINE <li class="pagination__arrow_control pagination__arrow pagination__arrow_right"><a href="[[+href]]"></a></li>`
            &tplPagePrevEmpty=`@INLINE <li class="pagination__arrow_disabled pagination__arrow pagination__arrow_left"><span></span></li>`
            &tplPageNextEmpty=`@INLINE <li class="pagination__arrow_disabled pagination__arrow pagination__arrow_right"><span></span></li>`
        ]]
Viatcheslav
Viatcheslav

Аналогичная проблема. ModxRevo 3.03 и Tagger 2.0.0. Все работает, кроме вывода материалов по тегам. Ошибки в логе те же. Не удалось решить пробему?

Silence
Silence

Пока что нет. Сейчас сажусь разбираться дальше.

Silence
Silence

Разобрался.

В версии 3, видимо, нет папки model, вот и ошибки.

Но теперь там есть специальный сниппет для использования в where

&where=`[[!TaggerGetResourcesWhere? &tags=`[[!#GET.tag]]` &where=`{"isfolder": 0}`]]`

У меня вот такое сработало отлично:

[[!pdoPage?
            &element=`pdoResources`
            &parents=`4`
            &limit=`2`
            &includeTVs=`img_prev,blog_date_prev,blog_anounce`
            &tpl=`other_item`
            
            &where=`[[!TaggerGetResourcesWhere? &tags=`[[!#GET.tag]]` &where=`{"isfolder": 0}`]]`
            &sortdir=`ASC`
            &tplPageWrapper=`@INLINE <ul class="pagination">[[+prev]][[+pages]][[+next]]</ul>`
            &tplPage=`@INLINE <li class="pagination-item"><a class="pagination-link" href="[[+href]]">[[+pageNo]]</a></li>`
            &tplPageActive=`@INLINE <li class="pagination-item pagination-item_active"><span>[[+pageNo]]</span></li>`
            &tplPagePrev=`@INLINE <li class="pagination__arrow_control pagination__arrow pagination__arrow_left"><a href="[[+href]]"></a></li>`
            &tplPageNext=`@INLINE <li class="pagination__arrow_control pagination__arrow pagination__arrow_right"><a href="[[+href]]"></a></li>`
            &tplPagePrevEmpty=`@INLINE <li class="pagination__arrow_disabled pagination__arrow pagination__arrow_left"><span></span></li>`
            &tplPageNextEmpty=`@INLINE <li class="pagination__arrow_disabled pagination__arrow pagination__arrow_right"><span></span></li>`
        ]]
Viatcheslav
Viatcheslav

Спасибо добрый человек! Теперь и у меня работает