×

Удобная связка Tagger и Tickets в modx

Это репост с сайта goodtimes.space , который к сожалению не доступен. Автор mr_goodtimes, Воскресенье, 06.03.2016    Отредактировано: 30.07.2016

Сейчас работаю над сайтом, где планируется добавление статей с фронтенда пользователями. Для этих целей будет служить Tickets. При этом, захотелось, чтобы пользователи могли добавлять к статьям теги (упрощённо, ибо конкретно на разрабатываемом сайте будет несколько полей для ввода тегов в разные группы).

Тут же в голову приходит мысль об использовании Tagger, как единственного, более-менее приемлемого, на мой взгляд, дополнения. Тем более, раньше уже приходилось с ним работать. :) Поэтому выбор стал очевидным.

Группа тегов

В админке сайта открываем раздел «Приложения» → «Tagger». Кликаем по вкладке «Groups», жмём на кнопку «Create a new Group».

Заполняем поля:

  • name
  • alias
  • show for templates
    (пишем id шаблона, в котором будут выводиться теги)

Также отмечаем галочкой пункты:

  • Allow new tags from field
  • Allow blank
  • Allow type

modx tagger new group

Пункт Place, думаю, не настолько важен, ибо создаваться тикеты будут с фронтенда. Где позиция будет определяться прописанным в форме редактирования полем. :) Но для удобства добавления тикетов администратором следует выбрать «Above content» — до поля с содержимым, «Below content», «Bottom page» — после.

Группу сохраняем. На этом всё.

Вызов сниппета TicketForm

Сниппет TicketForm выводит в произвольном месте сайта форму для редактирования/создания тикета. Но лучше выводить её на отдельном ресурсе. :)

Самое интересное тут — параметр allowedFields. В качестве значения этого параметра нужно прописывать поля, чтобы их можно было редактировать через фронтенд. Поля tagger называются очень просто: tagger- и id группы тегов. Например, пишем имя tagger-1, чтобы добавлять с фронтенда теги в группу тегов с идентификатором 1.

Поле для тегов в форме создания/редактирования тикета

Tickets использует чанк tpl.Tickets.form.create для вывода формы создания тикетов и чанк tpl.Tickets.form.update для вывода формы редактирования тикетов. В обеих формах нужно прописать поле для тегов. Например, так.

<label>Теги
<input type="text" name="tagger-1" value="">
</label>

В атрибуте name прописано имя группы тегов. Это поле для формы создания тикетов и здесь значение value оставляем пустым.

А вот в форме редактирования для нашего поля тегов потребуется указать значение value, чтобы получить список сохранённых тегов тегов. И вот это значение:

Следует обратить внимание на параметр groups, где прописан идентификатор группы тегов. Это нужно, чтобы, если у вас несколько групп, как у меня на сайте, выводить в этом поле только теги одной группы.

А разделяться теги будут только запятой. :) Также здесь указан чанк

tickets-tags-editor, в котором прописан лишь один плейсхолдер: , выводящий имя тега в поле.

Вывод тегов в шаблоне

Остаётся только вывести теги в шаблоне документа. Например, вот так:

Здесь у меня указан чанк report-tags, содержимое которого:

<a href="//"></a>

74 — это идентификатор ресурса, где осуществляется вывод статей с определённым тегом при помощи сниппета pdoPage. Вот содержимое этого ресурса:


Ссылки на документацию

  • Tagger
  • Tickets
  • pdoPage

UPD от 1.04.2016: разобрался, почему теги не отображаются в черновиках — для каждого вызова TaggerGetTags нужно добавить параметр &showUnpublished=`1`.

