Теги в MODx

31 December 2008

Тэги в MODx делаются не сложно, сложнее решить как их сделать удачнее :) Ковыряние интернета дало несколько решений, общая их идея такова: в документе есть поле в котором лежат тэги, выводит тэги в должной кондиции сниппет tagLinks, документы с тегами выбирает сниппет Ditto. Различия решений сводятся к различным мелочам, я не буду писать каким и почему какие-то мне не понравились — это долго. В этом посте я расскажу как делались тэги на этом сайте, может кому что понравится — забирайте.

Первый шаг абсолютно очевидный: создаем tv-параметр «tags» типа text, и цепляем его ко всем документам которые должны иметь тэги. Поле заполняется тегами через запятую, всё элементарно.

Дальше необходимо это как-то выводить. Выводить тэги с помощью tagLinks мне не хотелось, поэтому я чуть-чуть попрогал. Почему? Потому, что задача банальна. Я открыл парсер PHx ( /assets/plugins/phx/phx.parser.class.inc.php ), и за строчкой ### String modifiers (у меня это 240-ая строка) вписал свой обработчик tags:

case «tags»:
$tgs_arr = explode(’,’, $output);
for($tgs_i = 0; $tgs_i
$tgs_arr[$tgs_i] = ’’ . trim($tgs_arr[$tgs_i]) . ’’;
$output = implode(’, ’, $tgs_arr);
break;

После этого я просто написал в шаблоне [+tags:tags+], и строка с тегами сама разбилась и вывелась должным образом. В связи с особенностями верстки пришлось обернуть это еще в проверку на пустоту с выводм  , если строка пустая. Мне кажется, что такой вариант куда более шустрый, простой и понятный, чем ставить лишний сниппет, и курить его параметры чтобы получать ровно то же самое. Впрочем, если вам нравится поставить сниппет, то результат отличаться не будет.

Примечание: на данном этапе тэги надо выводить по-другому, и что за документ такой /tags/ — тоже не понятно. Однако дальше всё пояснится.

Итак, тэги принимает сниппет Ditto и выводит нужные документы. Не будем погружаться в смысл сниппетов и их реализацию в MODx, делается всё аналогично любой выборке документов с той лишь разницей, что добавляется три параметра:

&tagData=`tags` &tagDelimiter=`,` &tagMode=`onlyTags`

Описание всего этого можно найти в документации, а смысл понятен и так: это параметр, содержащий тэги, разделитель тэгов и режим «ловли», в данном случае «любой из перечисленных». Есть еще параметр &tags, который мы не пишем потому, что он цепляется из URL. Я создал документ с отдельным шаблоном, в котором документы выбираются с учетом тегов, этот документ располагается по адресу /tag/.

Теперь про URL. По идее мы пишем что-то типа /tag/?tags=some-tag, но, согласитесь, это как-то несолидно. Я подумал, что /tag/some-tag   как-то поприятнее будет, но так не работает. Чтож, берем мануал по htaccess и раскуриваем. Не углубляясь в подробности я привожу свое решение. Перед обработкой фрэндли-юэрэлов вписываем следующее:

# Tags
RewriteCond %{REQUEST_URI} /tag*
RewriteRule ^tag/([^.]+) index.php?q=/tag/&tags=$1 [L,QSA]

Мол, если полезли за тегами, то преобразовываем приятное в нужное. Может где накосячил, но вроде работает :)

Примечание: это решение для включенных ЧПУ с разрешением на вложенность

И еще небольшой штришок. На странице с тэгами надо как-то выводить, что выбран именно такой вот тег, для чего я решил воспользоваться надстройкой get над PHx. Втыкаем в нужное место [+phx:get=`tags`+] и радуемся :)

Вот и всё. Какие-то детали, рассчитанные на знающего MODx разработчика, возможно остались за кадром, но всё самое интересное я осветил. Естественно, любой шаг можно доработать и довести еще до ума, что-то я наверняка в будущем сам доведу до ума, но набросок решения именно такой.