Сделать вывод страниц, «продолжающих» дерево MODx, можно разными способами, приведу некоторые отдельные моменты, используемые мною.
Я предпочитаю в .htaccess прописывать правила для разделов, создаваемых в дополнение к MODx. Например, есть страница MODx с названием offer, на которой вызывается сниппет, выводящий разную информацию. Добавив правило
RewriteRule ^offer/(.*)$ index.php?q=offer&otp=$1 [L,QSA]
я разбираю $_GET[’otp’] в сниппете, чтобы вывести нужную информацию. При этом вложенность может быть достаточно глубокой, например
offer/all/egypt/dbl/usual/bb
Всего вариантов, то есть страниц на сайте, несколько тысяч (с дополнительными вариантами при введенной в поле ввода дате – десятки тысяч). При выводе информация берется из достаточно большой базы – сейчас в ней около миллиона записей, а летом было более двух миллионов. Если подбирать нужные записи во время обращения пользователя, время генерации может составить несколько минут, и традиционным кэшированием не обойтись – обновления происходят несколько раз в день, и достаточно много пользователей после обновления будут долго ждать ответа страницы. В результате я сделал, что при каждом обновлении (выполняемом по cron) ищутся нужные данные для каждой страницы и сохраняются номера этих записей. Вывод записей с известными номерами (но номерам таблица проиндексирована) происходит достаточно быстро, так что работает все без задержек.
Поиск по этим страницам отсутствует, так как такой задачи не стояло. В принципе в последних версиях AjaxSearch имеется поиск по дополнительным таблицам в базе, но документации на это нет и пример не совсем понятен.
Реализацию описанного можно посмотреть здесь:
Витрина туров
В html-коде внизу можно увидеть скоростные характеристики генерации страницы, вроде этого:
<!-- MySQL: 0,0061 с, запросов: 4, PHP: 0,0672 с, всего: 0,0733 с, памяти 6 МБ, документ взят из кэша. -->
Кстати, ссылки на отели на этой странице в большинстве случаев (когда начинаются на hotels?hotelid=) отправляют на другой раздел, также генерируемый программно и состоящий, с точки зрения MODx, из одной страницы – здесь тоже некэшируемое обращение к базе выполняется быстро.
Вообще вопрос кэширования обращений к базе достаточно спорный – в большинстве случаев на запросы тратится намного меньше времени, чем на обработку в PHP. Если не нужны сложные запросы, и в базе хранится информация, готовая к выводу и не требующая значительной обработки, некэшированные сниппеты практически не уменьшат скорость работы. При этом трудоемкие операции по обработке данных лучше выполнять заранее, когда данные редактируются (или в административной части сайта или периодически по cron).
Полностью внешний скрипт использовать лично мне не нравится, удобнее подключать сниппет (основная часть которого во внешних файлах) и задавать значения через плейсхолдеры, то есть написать $modx->setPlaceholder(’myvar’, ’Значение’); и в шаблоне или на странице поставить [+myvar+]. Чанки тоже при этом можно использовать, хотя мне нравится, как подключаются шаблоны в AjaxSearch и некоторых других сниппетах с помощью функции getTemplate.