Начну понемногу описывать используемые в CMS механизмы. Очень поверхностно и вкратце, но надеюсь на уточняющие вопросы заинтересованных, буде таковые найдутся.
Отдельный пакет может быть "плагином". Плагин кидается в специальную папку
cms/plugins/path/to/any/name/
и в файле main.uri прописывается список URL, на которые он вешается.
Формат шаблона URI регексповый:
(/)(tools/search/title)(/.*)
Первые скобки - группа, указывающая на автоматического родителя нашего плагина. В данном случае, если родитель не будет прописан программистом явно, все ссылки вида
/tools/search/title/... будут иметь в качестве родителя
/.
Вторая группа - имя плагина.
Третья - внутренний путь плагина, на который вешаются обработчики его страниц и операций с ним.
Ибо в коде самого плагина обработчики прописываются для путей, задаваемых относительно базового пути плагина.
Скажем, если я систему тикетов вешаю в
/tickets/, то по
code php
<?
hts_data_prehandler
("!^({$GLOBALS['cms']['plugin_parent_uri']})\w+/?$!" ;, array(
'body' => 'plugins_tickets_main_body',
'title' => ec('Заказ'),
));
?>
повешу свой обработчик на выдачу контента и заголовка (в рамках дефолтового шаблона) на любые
/tickets/xxxx/
Дополняю своими возможностями готовый форум, скажем, punbb. И ставлю плагин на /forum/.
code php
<?
hts_data_prehandler
("!^(http://[^/]+{$GLOBALS['cms']['plugin_base_path']})t opic/\d+/(\d+)(,(\d+))?/?$!", array(
'title' => 'plugins_forum_unb_thread_title',
'nav_name' => 'plugins_forum_unb_thread_title',
'parent' => 'plugins_forum_unb_thread_parent',
));
В результате для объекта с URI
/forum/topic/445/23445,7/ будут возвращаться соответствующие данные.
Загрузка плагинов осуществляется только при показе ссылок, удовлетворяющих маскам в main.uri