14 комментариев

  •  Anon
    16.03.2016 в 04:59

    Все сделал как написано, но что-то теги не добавляются к записи, вы случайно ничего еще не забыли?
    Кто обрабатывает данные поступающие из поля name=»tagger-1″?

    Ответить
    •  mr_goodtimes
      16.03.2016 в 06:38

      Ничего, вроде бы, не забыл. Написал, как сделал на своём сайте. Но есть одна особенность: если тикет в черновиках, то теги не записываются почему-то…
      А если редактируется опубликованный тикет или создаётся новый, то всё норм.

      Ответить
      •  Anon
        16.03.2016 в 03:33

        Все описанное в статье проделал несколько раз, но теги так и не добавляются :-(
        В менеджере проверял по нулям.
        Поэтому и хотел узнать, может должен быть какой то обработчик?

        Ответить
      •  Anon
        16.03.2016 в 06:02

        Извините, разобрался.
        Оказывается дело было в Show for Template, там надо было указать шаблон который используют тикеты.

        Ответить
  •  bendergrek
    16.03.2016 в 04:16

    Форма добавления/редактирования сабмитится на assets/components/

    tickets

    /action.php с параметром ticket/save. В экшене вызывается метод Tickets::saveTicket() — тут все сохраняется. А теперь вопрос — каким образом тикет в курсе что стоит Tagger в системе или хотя бы знает о таблице тегов? По одной строке tagger-1 ???)
    Тут варианта 2 либо переписан Tickets::saveTicket(), либо есть плагин который обрабатывает события и добавляет теги куда нужно. Описанных выше действий не достаточно для работы.
    Не хотите выкладывать код плагина? Или статья — вода?

    Ответить
    •  mr_goodtimes
      16.03.2016 в 06:53

      Я вообще даже не программист, так что понятия не имею, почему так работает. Видимо, из формы берутся все данные и tickets пытается скормить значение поляtagger-1 как обычное tv, что у него получается. TV же он умеет на ура заполнять, если разрешить.

      Специально установил тестовый сайт с только с modx, tickets и сопутствующими ему плагинами (pdotools, jevix) и tagger. Результат повторился…

      Ответить
  •  Вадим
    25.04.2016 в 06:57

    Всё работает! Молодчина! :)

    Ответить
  •  Роман
    28.09.2016 в 10:05

    Спасибо, отличная статья!) Все работает!
    Вопрос при вывод статей по тегу при помощи сниппета pdoPage — как правильно получить инфо о тикете (кол-во просмотров, рейтин, автор)? Для вывода использую отредактированный &tpl=`tpl.Tickets.list.row`
    Способ, который нашел это дополнительно вызвать в чанке сниппет TicketMeta для вывода инфо тикета

    Ответить
    •  mr_goodtimes
      28.09.2016 в 12:18

      Думаю, это можно сделать так:

      
      
      

      То есть, тут важен параметр element.

      Ответить
      •  Роман
        29.09.2016 в 03:36

        пробовал добавлять &element=`getTickets` в этом случае мне выдает «ничего не найдено»
        вот так выглядит содержимое ресурса:

        
        
        а теги выводятся
        
        Ответить
        •  mr_goodtimes
          29.09.2016 в 09:51

          А вам нужно выводить тикеты по конкретному тегу или просто все опубликованные?

          Во втором случае придётся убрать &where=`` из вызова pdoPage.

          Ответить
          •  Роман
            29.09.2016 в 09:56

            нужно вывести тикеты по конкретному тегу.

            Ответить
            •  mr_goodtimes
              29.09.2016 в 11:09

              Если я правильно помню (тот сайт, о котором писал, уже удалил, так что не могу взять конкретный пример), нужно создать отдельный ресурс, допустим с алиасом, /search/, и разместить вызов pdopage с &element и &where на этом ресурсе. А поиск по тегу будет производится при запросе /search/tag-label/tag/. То есть, в uri должен присутствовать алиас группы тегов и алиас самого тега.

              Или через передачу get параметра на том же ресурсе: /search/?tag-label=tag

              Только так. А насчёт &select и &loadModels не уверен, не пользовался ими.

              Ответить
          •  Роман
            29.09.2016 в 10:01

            как думаете через &select или &loadModels не получится реализовать?

16 ноября 2016, 15:19    Вечерний Минск    759

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