CMS в примерах: организация хранилища данных в файловой системе.

 
+
-
edit
 

Balancer

администратор
★★★★★
Только что на коммерческом хостинге встала задача пару страниц положить в файловую систему.

Было сделано такое решение (время работы - минут 10 с обдумыванием, написанием и отладкой :D ).

Общий принцип
- 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
  1. <?
  2.         register_handler('!^http://([^/]+)(.*)!', 'handler_pages_on_fs');
  3.  
  4.         function handler_pages_on_fs($uri, $m)
  5.         {
  6.                 $hts = &new DataBaseHTS();
  7.  
  8.                 $parse = $hts->parse_uri($uri);
  9.  
  10.                 if(!file_exists($parse['local_path']."source.txt"))
  11.                         return false;
  12.  
  13.                 foreach(split(' ', 'source title nav_name template') as $key)
  14.                 {
  15.                         $file = $parse['local_path'].$key.".txt";
  16.                         if(file_exists($file))
  17.                                 hts_data_prehandler_add("/".preg_quote($uri)."/", $key, create_function('$uri, $m', "return ec(file_get_contents('$file'));"));
  18.                 }
  19.  
  20.                 foreach(split(' ', 'parent child') as $key)
  21.                 {
  22.                         $file = $parse['local_path'].$key.".txt";
  23.                         if(file_exists($file))
  24.                                 hts_data_prehandler_add("/".preg_quote($uri)."/", $key, create_function('$uri, $m', "return file('$file');"));
  25.                 }
  26.  
  27.                 return false;
  28.         }


Вот, собственно, весь код. Его описание заняло намного больше времени, чем написание :)

Естественно, таким образом можно использовать любые другие источники данных, например, реализовать систему хранения данных в XML (только придётся добавить парсер).
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru