Многие интернет-разработчики рано или поздно сталкиваются с проблемой выбора системы управления сайтом (CMS) для своих творений. На данный момент их существует очень много, как платных, так и распространяемых на бесплатных условиях. Большинство из них могут подходить для решения разнообразных задач: от простых сайтов-визиток до городских порталов. Но как следствие, они весьма громоздки и требуют значительных серверных мощностей. Возникает закономерный вопрос: “зачем для 10-ти страничного сайта-визитки ставить многомегабайтную CMS, которая к тому же еще требует MySQL?”. Действительно, это не рациональное решение. Именно поэтому я задался целью сделать максимально компактную систему управления сайтом, на основе которой можно было бы делать сайты-визитки за считанные минуты и при этом не требовались бы какие-то особы навыки и специальная подготовка.
Итак, что же из этого вышло. Представленная ниже CMS состоит из таких частей:
1. файл .htaccess
2. файл index.php – сама CMS
3. файл с контентом text.php
4. файл-шаблон theme.php
Теперь рассмотрим детальнее все составляющие.
Первое. Для работы CMS необходимо, чтобы ваш хостер “разрешал” создание/редактирование файлов .htaccess, а также необходимо наличие установленного модуля mod_rewrite. На сколько я знаю, это условие выполняется практически на всех хостингах, но godaddy.com – точно этого не предоставляет… В созданный (в корне сайта) файл .htaccess поместите следующий код:
AddDefaultCharset windows-1251
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Часть вторая – непосредственно сама CMS.
Создаем файл, тоже в корне сайт, с именем index.php и помещаем в него следующее:
<?php
error_reporting(0);
$anons=100;
$to='admin@site.ru';
$subject='Заказ на сайте';
$theme='theme1/theme.php';
$text=file_get_contents('text.php');
if(preg_match_all('@<item>(.*?)</item>@is',$text,$matches)){
for ($i=0; $i<count($matches[1]); $i++){
if(preg_match('@<page>(.*?)</page>@is', $matches[1][$i], $mat)) $pages[]=trim($mat[1]);
if(preg_match('@<date>(.*?)</date>@is', $matches[1][$i], $mat)) $allnews[]=$i;
}
}
$line=$_SERVER["REQUEST_URI"];
if($line[strlen($line)-1]!='/') $line .= "/";
$line=explode('/', $line);
for($i=0; $i<count($line); $i++) $line[$i]=trim($line[$i+1]);
$page=array_search($line[0],$pages);
if(($page!==FALSE)&&(count($line)<=3)){
if(preg_match('@<title>(.*?)</title>@is', $matches[1][$page], $mat)) $title=trim($mat[1]);
if(preg_match('@<content>(.*?)</content>@is', $matches[1][$page], $mat)) $content=trim($mat[1]);
if(preg_match('@<page>(.*?)</page>@is', $matches[1][$page], $mat)) $thispage=trim($mat[1]);
$k=0;
for ($i=count($allnews); $i>=0; $i--){
if(preg_match('@<page>(.*?)</page>@is', $matches[1][$allnews[$i]], $mat)) $newsurl[$k]=trim($mat[1]);
if(preg_match('@<date>(.*?)</date>@is', $matches[1][$allnews[$i]], $mat)) $newsdate[$k]=trim($mat[1]);
if(preg_match('@<title>(.*?)</title>@is', $matches[1][$allnews[$i]], $mat)) $newstitle[$k]=trim($mat[1]);
if(preg_match('@<content>(.*?)</content>@is', $matches[1][$allnews[$i]], $mat)){
$newscontent[$k]=trim($mat[1]);
if(strlen($newscontent[$k])>$anons){
$newtext="";
for($j=0; $j<$anons; $j++) $newtext.=$newscontent[$k][$j];
$newscontent[$k]=$newtext."...";
}
}
if($thispage=="archive.php"){
$content.= '<a href="'.$newsurl[$k].'">'.$newstitle[$k].'</a><br />';
}
$k++;
}
if($thispage=="sitemap.php"){
for($i=0; $i<count($pages); $i++){
if(preg_match('@<title>(.*?)</title>@is', $matches[1][$i], $mat)){
$content.= '<a href="/'.$pages[$i].'">'.trim($mat[1]).'</a><br />';
}
}
}
if((isset($_POST['submit']))&&($_POST['sendmail']=="1")) {
$message = '<html><head><title>'.$subject.'</title></head><body>
Контактное лицо: <b>'.$_POST['fio'].'</b><br>
E-mail: <b>'.$_POST['email'].'</b><br>
Сообщение: <b>'.$_POST['message'].'</b>
</body></html>';
$headers = 'From: '.$_POST['email']."\r\n".'Content-Type: text/html; charset="windows-1251"';
mail($to, $subject, $message, $headers);
$content="Ваш запрос успешно отправлен";
}
include($theme);
exit;
}else{
header('Location:/');
exit;
}
?>
Как видите, в начале есть четыре переменные, которые отвечают за следующее:
$anons – длина, в символах, анонса новостей. Это сделано для того, чтобы в сайдбаре “не вываливать портянку”, а отображать лишь начало новости.
$to=’admin@site.ru’ – тут указываем е-майл, на который будут приходить письма от пользователей. Например, для страниц типа “форма обратной связи” или “оформление заказа”.
$subject=’Заказ на сайте’ – указываем заголовок таких писем.
$theme=’theme1/theme.php’ – указываем путь к файлу шаблона, относительно корня сайта. Эта опция позволяет очень просто изменить внешний вид сайта, подключив другой шаблон.
Помимо этого, в CMS предусмотрено:
1. Генерирование страницы “Архив новостей”, где отображаются ссылки на все новости с анкорами в виде заголовков. По умолчанию эта страница доступна по адресу archive.php. См, строку if($thispage==”archive.php”). Эта страница, должна быть прописана в файле с контентом, иначе отображаться не будет.
2. Генерирование страницы “Карта сайта”, тут отображаются ссылки на все страницы сайта. Доступна по адресу sitemap.php. См, строку if($thispage==”sitemap.php”). Аналогично предыдущей странице, она должна быть прописана в файле text.php
Третья часть – файл с контентом.
Помещаем в корень файл text.php. Его структура должна выглядеть так:
<?if (!$k) header('Location:/')?>
<item>
<page></page>
<title>Главная страница</title>
<content>
<p>Текст главной страницы.</p>
</content>
</item>
<item>
<page>product.php</page>
<title>Наша продукция</title>
<content>
<p>Текст страницы с описанием продукции.</p>
</content>
</item>
<item>
<page>order.php</page>
<title>Оформить заказ</title>
<content>
<table width="100%" border="0" cellspacing="7" cellpadding="5">
<form method="POST" enctype="multipart/form-data" action="order.php">
<input type="hidden" name="sendmail" value="1">
<tr>
<td valign="top">Контактное лицо</td>
<td valign="top">
<input name="fio" type="text" size="40" value="" />
</td>
</tr>
<tr>
<td valign="top">E-mail</td>
<td valign="top">
<input name="email" type="text" size="40" value="" />
</td>
</tr>
<tr>
<td valign="top">Сообщение</td>
<td valign="top">
<textarea name="message" cols="30" rows="7"></textarea>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input name="submit" type="submit" value="Отправить"/>
</td>
</tr>
</form>
</table>
</content>
</item>
<item>
<page>contact.php</page>
<title>Как нас найти</title>
<content>
<p>Текст страницы с контактами.</p>
</content>
</item>
<item>
<page>sitemap.php</page>
<title>Карта сайта</title>
<content>
Текст страницы карты сайта.<br />
</content>
</item>
<item>
<page>archive.php</page>
<title>Архив новостей</title>
<content>
Текст страницы архива новостей:<br />
</content>
</item>
<item>
<page>news1.php</page>
<title>Заголовок новости 1</title>
<date>2009.11.18</date>
<content>
текст новости номер 1 текст новости номер 1 текст новости номер 1 текст новости номер 1 текст новости номер 1
</content>
</item>
<item>
<page>news2.php</page>
<title>Заголовок новости 2</title>
<date>2009.12.19</date>
<content>
текст новости номер 2 текст новости номер 2 текст новости номер 2 текст новости номер 2 текст новости номер 2
</content>
</item>
<item>
<page>news3.php</page>
<title>Заголовок новости 3</title>
<date>2009.12.20</date>
<content>
текст новости номер 3 текст новости номер 3 текст новости номер 3 текст новости номер 3 текст новости номер 3
</content>
</item>
<item>
<page>news4.php</page>
<title>Заголовок новости 4</title>
<date>2009.12.21</date>
<content>
текст новости номер 4 текст новости номер 4 текст новости номер 4 текст новости номер 4 текст новости номер 4
</content>
</item>
<item>
<page>news5.php</page>
<title>Заголовок новости 5</title>
<date>2009.12.22</date>
<content>
текст новости номер 5 текст новости номер 5 текст новости номер 5 текст новости номер 5 текст новости номер 5
</content>
</item>
Первая строка в этом файле служит для того, чтобы прочитать файл мог только скрипт, а всех остальных будет посылать на главную страницу.
Теперь по порядку рассмотрим теги:
1. тег item – внутри него содержится информация о каждой отдельной странице.
2. тег page – здесь задаем внешний вид URLа страницы.
3. тег title – заголовок страницы.
4. тег date – дата публикации, используется только в новостях.
5. тег content – содержание страницы.
Для добавления новых страниц/новостей откройте этот файл с помощью любого текстового редактора(например, блокнот) и скопируйте все от item до /item и вставте в конец файла. Затем, замените page – он должен быть уникальным для каждой страницы. Отредактируйте остальные теги. Всё, на сайте появилась новая страница. Если там присутсвует тег date, то эта страница будет расценена, как новость и будет также выводиться на странице “Архив новостей” и в блоке новостей появиться в самом верху. Старые новости сдвинутся вниз.
Часть четвертая – шаблон сайта.
Создаем папку (в нашем случае “theme1″) и в нее копируем готовый html-шаблон сайта, а также всё что к ниму относится: файл стилей, картинки и прочее. Затем переименовываем index.html в theme.php и открываем его на редактирование блокнотом. В самом начале вставляем строку:
<?if (!$k) header('Location:/')?>
Это нужно для того, чтобы этот файл могла обрабытывать только CMS.
Находим тег title и переписываем его таким образом:
<title>
<?php echo $title ?>
</title>
Также можно вставить эту строку в место вывода заголовка на самой странице, например в теге H1.
Ищем где в шаблоне находится часть связанная с выводом новостей и делаем следующие вставки:
<?php echo $newsdate[1] ?>
это сторока выведет дату самой последней новости
<?php echo $newscontent[1] ?>
выводим текст анонса новости
<a href="<?php echo $newsurl[1] ?>">подробнее</a>
вставили ссылку на страницу с полной новостью
Хочу обратить ваше внимание на то, что тут в квадратных скобках указана единица – это значит, что будет браться информация о последней новости. Если же изменить ее на “2″, то будет взята информация о предпоследней новости. “3″ – пред-предпоследняя новость и т.д.
После этого находим место вывода основного блока текста и ставляем строку:
<?php echo $content ?>
Ну и само-собой, необходимо в блоке с навигацией прописать статические ссылки на внутренние страницы: “О компании”, “Контакты” и пр.
Напоследок выкладываю архив со всеми файлами этой CMS
P.S.: надеюсь этот материал будет вам полезен и вы сможете разобраться в самой маленькой в мире CMS. Если возникнут вопросы – велком в комменты.
P.P.S.: на настройку шаблона, прикрепленного в архиве, а также на его поиски у меня ушло минут 15-20. Так что сделать сайт-визитку за полчаса вполне реально.