Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Главный скрипт движка

Все, что мы рассмотрели до сих пор, – необходимые функциональные модули для работы движка CMS. Всю обработку запросов, выборку данных и выдачу страниц производит один основной скрипт. Нужные в каждом случае библиотеки он вызывает по мере необходимости. Сам скрипт достаточно прост. Ту его часть, которая занимается проверкой запроса и обработкой ошибок, мы уже рассмотрели раньше. А теперь вы можете рассмотреть весь его исходный код. Для ясности – шаблон страницы находится в директории /libs в файле index.tpl

Еще одну хитрость вы сможете заметить в той части скрипта, которая разбирает файл данных страницы. Разделителем данных в файле работает вертикальная черта – |. Этот символ может встречаться в тексте крайне редко, но все-таки может. Поэтому перед записью в файл CMS должна заменить его на html-мненонику &#0124;. То же касается переводов строки – в файле все данные вытянуты в одну строку, а переводы строк заменяются сочетанием символов \n. Соответственно, при разборе данных скрипт производит обратные замены. После этого переводы строк заменяются тегом <br> – это позволяет не заботиться о разбивке текста на абзацы.


<?php
// Загружаем файл конфигурации
require_once('libs/start.inc.php');

// Загружаем библиотеку функций
require_once('libs/functn.inc.php');

// Проверяем отсутствие параметров в статическом URL
$fakelink=FALSE;
if (!empty($_urlmode) &&
   $_urlmode!='none' &&
   strpos($_SERVER['REQUEST_URI'],'?') !== FALSE)
{
 $fakelink=TRUE;
}

// Разбор и проверка GET-параметров
if (!empty($_GET)) {
  foreach ($_GET as $key=>$val) {
    if (in_array($key,$get_arr)) $$key=trim($val);
    else {
      $fakelink=TRUE;
      break;
    }
  }
} elseif (!empty($_SERVER['QUERY_STRING'])) {
  $fakelink=TRUE;
} else $id='/';

// Если URL некорректен, посылаем 404 Not Found
if ($fakelink) err404(TRUE);

// Считываем в массив файл структуры
$h_arr=file($datapath.'struct.dat');

// Разбираем структуру сайта
$hier=hierarchy($h_arr);

// Уничтожаем массив неразобранных строк файла структуры
unset($h_arr);

// Проверка наличия запрошенного раздела. Если такого нет, посылаем 404.
// Иначе выбираем по алиасу массив-описатель текущего раздела
// и создаем переменные из каждого элемента массива-описателя
if (!array_key_exists($id,$hier)) {
  err404(TRUE);
} else {
  $curr=$hier[$id];
  foreach ($curr as $key=>$val) $$key=trim($val);
}

// Выбираем библиотеку работы со ссылками в зависимости от режима
if (!empty($_urlmode)) {
  require('libs/m_'.$_urlmode.'.inc.php');
} else {
  require('libs/m_none.inc.php');
}

// Выбираем разделы верхнего уровня
$mainarr=array_filter($hier,'getmain');

// Выбираем разделы, входящие в подменю.
// Функция фильтрации выбирается в зависимости от уровня текущего раздела
if (empty($parent)) $subarr=array_filter($hier,'getsub');
else $subarr=array_filter($hier,'getlevel');

// Формируем массивы ссылок главного меню и меню раздела
$mainmenu=getmenu($mainarr);
$submenu=getmenu($subarr);

// Определяем файл контента для текущего раздела
$contfil=$datapath.'cont'.$number.'.dat';

// Считываем и разбираем файл контента
// Сразу же формируем переменные для вставки в шаблон
if (file_exists($contfil)) {
  $cont=explode('|',trim(file_get_contents($contfil)));
  $TITLE=str_replace('&#0124;','|',$cont[0]);
  $KEYWORDS=str_replace('&#0124;','|',$cont[1]);
  $DESCRIPTION=str_replace('&#0124;','|',$cont[2]);
  $headr='<h1>'.str_replace('&#0124;','|',$cont[3])."</h1>\n";
  $content=str_replace(array('&#0124;','\r','\n'),array('|','',"\n"),$cont[4]);
  $CONTENT=$headr."\n<p>".nl2br($content)."\n<p>&nbsp;</p>";
  unset($cont);
  // Проверка бита статуса «Плагин» и загрузка плагина
  if (((int)$some & 2) > 0) {
    include ('libs/'.$knot.'.inc.php');
    $CONTENT.=$outstr;
  }
} else {
  $TITLE=$KEYWORDS=$DESCRIPTION=$headr=$CONTENT='';
}

// Собираем главное меню для вставки в шаблон
$MAIN_MENU='';
foreach ($mainmenu as $val) {
  $MAIN_MENU.=$val."&nbsp;&nbsp;\n";
}

// Собираем меню раздела для вставки в шаблон
$SUB_MENU='';
if (!empty($submenu)) {
  $SUB_MENU.="<br>\n";
  foreach ($submenu as $val) $SUB_MENU.=$val."<br>\n";
  $SUB_MENU.="<br>\n";
}

// Включаем буферизацию вывода, отправляем HTTP-заголовок,
// считываем файл шаблона и выводим его с подстановкой значений переменных.
ob_start();
header("Content-Type: text/html; charset=".$charset);
$__page='return <<<ENDPG'."\n".file_get_contents('libs/index.tpl')."\nENDPG;\n";
print eval($__page);
ob_end_flush();
// Вот и все. Страница ушла в браузер посетителя.
?>

Собственно, тот же самый код, что вы видите здесь, отработал при выдаче вам этой страницы. Сайт выполнен на более развитой версии этой же CMS, но различия между версиями только в библиотеках и в системе администрирования. Структура данных и главный скрипт движка остались без существенных изменений.