Лекции     Книги     Рефераты    

Пишем движок сайта (CMS – Систему управления контентом)

news date Сен.07.2008    categories Web-программирование > PHP    comments (10)

Начнём с admin_main.php, который отображается после входа в админку. О предназаначении этого модуля я уже говорил. Никаких хитростей там нет, поэтому вот листинг этого файла:

<!– JavaScript предупреждения об удалении страницы –>
<script type=”text/javascript”>
<!–
function confirmation(deletfile) {
var answer = confirm(“Вы действительно хотите удалить страницу?”);
if (answer){
window.location = “index.php?tp=delete&id=”+deletfile;
}
else{
alert(“Удаление отменено!”);
}
}
</script>

<table width=700><tr><td><strong>ФАЙЛ</strong></td>
<td><strong>МЕНЮ</strong></td>
<td><strong>TITLE</strong></td>
<td><strong>Редактировать</strong></td>
<td><strong>Удалить</strong></td>
<?php
// устанавливаем Русскую локаль (может быть необходимым для корректной работы регулярных выражений с кириллицей)
setlocale(LC_ALL, “ru_RU.CP1251″);
// получаем массив имен файлов статей
$articles = glob(“../content/*”);
if(!$articles) die (‘Нет ни одной страницы…’);
// Если массив содержит хотя бы один файл статьи, то идем циклом
foreach($articles as $article)
{
$content=file_get_contents($article); // получаем содержимое файла статьи в переменную
preg_match(“|..\/content\/(.*).php|Ui”, $article, $matches); // формируем ID страницы как имя файла, очищенное от пути и расширения (число)
$file_id=$matches[1];
preg_match(“|page_4menu = ‘(.*)\’\;|Ui”, $content, $matches1); // регулярным выражением получаем значение переменной page_4menu из файла
$page_4menu=$matches1[1];
preg_match(“|page_title = ‘(.*)\’\;|Ui”, $content, $matches2); // регулярным выражением получаем значение переменной page_title из файла
$page_title=$matches2[1];
// строим строку таблицы и выводим, при этом формируем ссылки на сценарии редактирования и удаления статей
echo ‘<tr><td>’.$article.’</td><td>’.$page_4menu.’</td><td>’.$page_title.’</td><td><a href=index.php?tp=edit&id=’.$file_id.’>Редактировать</a></td><td>’.”<a href=# onclick=\”confirmation(‘$file_id’)\”>Удалить</a></td></tr>”;
}
?></table>

Главный модуль админки ссылается на другие модули админки, например edit и delete. Сейчас мы их и напишем.

Начнём мы с написания модуля delete, то бишь файла admin_delete.php. Данный модуль просто удаляет страницу и перестраивает меню (для того, чтобы не возникало битых ссылок). Вся сложность файла содержится именно в перестроении меню, но в прокомменированном коде довольно просто разобраться:

<?php
// проверяем наличие переменной ID
if(!isset($_GET['id'])) die(‘Не задана страница для удаления’);
// удаляем заданный файл
if(unlink(‘../content/’.$_GET['id'].’.php’))
{
echo ‘Страница ‘.$_GET['id'].’ удалена’;
// если файл удален – перестраиваем меню (так же как в файле admin_edit.php при редактировании страницы)
$csvcont=”;
$articles = glob(“../content/*”);
if($articles)
{
foreach($articles as $article)
{
$content=file_get_contents($article);
preg_match(“|page_4menu = ‘(.*)\’\;|Ui”, $content, $matches);
preg_match(“|..\/content\/(.*).php|Ui”, $article, $matches2);
$file_id=$matches2[1];
$csvcont=$csvcont.$file_id.’;’.$matches[1].”\n”;
}
}
if($csvcont!=”)
{
if(!file_put_contents(‘../menu.csv’, $csvcont)) die(‘Ошибка записи меню’);
}
else
// если нет страниц то обнуляем меню
{
$fs=fopen(‘../menu.csv’, ‘w’);
fclose($fs);
}
}
else // если не удалось удалить файл
echo ‘Ошибка удаления…’;
?>

Теперь напишем несколько более сложный модуль: admin_edit.php. Он выводит в форму содержание файла с номером, который передан через get-параметр id (если он существует). При отправке формы записывает страницу в файл и перестраивает меню. Вот листинг этого файла:

<?php
if (isset($_GET['id'])) // если послана GET переменная id
{
$id = $_GET['id']; // получаем ID страницы для редактирования
// Проверяем наличие файла заданной страницы
if (!file_exists(“../content/” . $id . “.php”)) die (“Искомой страницы не существует. <a href=’index.php’>На главную</a>”);
// если файл существует – подключаем его
include(“../content/” . $id . “.php”); // и далее выводим форму редактирования, заполняя поля значениями переменных из подключенного файла
?>
<h1>Редактирование страницы</h1><br>
<form action=”index.php?tp=edit” method=”post”>
<input type=”hidden” name=”action” value=”do”>
<input type=”hidden” name=”id” value=”<? echo $id; ?>”>
<textarea cols=”60″ rows=”10″ name=”text”><? echo $content; ?></textarea><br>
<table>
<tr><td>Заголовок:</td><td><input name=”title” type=”text” value=”<? echo $page_title; ?>” size=”60″></td></tr>
<tr><td>Ключевые слова:</td><td><input name=”keys” type=”text” value=”<? echo $page_keyws; ?>” size=”60″></td></tr>
<tr><td>Описание:</td><td><input name=”desc” type=”text” value=”<? echo $page_descr; ?>” size=”60″></td></tr>
<tr><td>Ссылка в меню:</td><td><input name=”link” type=”text” value=”<? echo $page_4menu; ?>” size=”60″></td></tr>
</table>

<input type=”submit” value=”отредактировать”>
</form>
<?php
}
if (isset($_POST['action'])) // если послана форма
{
if (!isset($_POST['text']) || !isset($_POST['title']) || !isset ($_POST['link'])) // проверяем наличие всех необходимых полей
{
die (“Не указаны необходимые данные. <a href=’admin_main.php’>На главную</a>”);
}
// формируем строку для записи в файл страницы из значений переменных формы
$content = “<?\r\n\$page_title = ‘” . $_POST['title'] . “‘;\r\n” .
“\$page_descr = ‘” . $_POST['desc'] . “‘;\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?>”;
// Если отсутствует функция 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;
}
} // закончили описание функции file_put_contents
}
// Пытаемся записать файл страницы
if (!file_put_contents(“../content/” . $_POST['id'] . “.php”, $content)) die (“Ошибка записи”);
else // если успешно записали
{
// перестраиваем меню
$csvcont=”; // переменная для формирования нового меню
$articles = glob(“../content/*”); // получаем массив файлов директории /content
foreach($articles as $article) // и под циклом
{
$content=file_get_contents($article); // получаем содержимое файла в переменную
preg_match(“|page_4menu = ‘(.*)\’\;|Ui”, $content, $matches); // регулярным выражением находим в файле значение переменной page_4menu (анкор для меню)
preg_match(“|..\/content\/(.*).php|Ui”, $article, $matches2); // регулярным выражением отделяем ID страницы (очищаем имя файла от пути и расширения)
$file_id=$matches2[1];
$csvcont=$csvcont.$file_id.’;’.$matches[1].”\n”; // формируем строку для записи в файл меню
}
if(!file_put_contents(‘../menu.csv’, $csvcont)) die(‘Ошибка записи меню’); // пытаемся записать новый файл menu, при неудаче – выходим
// если удалось записать – сообщаем
echo (“Успешно изменено. <a href=’index.php’>Вернуться на главную</a>”);
}
}
?>

Обсуждения

10 комментариев к “Пишем движок сайта (CMS – Систему управления контентом)”
  1. AMD пишет:

    я бы не назвал этот сайт CMS, а просто движок :)

  2. garlic пишет:

    Сам-то понял, что сказал?

  3. bengann пишет:

    Без сомнения эта система управления – ЛУЧШАЯ в рунете, и не надо ее нагружать всякой ерундой! Единственный недостаток – отсутствие WYSIWYG-редактора. Вопрос – как его прикрутить? Ах да – еще недостаток: чтобы главная страница была index.php а не index.php?id=1. А такие, как AMD пусть пользуются этими непонятно для кого написанными джумлами-ньюками-мамбами-битриксами-даталайфами и прочим… kr4shr – исправь эти 2 недостатка – и ты сделаешь революцию в сайтостроении. И вообще ты молодец – наконец-то начинали появляться вменяемые программисты.

    …Комментарий отредактирован Админом (подправлен лексикон :) )

  4. sotona пишет:

    Уважаемый аффтар, не ваш ли это сайт http://www.cms-chaynik.ru там cms точно такаже как вы тут написали, и добавлен WYSIWYG-редактор, видимо по просьбе bengann)))

  5. admin пишет:

    Сайт не наш… а ЦМС явно наша и есть :)
    Вообще, по правилам “хорошего тона” (как минимум) – автор сайта должен был поставить ссылочку на нас… Ну да, Бог ему судья… :)

  6. sotona пишет:

    Ну радует хоть одно, что они не барыжат этой cms

  7. nauk пишет:

    Как это не барыжат? Еще как барыжат: “Стоимость CMS Бизнес Чайник – всего 4900 рублей”
    cms-chaynik.ru/cms-chaynik-mlm/

  8. ARS пишет:

    Блин, скажите как загружать без FTP файлы на сервер

  9. Александр пишет:

    А можно ли добавить поле для указания физического имени файла (контента)?
    Или как в этом случае можно организовать ЧПУ нормального вида?

    Хочется добиться
    RewriteRule ^(.*)$ index.php?id=$1
    например: site.ru/content/ будет просить index.php?id=content

  10. exdesign пишет:

    Скажите, пожалуйста, как можно создать два блока меню, пробывал все удвоением menu2.php, menu2.csv: и инклюдил в индексный фаил(в нем удваивал переменные, которые отвечают за вывод), как, например, парсер menu2.php, но так и не добился вывода второго блока меню, теги %MENU2% ни чем не заменяются, почему-то. Помогите, пожалуйста.

Добавить комментарий



Ваш комментарий:

 



© 2009 - 2010 | Webteach.ru | Образовательный портал