Это репост с сайта 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
Пункт 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 не получится реализовать?
-
-
-
-
Комментарии ()