[tvSuperSelect] 1.1.1 с новыми сниппетами для вывода




В новой версии tvSuperSelect у нас появилось 3 сниппета для вывода ресурсов/тикетов с тегами и списка тегов ресурса.

Сниппет tvssResources


Выводит ресурсы по тегу/тегам. Сниппет отдаёт все параметры в pdoFetch, поэтому можно указывать любые параметры pdoTools. Понимает Fenom, может работать с pdoPage.
Пример выборки ресурсов с тегами «tag1», «tag2», «tag3» прописанными в TV с ID 17 или 19:
{$_modx->runSnippet('pdoPage', [
    'element' => 'tvssResources',
    'tv' => '17,19',
    'tag' => 'tag1||tag2||tag3',
    'parents' => 0,
    'tpl' => '@INLINE <div>{$id} - {$pagetitle}</div>',
])}
{$_modx->getPlaceholder('page.nav')}
Теги можно указать, как параметром в сниппет, так и в GET запросе в параметре tag. Сниппет перебивает указанный тег в GET запросе.

Сниппет tvssTickets


Выводит тикеты компонента Tickets по тегу/тегам. Отдаёт все параметры в getTickets, поэтому можно указывать любые доступные параметры getTickets.
Пример выборки тикетов с тегами «tag1», «tag2», «tag3» прописанными в TV с ID 17 или 19:
{$_modx->runSnippet('pdoPage', [
    'element' => 'tvssTickets',
    'tv' => '17,19',
    'tag' => 'tag1||tag2||tag3',
    'parents' => 0,
])}
{$_modx->getPlaceholder('page.nav')}
Теги можно указать, как параметром в сниппет, так и в GET запросе в параметре tag. Сниппет перебивает указанный тег в GET запросе.

Сниппет tvssTags


Выводит список тегов ресурса.
Пример вывода всех тегов из ТВ поля 17, указанных в ресурсе 1. В ссылке тега формируется УРЛ для ресурса 2, на котором располагается сниппет tvssResources:
{$_modx->runSnippet('tvssTags', [
    'id' => $_modx->resource.id,
    'tv' => 17,
    'pageId' => 2,
])}
В список параметров также входит: tpl, tplWrapper, outputSeparator, toPlaceholder.

Инструкция по созданию тегов на сайте


Внимание! Инструкция описана с использованием Fenom. Если на Вашем сайте он не используется по религиозным соображениям, то придётся самостоятельно переделать весь код из примеров на стандартный синтаксис.
  1. После установки компонента создаём новое ТВ с типом tvSuperSelect. Запоминаем ID ТВшки. Например — 2.
  2. Создаём ресурс "Ресурсы с тегом". Запоминаем ID ресурса. В нашем случае — 2.
    В longtitle прописываем:
    Ресурсы с тегом{$.get['tag'] ? ' «'~($.get['tag']|unescape:"url")~'»' : ''}
    • Контент для вывода списка ресурсов:
      {if $.get['tag']?}
          <div id="pdopage">
              <div class="rows">
                  {$_modx->runSnippet('pdoPage', [
                      'element' => 'tvssResources',
                      'tv' => '2',
                      'parents' => 0,
                      'ajaxMode' => 'default',
                      'tpl' => '@INLINE <div>{$id} - {$pagetitle}</div>',
                  ]) ?: 'Ресурсов по данному тегу не найдено'}
              </div>
              {$_modx->getPlaceholder('page.nav')}
          </div>
      {else}
          Укажите тег для выборки документов
      {/if}
    • Контент для вывода списка тикетов:
      {if $.get['tag']?}
          <div id="pdopage">
              <div class="rows">
                  {$_modx->runSnippet('pdoPage', [
                      'element' => 'tvssTickets',
                      'tv' => '2',
                      'parents' => 0,
                      'ajaxMode' => 'default',
                  ]) ?: 'Тикетов по данному тегу не найдено'}
              </div>
              {$_modx->getPlaceholder('page.nav')}
          </div>
      {else}
          Укажите тег для выборки документов
      {/if}
  3. В шаблоне (или чанке), в котором у Вас выводится полная статья или тикет, указываем вывод списка тегов:
    {$_modx->runSnippet('tvssTags', [
        'id' => $_modx->resource.id,
        'tv' => 2,
        'pageId' => 2,
    ])}
