Очень прикольная штука. Надо рассказать.
Я тут уже задолбал вопросами о создании всяких кривых tv, чтобы в них выводилось то да се. Чтобы, например, при редактировании товара была tv’шка с выбором производителя в выпадающем списке. И эта же tv позволяла на странице производителя сделать простой вызов Ditto с фильтрацией по ней на равенство pagetitle, выводящий из каталога все товары этого производителя.
Решалась у меня эта задача (спасибо советам с форума) через @select-привязку для tv "factory":
@SELECT `pagetitle` FROM `modx_site_content` WHERE `parent` = "99" OR `parent` = "100" OR `parent` = "101" OR `parent` = "102"
Эта штука выдавала в список названия документов с родителями 99-102 (это разделы производителей).
А на странице производителя фильтровалась Ditto как
[!Ditto? &tpl=`productLine` &parents=`4` &depth=`3` &filter=`tvfactory,[*pagetitle*],1` [...] !]
Все работало замечательно и не требовало никаких изменений. Пока не возникла необходимость сделать ссылку на производителя в общем списке товаров (см. первый пост). Вот тут-то и началось. Моя переменная хранит pagetitle. Для конструирования ссылки нужен alias. Именно конструирования, ибо нужно было сделать нечто типа
<a href="[(base_url)]/[[getParentAlias]]/...alias конкретной фабрики...">[+factory+]</a>
Сниппет getParentAlias был подсмотрен в соседней теме и содержит обращение к API:
<?php
$parent = $modx->getParent($id=-1,1,'alias');
return ($parent[alias]);
?>
А вот как добыть "...alias конкретной фабрики..." я так и не нашел. Пока Pisto Ganza не ткнул в Related.
Этот замечательный сниппет решает стоящие перед ним задачи и сам ставит новые, до него не существовавшие. Ну, как обычно, короче. Ставится все по инструкции, все замечательно. Обязательно надо почитать связанную тему на форуме. Там 50% информации, всего на 2-х страницах.
Как решилась моя задача с ним. Создал новую tv "relatedFactory" (вместо просто factory) со значением:
@EVAL return $modx->runSnippet('Related', array("parents"=>"99,100,101,102"));
То есть, вместо @select теперь работает @eval. Эта конструкция выдает мне в выпадающий список значения pagetitle’ов, а сама оперирует id. И это здорово. Я не знаю точно, как оно там внутри работает, но это классно.
Теперь мы имеем. Ссылку на нужную страницу производителя, так:
<a href="[~[+relatedFactory+]~]">[+relatedFactory:getPagetitle+]</a>
Никакого конструирования, ничего мудреного. Но что за :getPagetitle? А в [+relatedFactory+] хранятся id! конструкция :getPagetitle увидена в теме форума про Related, является сниппетом phx:getPagetitle и содержит:
<?php
$pagetitle= $modx->runSnippet('GetField', array("docid"=>$output)); // GetField returns pagetitle by default
return $pagetitle;
?>
Ага, используется вызов еще одного сниппета, GetField. Преобразует переданный id в pagetitle.
Фильтрация на странице произвоителя осуществляется точно так же, за исключением замены pagetitle на id:
[!Ditto? &tpl=`productLineFactory` &parents=`4` &depth=`3` &filter=`tvrelatedFactory,[*id*],1` [...] !]
Пока (на Денвере) все работает как надо.
Однако, количество запросов к базе, при некешируемом вызове Дитто, порядка 35. При кешируемом -- 6. Хотя, я не помню, честно говоря, сколько было до этого.
Короче, если вам понадобится сделать связанные документы, Related, думается, очень серьезное подспорье.