ООП   PHP   web   4GL - визуальные среды

Практика пограммирования скриптов на PHP

Движок для сайта своими руками. Вариант первый: если у вас нет базы

Каждый сайтостроитель в один прекрасный момент вдруг замечает, что он уже занимается не столько подготовкой новых метериалов для своего сайта, сколько банальными и рутинными вещами: там выковырял меню, заменил; там пересохранил, обновил; тут — 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ылки после изложенного

  1. описание вируса, поражающего Microsoft SQL Server 2000
  2. описание синтаксиса регулярных выражений от Open Group
ООП   PHP   web   4GL - визуальные среды

Знаете ли Вы, что такое "Большой Взрыв"?
Согласно рупору релятивистской идеологии Википедии "Большой взрыв (англ. Big Bang) - это космологическая модель, описывающая раннее развитие Вселенной, а именно - начало расширения Вселенной, перед которым Вселенная находилась в сингулярном состоянии. Обычно сейчас автоматически сочетают теорию Большого взрыва и модель горячей Вселенной, но эти концепции независимы и исторически существовало также представление о холодной начальной Вселенной вблизи Большого взрыва. Именно сочетание теории Большого взрыва с теорией горячей Вселенной, подкрепляемое существованием реликтового излучения..."
В этой тираде количество нонсенсов (бессмыслиц) больше, чем количество предложений, иначе просто трудно запутать сознание обывателя до такой степени, чтобы он поверил в эту ахинею.
На самом деле взорваться что-либо может только в уже имеющемся пространстве.
Без этого никакого взрыва в принципе быть не может, так как "взрыв" - понятие, применимое только внутри уже имеющегося пространства. А раз так, то есть, если пространство вселенной уже было до БВ, то БВ не может быть началом Вселенной в принципе. Это во-первых.
Во-вторых, Вселенная - это не обычный конечный объект с границами, это сама бесконечность во времени и пространстве. У нее нет начала и конца, а также пространственных границ уже по ее определению: она есть всё (потому и называется Вселенной).
В третьих, фраза "представление о холодной начальной Вселенной вблизи Большого взрыва" тоже есть сплошной нонсенс.
Что могло быть "вблизи Большого взрыва", если самой Вселенной там еще не было? Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМАФорум Рыцари теории эфира
Рыцари теории эфира
 21.09.2019 - 11:41: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Галины Царёвой - Карим_Хайдаров.
21.09.2019 - 11:36: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
20.09.2019 - 19:50: ЭКОНОМИКА И ФИНАНСЫ - Economy and Finances -> ПРОБЛЕМА КРИМИНАЛИЗАЦИИ ЭКОНОМИКИ - Карим_Хайдаров.
20.09.2019 - 04:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вячеслава Осиевского - Карим_Хайдаров.
18.09.2019 - 12:08: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> ПРОБЛЕМА ИСКУССТВЕННОГО ИНТЕЛЛЕКТА - Карим_Хайдаров.
18.09.2019 - 06:01: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Л.Г. Ивашова - Карим_Хайдаров.
17.09.2019 - 05:51: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ФАЛЬСИФИКАЦИЯ ИСТОРИИ - Карим_Хайдаров.
17.09.2019 - 05:41: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Андрея Тиртхи - Карим_Хайдаров.
16.09.2019 - 03:11: СОВЕСТЬ - Conscience -> РУССКИЙ МИР - Карим_Хайдаров.
14.09.2019 - 18:23: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
13.09.2019 - 09:08: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
12.09.2019 - 17:47: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
Bourabai Research Institution home page

Bourabai Research - Технологии XXI века Bourabai Research Institution