Движок для сайта своими руками. Вариант первый: если у вас нету базы...
Каждый сайтостроитель в один прекрасный момент вдруг замечает, что он уже занимается не столько подготовкой новых метериалов для своего сайта, сколько банальными и рутинными вещами: там выковырял меню, заменил; там пересохранил, обновил; тут — copy, там — paste, а потом всё это save и upload. «Ну нет — думает вебмастер — так больше нельзя! Но что же делать?». А делать нужно движок для сайта...
Эта статья — первая из задуманного мной цикла статей, в котором мы с вами попробуем сделать что-то наподобии движка для несложных сайтов. Мы рассмотрим также принципы отделения контента сайта от его оформления (дизайна) и способы автоматизации вебмастерского труда.
Движком принято называть набор скриптов и программ, на основе которых держится, живёт и обновляется сайт. Движок может быть как простым PHP-скриптом и статьями, хранящимися в текстовых файлах определённого формата, так и сложным комплексом программных средств в связке с базами данных (MySQL, Oracle, etc.) и веб-службами, написанными на Java.
Лучшим (но при этом не самым сложным) был бы вариант с применением баз данных. Но чаще всего вебмастерам база данных недоступна, поскольку дают её (насколько мне известно) только на платных хостингах. Поэтому наш первый движок мы организуем при помощи PHP и набора файлов. При этом можно себя утешить тем, что на работоспособность нашего сайта не будут влиять дополнительные факторы риска, вносящиеся использованием баз данных (все, я полагаю, уже слышали о истории с дырой в Microsoft SQL Server 2000) (1).
Наш движок будет специалиально приспособленным под контент-проекты (то есть сайты, которые регулярно пополняются авторскими статьями или другими материалами). А это значит, что нам придётся сделать всё для удобного и быстрого обновления содержания сайта.
Итак, для начала нам надо опредилить пару функций для чтения данных из файла. Перед тем, как приводить исходные коды, рассмотрим имеющиеся у нас (вернее, в PHP) средства для работы с файлами (а те, кто не в курсе — сразу и узнают).
Функции чтения файлов в PHP.
Вобщем, прочитать файл мы можем несколькими способами. Первый, и самый простой — это использовать функцию file(). Она, получив имя файла, сразу же возвращает массив строк этого самого файла:
...
$strings = file("myfolder/myfile.txt");
$first_string = $strings[0];
...
|
Сделаем такую себе самопальную базу данных. Для неё нам, во-первых, понадобятся такие функции: одна для чтения контента страницы (например, текста статьи) из внешнего файла — загрузка данных; функция для загрузки шаблона из файла — то есть, загрузка оформления (дизайна).
function loadTemplate($path)
/* функция загружает шаблон по указанному пути,
и возвращает его в виде строки, например,
для обработки функцией parceTemplate() */
{
$template = fopen($path, "r") or print("Не удалось загрузить файл шаблона [".$path."]");
if ($template)
return fread($template, filesize($path));
else
return false;
fclose($template);
}
function parceTemplate($template, $params_values)
/* функция синтаксически разбирает указанный шаблон,
заменяя названия параметров, служащих индексами
масива $params_values на их значения */
{
while (list($param, $value) = each($params_values))
{
$template = str_replace("¤{".$param."}¤", $value, $template);
}
return $template;
}
function readArticle($path)
/* функция читает указанный файл и возвращает
его содержимое в виде массива частей статьи,
разделенных конструкцией ¤{имя части}¤ */
{
$article = fopen($path, "r") or print("Не удалось загрузить файл статьи [".$path."]");
if ($article)
{
$astring = fread($article, filesize($path));
$result = split("[¤]{1}[{]{1}([ a-z_-]*)[}]{1}[¤]{1}", $astring);
$result[2] = eregi_replace("[ ,]*([ — ]{1})[, ]*", " — ", $result[2]);
$result[3] = eregi_replace("[ ,]*([ — ]{1})[, ]*", " — ", $result[3]);
$result[0] = basename($path);
return $result;
}
else
{
return false;
}
}
|
Где-то здесь надо было бы прикрутить гранитную плиту с надписью «Регулярным выражениям от благодарных фанатов», поскольку без этой удобной штуки было бы очень сложно создать вышеприведённые функции. Рассмотрим немного подробнее, как эти выражения устроены.
Писать много раз об одном и том же нет смысла, поэтому я процитирую одну из статей о регулярных выражениях (Источник: http://sitemaker.ru/):
Регулярные выражения.
Немного истории.
Математик Стивен Клин впервые представил регулярные выражения в 1956, в результате его работы с рекурсивными наборами в естественном языке. Они были созданы как синтаксические наборы, использовавшиеся для нахождения соотвествий шаблонов в строках, которые позже помогали обращаться к появляющейся технологической информации, облегчая автоматизацию.
С тех пор, регулярные выражения прошли через множество итераций, и текущий стандарт сохраняется ISO (Международной организацией по стандартизации) и определен Open Group, совместным усилием различных технических некоммерческих организаций (2).
Соответствие символов.
Трудность регулярных выражений состоит в том, что Вы хотите искать или чему это должно соответствовать. Без этой концепции, RE бесполезны. Каждое выражение будет содержать некоторую команду о том, что искать:
Соответствие символов в регулярных выражениях
Оператор |
Описание |
Пример |
Результат |
. |
Соответствует любому одному символу |
.ord |
Будет соответствовать «ford», «lord», «2ord», и т.д. в файле sample.txt. |
[] |
Соответствует любому одному символу, заключенному в квадратные скобки |
[cng]ord |
Будет соответствовать только «cord», «nord» и «gord» |
[^] |
Соответствует любому одному символу, не заключенному в квадратные скобки |
[^cn]ord |
Будет соответствовать «lord», «2ord» и т.д., но не «cord» или «nord» |
[a-zA-Z] |
Соответствует любой букве |
[a-zA-Z]ord |
Будет соответствовать «aord», «bord», «Aord», «Bord» и т.д. |
[^0-9] |
Соответствует любой нецифре в промежутке 0-9 |
[^0-9]ord |
Будет соответствовать «Aord», «aord» и т.д., но не «2ord» и т.д. |
Операторы повторения.
Операторы повторения, или квантификаторы, описывают сколько раз нужно искать указанную строку. Они используются вместе с соответствующим символу синтаксисом, чтобы искать многократные вхождения символов. В различных приложениях их поддержка может изменяться или быть неполной, поэтому нужно прочитать документацию к приложению, если вдруг шаблон не работает как ожидалось.
Операторы повторения в регулярных выражениях
Оператор |
Описание |
Пример |
Результат |
? |
Соответствует определенному символу единожды, если тот существует |
?erd |
Будет соответствовать «berd», «herd», и т.д. и «erd» |
* |
Соответствует определенному символу многократно, если тот существует |
n.*rd |
Будет соответствовать «nerd», «nrd», «neard» и т.д. |
+ |
Соответствует определенному символу один или более раз |
[n]+erd |
Будет соответствовать «nerd», «nnerd» и т.д., но не «erd» |
{n} |
Соответствует определенному символу точно n раз |
[a-z]{2}erd |
Будет соответствовать «cherd», «blerd» и т.д., но не «nerd», «erd», «buzzerd» и т.д. |
{n,} |
Соответствует определенному символу минимум n раз |
.{2,}erd |
Будет соответствовать «cherd» и «buzzerd», но не «nerd» |
{n,N} |
Соответствует определенному символу минимум n раз, но не более чем N раз |
n[e]{1,2}rd |
Будет соответствовать «nerd» и «neerd» |
Якоря.
Якоря описывают где соответствовать шаблону. Они могут быть удобными, когда Вы ищете общие строковые комбинации.
Якоря регулярных выражений
Оператор |
Описание |
Пример |
Результат |
^ |
Соответствует началу строки |
ereg_replace("^/", "blah") |
Вставляет «blah» в начало строки |
$ |
Соответствует концу строки |
ereg_replace("$/", "blah") |
Вставляет «blah» в конец строки |
\< |
Соответствует началу слова |
ereg_replace("\<", "blah") |
Вставляет «blah» в начало слова |
|
|
\<blah |
Соответствует «blahfield» и т.д. |
\> |
Соответствует концу слова |
ereg_replace("\>", "blah") |
Вставляет «blah» в конец слова |
|
|
\>blah |
Соответствует «soupblah» и т.д. |
\b |
Соответствует началу или концу слова |
\bblah |
Соответствует «blahcake» и «countblah» |
\B |
Соответствует середине слова |
\Bblah |
Соответствует «sublahper» и т.д. |
(конец цитаты, источник описания: http://sitemaker.ru/)
Итак, продолжим. Созданные нами функции пригодятся для чтения статей из файлов и вывода списка самых новых статей. Причем для модификации всего этого нам нужно будет лишь написать новую статью в виде файла с определённым синтаксисом (см. ниже) и добавить её в папку на сервере.
¤{имя части}¤
содержание части
...
...
...
¤{ещё одно имя части}¤
её содержание и так далее...
|
Символы ¤{ и }¤ используется для отделения частей друг от друга. Имя части же никакого значения не имеет и может быть любым набором символов английского алфавита, пробела, подчеркивания или дефиса.
Для вывода списка статей используется цикл, перебирающий все файлы из нужного каталога. Если он натыкается на файл *.art, то сразу на радостях добавляет его в масив. В зависимости от указанного параметра, он может либо добавить имя этого файла, либо название содержащейся в нём статьи, либо сразу готовую ссылку на эту статью.
Что ж, небольшая часть работы над нашим движком уже проделана. Эта часть кода — основа нашего первого движка. Для конкретных целей к нему нужно цеплять дополнительные функции и создавать сами тексты и шаблоны страниц.
Ccылки после изложенного.
- описание вируса, поражающего Microsoft SQL Server 2000
- описание синтаксиса регулярных выражений от Open Group
|