Павел Гвоздь
17 марта 2016, 11:10
modx.pro
14
5 316
+10
Поблагодарить автора Отправить деньги

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

Алексей Федоров
17 марта 2016, 15:22
0
Сразу возникает вопрос, если tvssResources — сниппет, а не плагин, то его нужно где-то как-то вызывать? То есть при клике на тег тикета, автоматической перезагрузки страницы с выдачей выборки ресурсов по тегу не происходит?
    Павел Гвоздь
    17 марта 2016, 16:35
    +1
    То есть при клике на тег тикета, автоматической перезагрузки страницы с выдачей выборки ресурсов по тегу не происходит?
    Происходит.

    Вызов данного сниппета я описал в посте.

    Поясню.
    1) На странице с ID 2 мы вызываем сниппет tvssResources:
    {$_modx->runSnippet('pdoPage', [
    	'element' => 'tvssResources',
    	'tv' => '17',
    	'parents' => 0,
    	'tpl' => '@INLINE <div>{$id} - {$pagetitle}</div>',
    ])}
    {$_modx->getPlaceholder('page.nav')}
    Не забываем указать в параметре &tv — ID своего TV поля с тегами.

    2) На странице вывода информации о ресурсе вызываем сниппет tvssTags:
    {$_modx->runSnippet('tvssTags', [
    	'id' => $_modx->resource.id,
    	'tv' => 17,
    	'pageId' => 2,
    ])}
    Также, не забыв указать в параметр &tv и &pageId свои значения.
      Алексей Федоров
      17 марта 2016, 16:58
      0
      Со второго раза более-менее понял, спасибо)
      Нужен мини-мануал какой-нибудь. Проще говоря, нужно заранее создать служебную страницу (в примере с id = 2), на которой будут выводиться результаты.
      Пока сложно понять как будет работать с выбором нескольких тегов одновременно. То есть, кликнул на одном теге, вывело список аналогичных ресурсов, а там уже все-все теги и можно выбирать несколько или…

      Короче, нужны скрины или короткое видео демонстрации работы, а еще лучше демка, на которой по этим тегам покликать можно =) Опробовать лично смогу только после переустановки modx ибо от моих экспериментов, он уже тупить начал (не работает часть системных коннекторов).

      P.S.: Возможность указывать несколько tv очень радует) Если правильно понял, то можно несколько категорий тв сделать, чтобы визуально проще было, а сниппет будет обрабатывать все (к примеру, одна тв — города, а вторая — организации)
        Павел Гвоздь
        17 марта 2016, 17:54
        0
        Просто надо взять и попробовать примеры из поста — наглядно всё становится понятно…

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

        Также, не вижу смысла в скриншотах (что скринить то?) и видео.
          Алексей Федоров
          17 марта 2016, 19:05
          0
          Служебной страницы делать не вижу смысла
          Тогда я опять ничего не понял((

          Компонент опробую сегодня-завтра, но что-то запутался. Вот есть у меня tv — tag, есть шаблон для поста на Tickets, в котором нужно вызвать tvssTags с указанным id тв для тегов, правильно?

          Куда в таком случае вставлять tvssResources? На этой же странице?
            Павел Гвоздь
            17 марта 2016, 19:18
            0
            Служебной страницы делать не вижу смысла
            Тогда я опять ничего не понял((
            Это я про внедрение служебной страницы в компонент из коробки. Тебе же нужно её создавать, т.к. без ресурса заточенного под эту функцию, ты не выведешь список ресурсов по определённому тегу.
              Алексей Федоров
              17 марта 2016, 19:39
              0
              а, фух)) про добавление страницы «в коробку» я не говорил. Тут ты разработчик, тебе и карты в руки. Просто не все с ходу разберутся как использовать компонент. Ладно, как опробую в работе, отпишусь о впечатлении. Лучше все своими руками пощупать
                Павел Гвоздь
                18 марта 2016, 06:12
                +1
                Написал инструкция по созданию тегов на сайте. Можешь прочитать выше.
Виталий Барышников
18 марта 2016, 03:37
1
0
У меня снова вопрос. Попробовал — работает с обычными ресурсами отлично. Можно ли подружить tvssResources с тикетами? Т.е. переделать getTickets + tvssResources (пусть называется, например tvssTickets).

Вот так работает, но естественно не доп.полей тикетов:
[[!pdoPage@wmPages?
	&element=`tvssResources`
	&elementClass=`modSnippet`
	&loadModels=`ms2gallery`
	&tv=`2`
	&parents=`12`
	&hideContainers=`1`
	&leftJoin=`{"500x": {
	"class":"msResourceFile",
	"alias":"500x",
	"on": "500x.resource_id = modResource.id AND 500x.path LIKE '%/72x72/' AND 500x.rank=0"}}`
	&select=`{"modResource":"*", "500x":"500x.url as 500x"}`
	&tpl=`categoryPostTpl`]]

	[[!+page.nav]]
Вот так хотелось бы чтобы работало:
[[!pdoPage@wmPages?
  &element=`tvssTickets`
  &loadModels=`ms2gallery`
  &tv=`2`
  &parents=`12`
  &tpl=`categoryPostTpl`
  &hideContainers=`1`
  &leftJoin=`{
  "500x": {
	"class":"msResourceFile",
	"alias":"500x",
	"on": "500x.resource_id = Ticket.id AND 500x.path LIKE '%/500x/' AND 500x.rank=0"},
  "View": {"class": "TicketView","on": "Ticket.id = View.parent"}}`
  &select=`{
  "Ticket": "*",
  "500x":"500x.url as 500x"}`
  &groupby=`Ticket.id`
  &sortby=`{"publishedon":"DESC"}`
  ]]
</div>

  [[!+page.nav]]
    Павел Гвоздь
    18 марта 2016, 05:10
    +3
    Специально для тебя добавил tvssTickets. Обновляйся. Вызывать также, как и tvssResources. То есть, у сниппета есть свои параметры, а все остальные уйдут в getTickets.

    Пример:
    {$_modx->runSnippet('pdoPage', [
    	'element' => 'tvssTickets',
    	'tv' => '17,19',
    	'parents' => 0,
    ])}
    {$_modx->getPlaceholder('page.nav')}
      Виталий Барышников
      18 марта 2016, 07:37
      0
      Оперативно, эксклюзив) Прикрутил, работает отлично. Теперь, кажется, вопрос тегов решен. Планируются какие-то новые версии, функционал? Хотя мне кажется этого достаточно, компонент делает, то что от него нужно.
    Владимир
    18 марта 2016, 13:12
    0
    Отличный компонент!
    Маленький вопрос. Указал ID страницы «Ресурсы с тегом», ссылка формируется с ее алиасом (у меня это tags) но не от корня, а от раздела, в котором лежит документ.
    В настройках сайта у меня Схема URL link_tag_scheme abs
    Или нужно только link_tag_scheme -1?
    что бы формировались ссылки от корня, а не так:
    site.tld/eksport/tags?tag=слово
    PS может есть возможность указывать параметры формирования ссылки для снипета tvssTag?
      Павел Гвоздь
      18 марта 2016, 13:32
      0
      Ок, я понял тебя, обновляйся)
        Владимир
        18 марта 2016, 13:54
        0
        О! и сразу стало веселее, а то к +link? $scheme=`abs` пробовал- не помогало))
      Владимир
      18 марта 2016, 13:36
      0
      к выше написанному
      поменял Схема URL link_tag_scheme abs на -1, но формирование ссылки на страницу «Ресурсы с тегом» по прежнему идет от раздела документа, а не от корня.
      ЧЯДНТ?
        Павел Гвоздь
        18 марта 2016, 13:38
        +2
        Я добавил в сниппет tvssTags параметр &scheme. Попробуй заюзать его, вот так например:
        {$_modx->runSnippet('tvssTags', [
            'id' => $_modx->resource.id,
            'tv' => 2,
            'pageId' => 2,
            'scheme' => 'full',
        ])}
          Klike
          28 марта 2016, 22:09
          0
          Спасибо за отличный компонент! Как можно вывести ВСЕ теги сайта? В секции тикетов, например. Или на той же странице «Ресурсы с тегом».
            Павел Гвоздь
            29 марта 2016, 06:59
            0
            Упс. А вот этого я не предусмотрел. :) Какую информацию при выводе всех тегов надо передавать в чанки? Примерно представляю, что нужно передать плейсхолдер «Вес» и подставлять туда вес использования тега. Верно?
              Klike
              29 марта 2016, 07:25
              0
              Можно просто список всех тегов. Можно еще подсчитать количество. Чтобы в скобках указать. По поводу веса, даже не знаю. Тоже можно, в принципе, может кому-то и понадобится.
                Klike
                27 апреля 2016, 13:31
                0
                Ещё не получилось посмотреть это?)
                  Павел Гвоздь
                  27 апреля 2016, 17:37
                  0
                  Нет. У меня загруз «по полной», что называется.
                    Klike
                    27 апреля 2016, 17:40
                    0
                    понимаю! аналогично)
                  Василий Столейков
                  12 октября 2016, 13:11
                  1
                  0
                  Ещё не получилось реализовать возможность создания «облака тегов» с выводом со всего сайта?
          Алексей
          18 марта 2016, 14:42
          0
          Отличная вещь! Спасибо. Но у меня появилась маленькая проблемка. После установки в лог ModX'a падает ошибка:
          /core/cache/includes/elements/modsnippet/98.include.cache.php : 74) PHP warning: Illegal string offset ''
          98 это сниппет tvssResources.

          74 строка
          70 // Приведение параметра loadModels к нужному нам виду (JSON)
          71 if (!$modx->fromJSON($scriptProperties['loadModels'])) {
          72     $tmp_array = array_map('trim', explode(',', $scriptProperties['loadModels']));
          73     foreach ($tmp_array as $v) {
          74         $tmp[$v] = MODX_CORE_PATH.'components/'.strtolower($v).'/model/';
          75     }
          76     $scriptProperties['loadModels'] = $modx->toJSON($tmp);
          77 }
          Вызов для Ресурсы с тегом использовал из инструкции в посте.
            Павел Гвоздь
            18 марта 2016, 15:04
            0
            Можно код сниппета, который вызываешь, глянуть?
              Алексей
              18 марта 2016, 15:11
              0
              Сам вызов:
              {if $.get['tag']?}
                  <div id="pdopage">
                      <div class="rows">
                          {$_modx->runSnippet('pdoPage', [
                              'element' => 'tvssResources',
                              'tv' => '30',
                              'parents' => 0,
                              'ajaxMode' => 'default',
                              'tpl' => '@FILE tpl_shortstory.tpl',
                          ]) ?: 'Ресурсов по данному тегу не найдено'}
                      </div>
                      {$_modx->getPlaceholder('page.nav')}
                  </div>
              {else}
                  Укажите тег для выборки документов
              {/if}
              Сниппет (чтоб здесь простынку не выводить): pastebin.com/QSD6EDYt
                Павел Гвоздь
                18 марта 2016, 15:15
                0
                Там можешь, пока обновление не выкатил, в tvssResources на 71 строке и в tvssTickets на 65, заменить на это:
                if (!empty($scriptProperties['loadModels']) && !$modx->fromJSON($scriptProperties['loadModels'])) {
                  Алексей
                  18 марта 2016, 15:17
                  0
                  Заменил. Ошибки больше нет. Спасибо.
            Алексей Федоров
            25 марта 2016, 17:06
            0
            По какой-то неведомой причине не обрабатывается Fenom, хотя в настройках pdoTools он включен i.imgur.com/c3YXVZG.png

            Выдает ошибку
            core/components/pdotools/model/pdotools/pdotools.class.php : 878) Unexpected tag 'i' in a08ea864bb1b3958113f1b8b756af368 line 166, near '{i[' <- there
            На чанк вставил вызов из Инструкции (просто скопировал и заменил на свои ид тв и страницы)
            {$_modx->runSnippet('tvssTags', [
                'id' => $_modx->resource.id,
                'tv' => 9,
                'pageId' => 29,
            ])}
            Ничего не заработало, тогда переделал на вот такой вид и теги стали выводиться
            [[!tvssTags?
            &id=`[[*id]]`
            &tv=`9`
            &pageId=`29`
            ]]
            А вот часть на странице вывода тегов
            самостоятельно переделать весь код из примеров на стандартный синтаксис
            не получается. Может сжалишься и покажешь как оно в стандарте будет?
            Попробовал так, не завелось
            [[!pdoPage?
                 &element=`tvssTickets`
                 &tv=`2`
                 &parents=`0`
                 &ajaxMode=`default`
            ]]
            [[+page.nav]]
            P.S.: Переустановить pdoTools пробовал, но все равно та же петрушка. Видимо дело в версии модекс (2.5.0rc1) или моей косорукости.
              Павел Гвоздь
              25 марта 2016, 17:26
              +1
              <div id="pdopage">
                  <div class="rows">
                      [[pdoPage?
                          &element=`tvssTickets`
                          &tv=`2`
                          &parents=`0`
                          &ajaxMode=`default`
                      ]]
                  </div>
                  [[!+page.nav]]
              </div>
              Так должно работать…

              P.S.: Зачем юзать на проекте dev версию MODX? Не думаешь, что от этого может не выводить?
                Алексей Федоров
                25 марта 2016, 17:49
                0
                Да так выводит, большое спасибо.

                Зачем юзать на проекте dev версию MODX? Не думаешь, что от этого может не выводить?
                Подозреваю, что именно поэтому с Fenom начались проблемы. Проект пока не рабочий. Собственно, создаю страницы, шаблоны, тестирую, потом сохраняю Packman'ом. Контента там еще нет, только тестовые посты блога и страницы. В процессе работы часто ломается сайт по непонятной причине (для меня непонятной). В предыдущий раз, к примеру, воспользовался «закалкой» modx, потом обновил с 2.4.2 до 2.4.3 и появились проблемы после удаления Collections. Пока не собрал пакет с гит, админка не работала. Поэтому решил сразу на тестовую версию сесть. Если на rc будет работать, то на стабильной — тем более проблем быть не должно.
              Безрукавый Ярослав
              03 июня 2016, 13:07
              0
              Столкнулся с такой проблемой, что при использовании pdoPage не отрабатывается ajax переход по страницам.
              В response возврощает {«output»:"",«page»:1,«pagination»:"",«pages»:0,«total»:0}
              Мог бы, пожалуйста, кто-нибудь помочь с данной проблемой.
              {if $.get['tag']?}
                              <div id="pdopage">
                                  <div class="rows">
                                      {$_modx->runSnippet('pdoPage', [
                                          'element' => 'tvssResources',
                                          'tv' => '6',
                                          'parents' => 5,
                                          'limit' => 3,
                                          'ajaxMode' => 'default',
                                          'sortby' => 'publishedon',
                                          'hideContainers' => 1,
                                          'sortdir' => 'DESC',
                                          'includeTVs' => 'small_news_image',
                                          'prepareTVs' => 1,
                                          'tpl' => 'news_list.chnk',
                                          'pageLimit' => 7,
                                          
                                          'tplPageWrapper' => '@INLINE <div class="pagination"><ul class="pagination">{$prev}{$pages}{$next}</ul></div>',
                                          'tplPage' => '@INLINE <li class="page_num num-{$pageNo}"><a href="{$href}">{$pageNo}</a></li>',
                                          'tplPageActive' => '@INLINE <li class="page_num num-{$pageNo} active"><a href="{$href}">{$pageNo}</a></li>',
                                          
                                          'tplPagePrev' => '@INLINE <li class="control prev"><a href="{$href}"></a></li>',
                                          'tplPageNext' => '@INLINE <li class="control next"><a href="{$href}"></a></li>',
                                          'tplPagePrevEmpty' => '@INLINE ',
                                          'tplPageNextEmpty' => '@INLINE '
                                      ]) ?: 'Ресурсов по данному тегу не найдено'}
                                  </div>
                                  {$_modx->getPlaceholder('page.nav')}
                              </div>
                          {else}
                              Укажите тег для выборки документов
                          {/if}
                Александр
                06 декабря 2016, 14:57
                0
                Не работает в сочетании с minishop 2.4.6, точнее не сохраняется.
                Кирилл
                08 октября 2017, 21:13
                0
                Подскажите как эту строку перевести на fenom
                &where=`{«tags:LIKE»:"%[[!#GET.tag]]%"}`
                Кирилл
                09 октября 2017, 06:49
                0
                Cпасибо огромное
                  Stan Ezersky
                  03 ноября 2017, 23:39
                  +1
                  А инструкции по добавлению тегов с фронта ждать?
                    Stan Ezersky
                    20 ноября 2017, 12:43
                    0
                    Похожие ресурсы по инструкции:

                    Notice: Undefined variable: context in /mysite.com/core/cache/includes/elements/modsnippet/30.include.cache.php on line 16
                    
                    Notice: Undefined index: tag in /mysite.com/core/cache/includes/elements/modsnippet/30.include.cache.php on line 17
                    
                    Notice: Undefined index: tags in /mysite.com/core/cache/includes/elements/modsnippet/30.include.cache.php on line 17
                    не работает с PHP 5.6?
                    Apache2
                    MODX 2.5.8

                    Вот фрагмент кода:

                    // Преобразуем список тегов в массив
                    if (is_string($tags)) {
                        $tags = explode('||', $tags);
                    }
                      Дарья Сизова
                      29 апреля 2020, 02:42
                      0
                      Подскажите, (умоляю, нигде не могу найти!), как в строке адреса декодировать кириллический тег? Например, тег «важно» отображается так ?tag=%25D0%25B2%25D0%25B0%25D0%25B6%25D0%25BD%25D0%25BE
                        Это сообщение было удалено
                          Сергей Карпович
                          18 октября 2023, 16:44
                          0
                          Подскажите как к выводу tvssResources присоединить превью из ms2Galler?

                          Пробую так, но не выходит:
                          {$_modx->runSnippet('tvssResources', [
                              'tv' => '29',
                              'tags' => $_modx->runSnippet('tvssTags', ['id' => $_modx->resource.id, 'tv' => '29', 'tpl' => '@INLINE [[+tag]]', 'outputSeparator' => '||']),
                              'parents' => 0,
                              'element' => 'ms2GalleryResources',
                              'typeOfJoin' => 'left',
                              'includeThumbs' => 'small, medium',
                              'resources' => -$_modx->resource.id,
                              'limit' => 20,
                              'sortby' => '{ "publishedon":"DESC" }',
                              'tvPrefix' => '',
                              'tpl' => 'tpl_blog_item_related',
                          ])}
                            Сергей Карпович
                            18 октября 2023, 17:08
                            +1
                            Остановился на таком варианте:

                            {$_modx->runSnippet('tvssResources', [
                                'tv' => '29',
                                'tags' => $_modx->runSnippet('tvssTags', ['id' => $_modx->resource.id, 'tv' => '29', 'tpl' => '@INLINE [[+tag]]', 'outputSeparator' => '||']),
                                'parents' => 25,
                                'resources' => -$_modx->resource.id,
                                'class' => 'modResource',
                                'loadModels' => 'ms2gallery',
                                'leftJoin' => [
                                    'Image' => [
                                        'class' => 'msResourceFile',
                                        'on' => 'modResource.id = Image.resource_id AND Image.parent = 0',
                                    ],
                                    'Medium' => [
                                        'class' => 'msResourceFile',
                                        'on' => 'Image.id = Medium.parent AND Medium.path LIKE "%medium%"',
                                    ],
                                    'Small' => [
                                        'class' => 'msResourceFile',
                                        'on' => 'Image.id = Small.parent AND Small.path LIKE "%small%"',
                                    ]
                                ],
                                'select' => [
                                    'modResource' => '*',
                                    'Medium' => 'Medium.url as medium',
                                    'Small' => 'Small.url as small',
                                ],
                                'limit' => 20,
                                'sortby' => '{ "publishedon":"DESC" }',
                                'tvPrefix' => '',
                                'tpl' => 'tpl_blog_item_related',
                            ])}
                            Это норм, или есть вариант по лучше?
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                            45