Главный скрипт движка
Все, что мы рассмотрели до сих пор, – необходимые функциональные модули для работы движка CMS. Всю обработку запросов, выборку данных и выдачу страниц производит один основной скрипт. Нужные в каждом случае библиотеки он вызывает по мере необходимости. Сам скрипт достаточно прост. Ту его часть, которая занимается проверкой запроса и обработкой ошибок, мы уже рассмотрели раньше. А теперь вы можете рассмотреть весь его исходный код. Для ясности – шаблон страницы находится в директории /libs в файле index.tpl
Еще одну хитрость вы сможете заметить в той части скрипта, которая разбирает файл данных страницы. Разделителем данных в файле работает вертикальная черта – |. Этот символ может встречаться в тексте крайне редко, но все-таки может. Поэтому перед записью в файл CMS должна заменить его на html-мненонику |. То же касается переводов строки – в файле все данные вытянуты в одну строку, а переводы строк заменяются сочетанием символов \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('|','|',$cont[0]); $KEYWORDS=str_replace('|','|',$cont[1]); $DESCRIPTION=str_replace('|','|',$cont[2]); $headr='<h1>'.str_replace('|','|',$cont[3])."</h1>\n"; $content=str_replace(array('|','\r','\n'),array('|','',"\n"),$cont[4]); $CONTENT=$headr."\n<p>".nl2br($content)."\n<p> </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." \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, но различия между версиями только в библиотеках и в системе администрирования. Структура данных и главный скрипт движка остались без существенных изменений.