Пишем движок сайта (CMS – Систему управления контентом)
Теперь напишем аналогичный по виду и функционалу файл admin_new.php. Его отличие от модуля admin_edit.php в том, что поля формы изначально пустые и сохранение происходит в новый файл. В остальном же всё сходно. Листинг:
<?php
if (!isset($_POST['action'])) // если форма не была послана, то выводим форму
{
?>
<h1>Добавить статью</h1>
<form action=”index.php?tp=add” method=”post”>
<input type=”hidden” name=”action” value=”do” />
Введите текст статьи (разрешено HTML-форматирование): <br />
<textarea cols=”60″ rows=”10″ name=”text”></textarea><br />
<table>
<tr>
<td>Название страницы (title):</td>
<td><input name=”title” type=”text” size=”60″ /></td></tr>
<tr>
<td>Ключевые слова (keywords):</td>
<td><input name=”keys” type=”text” size=”60″ /></td></tr>
<tr>
<td>Описание страницы (description):</td>
<td><input name=”descr” type=”text” size=”60″ /></td></tr>
<tr><td>Ссылка для меню:</td><td><input name=”link” type=”text” size=”60″ /></td></tr>
</table>
<input type=”submit” value=”добавить” />
</form>
<?php
}
else // если форма уже послана
{
if (!isset($_POST['text']) || !isset($_POST['title']) || !isset ($_POST['link'])) // проверяем наличие всех необходимых полей
{
header(“Location: index.php?tp=add”); // если нет хотябы одного из полей – редирект в начало
}
$d = dir (“../content/”); // получаем файлы директории /content
while (false !== ($entry = $d->read()))
{
if (preg_match(“/[0-9].php/”, $entry)) // проверяем регулярным выражением имя файла в виде числа
{
$nums[] = str_replace (“.php”, “”, $entry); // добавляем в массив это число (имя файла)
}
}
if (!isset($nums)) // если массив пуст (нет файлов)
{
$n = 1; // то имя файла будет “1″
}
else // если файлы есть
{
sort ($nums); // то сортируем их
$n = $nums[count($nums)-1] + 1; // находим самое большое число и присваиваем $n на еденицу больше
}
// формируем строку для записи в файл
$content = “<?\r\n\$page_title = ‘” . $_POST['title'] . “‘;\r\n” .
“\$page_descr = ‘” . $_POST['descr'] . “‘;\r\n” .
“\$page_keyws = ‘” . $_POST['keys'] . “‘;\r\n” .
“\$page_4menu = ‘” . $_POST['link'] . “‘;\r\n\r\n” .
“\$content = <<< EOT\r\n” . $_POST['text'] . “\r\n” .
“EOT;\r\n?>”;
if (!function_exists(‘file_put_contents’)) // если отсутствует функция file_put_contents (PHP версия менее 5-й)
{
function file_put_contents ($filename, $content) // то описываем эту функцию
{
if ($fp = @fopen($filename, ‘w’))
{
$result = fwrite($fp, $content);
fclose ($fp);
return $result;
}
else
{
return false;
}
}
}
if (!file_put_contents(“../content/” . $n . “.php”, $content)) // пытаемся записать в файл $n.php
{
die (“Ошибка записи”);
}
else // если записали новый файл, то необходимо дописать новую страницу и в меню
{
$fs=fopen(‘../menu.csv’, ‘a’); // открываем menu.csv для добавления
if(!fwrite($fs, $n.’;’.$_POST['link'].”\n”)) // если не удается записать
die(“Ошибка записи в меню. <a href=’index.php’>вернуться на главную</a>”); // то сообщаем и выходим
fclose($fs); // закрываем файл
// если записали в меню, то сообщаем
echo (“Успешно добавлено. <a href=’index.php?tp=add’>Добавить ещё одну</a> или <a href=’index.php’>вернуться на главную</a>”);
}
}
?>
Осталось всего ничего — написать последний модуль админки, причём не самый сложный из них!
Последний модуль админки — это модуль admin_settings.php. Он загружает текущие настройки в форму и при её отправке записывает в файл. Вот листинг этого модуля:
<?php
if (!isset($_POST['action'])) // если не послана форма
{
include (“../settings.php”); // подключаем settings и выводим форму
?>
<h1>Редактирование настроек</h1>
<form action=”index.php?tp=settings” method=”post”>
<input type=”hidden” name=”action” value=”do”>
<table>
<tr><td>Используемый шаблон:</td><td>
<select name=”tmpl”>
<?php
// формируем список select из имен директорий в /templates
$templates=glob(“../templates/*”); // получаем в массив список директорий шаблонов
foreach($templates as $templ) // и выводим их под циклом как элементы <option>
{
$template=str_replace(‘../templates/’, ”, $templ); // очищаем имя субдиректории от пути
echo ‘<option ‘;
if($template == $curr_tmpl) echo ’selected’; // если данная директория совпадает с именем активного шаблоно, то добавляем переметр selected к тегу option (делаем ее выбранной)
echo’>’;
echo $template;
echo ‘</option>’;
}
?>
</select></td>
</tr>
<tr><td>ID начальной страницы:</td><td><input name=”id” type=”text” value=”<? echo $index; ?>” size=”5″></td></tr>
<tr><td>Шаблон оформления ссылок в меню:</td><td><input name=”menu” type=”text” value=’<? echo $menu_tmpl; ?>’ size=”80″></td></tr>
</table>
<input type=”submit” value=”сохранить изменения”>
</form>
<?php
}
else // если форма уже послана
{
if (!isset($_POST['tmpl']) || !isset($_POST['id']) || !isset($_POST['menu'])) // проверяем наличие всех нужных полей
{
die (“Некоторые из настроек пропущены. <a href=’index.php?tp=settings’>Ввести ещё раз</a>”); // если хоть одно из полей пропущено – выходим с нужным сообщением
}
// проверяем наличие индекс – файла заданного шаблона
if (!file_exists(“../templates/” . $_POST['tmpl'] . “/index.php”)) die (“Файл index.php указанного шаблона не найден. <a href=’index.php?tp=settings’>Ввести ещё раз</a>”);
// проверяем наличие файла главной страницы
if (!file_exists(“../content/” . $_POST['id'] . “.php”)) die (“Страница, указанная как главная, не найдена. <a href=’index.php?tp=settings’>Ввести ещё раз</a>”);
// получаем шаблон меню м формируем строку дял записи в settings.php
$mtpl = $_POST['menu'];
$set = “<? \$curr_tmpl=’” . $_POST['tmpl'] . “‘; \$index=” . $_POST['id'] . “; \$menu_tmpl = \”" . $mtpl . “\”; ?>”;
// если отсутствует функция file_put_contents (PHP менее 5-й версии)
if (!function_exists(‘file_put_contents’))
{
function file_put_contents ($filename, $content) // то описываем эту функцию
{
if ($fp = @fopen($filename, ‘w’)) // открываем файл для записи
{
$result = fwrite($fp, $content); // записываем в файл
fclose ($fp); // закрываем файл
return $result; // возвращаем результат записи в файл
}
else // если не удалось открыть файл для записи
{
return false; // возвращаем false
}
} // закончили описание функции file_put_contents
}
// пробуем записать в файл settings новые значения
if (!file_put_contents(“../settings.php”, $set)) die (“Запись в файл не удалась. <a href=’index.php’>На главную</a>”);
// если успешно записали
else die (“Настройки записаны успешно. <a href=’index.php’>На главную</a>”);
}
?>
Теперь всё! У нас получилась простенькая, но полноценная cms с админ-панелью!
А чтобы сравнить Ваш результат с нашим, Вы можете скачать готовую cms здесь.




декабря 12, 2008 at 16:04
я бы не назвал этот сайт CMS, а просто движок
января 15, 2009 at 17:09
Сам-то понял, что сказал?
января 31, 2009 at 10:51
Без сомнения эта система управления – ЛУЧШАЯ в рунете, и не надо ее нагружать всякой ерундой! Единственный недостаток – отсутствие WYSIWYG-редактора. Вопрос – как его прикрутить? Ах да – еще недостаток: чтобы главная страница была index.php а не index.php?id=1. А такие, как AMD пусть пользуются этими непонятно для кого написанными джумлами-ньюками-мамбами-битриксами-даталайфами и прочим… kr4shr – исправь эти 2 недостатка – и ты сделаешь революцию в сайтостроении. И вообще ты молодец – наконец-то начинали появляться вменяемые программисты.
…Комментарий отредактирован Админом (подправлен лексикон
)
июня 14, 2009 at 15:20
Уважаемый аффтар, не ваш ли это сайт http://www.cms-chaynik.ru там cms точно такаже как вы тут написали, и добавлен WYSIWYG-редактор, видимо по просьбе bengann)))
июня 14, 2009 at 19:02
Сайт не наш… а ЦМС явно наша и есть
Вообще, по правилам “хорошего тона” (как минимум) – автор сайта должен был поставить ссылочку на нас… Ну да, Бог ему судья…
июля 18, 2009 at 11:07
Ну радует хоть одно, что они не барыжат этой cms
февраля 11, 2010 at 13:12
Как это не барыжат? Еще как барыжат: “Стоимость CMS Бизнес Чайник – всего 4900 рублей”
cms-chaynik.ru/cms-chaynik-mlm/
февраля 19, 2010 at 17:38
Блин, скажите как загружать без FTP файлы на сервер
апреля 5, 2010 at 20:21
А можно ли добавить поле для указания физического имени файла (контента)?
Или как в этом случае можно организовать ЧПУ нормального вида?
Хочется добиться
RewriteRule ^(.*)$ index.php?id=$1
например: site.ru/content/ будет просить index.php?id=content
мая 11, 2010 at 09:08
Скажите, пожалуйста, как можно создать два блока меню, пробывал все удвоением menu2.php, menu2.csv: и инклюдил в индексный фаил(в нем удваивал переменные, которые отвечают за вывод), как, например, парсер menu2.php, но так и не добился вывода второго блока меню, теги %MENU2% ни чем не заменяются, почему-то. Помогите, пожалуйста.
Добавить комментарий