Только что на коммерческом хостинге встала задача пару страниц положить в файловую систему.
Было сделано такое решение (время работы - минут 10 с обдумыванием, написанием и отладкой
).
Общий принцип
- CMS в самом конце всех проверок и обработок, если ни один модуль не взялся за отображение страницы, выводит страницу стандартным методом с помощью модуля
handlers/post/80-pages.php. Он извлекает стандартный набор данных через
DataBaseHTS->get(uri, key_name) и скармливает его Smarty-шаблону.
- Есть возможность вставить свои перехватчики, подменяющие стандартные функции извлечения данных. Собственно, это на сегодня самый популярный способ написания модулей и плагинов. Вешаем на заданные URI или их группы наши функции, которые возвращают требуемые значения. Чаще всего для регистрации своих методов используется функция
hts_data_prehandler_add(uri_regexp, key_name, function) или
hts_data_prehandler_add(uri_regexp, array(key1_name => func1, key2_name => func2, ...)), где в качестве function могут быть как имена функций, так и конкретные значения (функция регистрации "интеллектуальная").
- Перед вызовом
handlers/post/80-pages.php пропишем наш файл, скажем, 70-й по порядку загрузки, который для нужной URI проверит наличие нужных данных и, если они есть в файловой системе, повесит обработчик чтения данных, который вернёт содержимое файлов в качестве значений.
- На уровне файловой системы реализация будет совсем примитивной, в нужном каталоге положим файлы
key_name.txt, содержимого которых и будет считываться. Если key_name - массив (как parent или child), то одна строка - одна запись массива.
Вот, что получается.
handlers/post/70-pages_on_fs.php:
code php
<?
register_handler('!^http://([^/]+)(.*)!', 'handler_pages_on_fs');
function handler_pages_on_fs($uri, $m)
{
$hts = &new DataBaseHTS();
$parse = $hts->parse_uri($uri);
return false;
foreach(split(' ', 'source title nav_name template') as $key)
{
$file = $parse['local_path'].$key.".txt";
hts_data_prehandler_add
("/".preg_quote($uri)."/", $key, create_function('$uri, $m', "return ec(file_get_contents('$file'));"));
}
foreach(split(' ', 'parent child') as $key)
{
$file = $parse['local_path'].$key.".txt";
}
return false;
}
Вот, собственно, весь код. Его описание заняло намного больше времени, чем написание
Естественно, таким образом можно использовать любые другие источники данных, например, реализовать систему хранения данных в XML (только придётся добавить парсер).