Здравствуй дорогой читатель! Приветствую на продолжение цикла статей посвященного созданию CMS блога! Сегодня мы будем писать редактор для нашей CMS. В прошлой статье мы писали форму добавления постов в базу данных, сейчас же нам предстоит организовать точно такую же форму, но цель ее будет вытащить из базы данных пост, и сохранить изменения которые мы с Вами внесем. Как и добавление постов, редактор будет выглядеть в виде простой формы. В скором будущем мы начнем писать bb коды для этой формы, но а сейчас она будет уметь лишь добавлять простой текст, и не более того...
Предлагаю начать с того, по каким ссылкам будут находится наши странички, которые мы сейчас создадим, и сколько страничек будет вообще! Отвечу с начало на вопрос: "Сколько страничек будет?" Их будет две, на первой мы будем видеть полный список наших постов, на второй же будет находится форма редактирования. Для того что бы писать ссылки, в будущем нашем коде, сразу объявим, что список постов будет находится по адресу index.php?page=all_content, а форма - index.php?page=edd_content&id=ID_поста. Узнавать номер поста будем через глобальную переменную GET['id']. Чует мое сердце, что эта глобальная переменная будет отвечать не только за ID поста, поэтому стоит определить ее в главном нашем файле index.php, но об этом мы поговорим ниже
Для реализации этой страницы нам нужно создать шаблон. Я набросал html код, вот он:
<table width="600px" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td width="250px" height="30px" valign="top" style="font-weight:bold;">Название поста</td>
<td valign="top" style="font-weight:bold;">Автор поста</td>
</tr>
[_while]
<tr>
<td width="250px" valign="top"><a style="font-weight:100;" href="/index.php?page=edd_content&id=[_id]">[_title]</a></td>
<td valign="top">[_author]</td>
</tr>
[_while]
</table>
Разберем наши код-слова:
Я не зря начал статью с ссылок на страничку, ведь после того как мы определили какие страницы у нас будут, мы без труда можем, наш заголовок, переделать в ссылку которая будет вести на форму поста [_id]
Назвал я этот шаблон allcontent.html и поместил в папку с шаблонами templates
Пришло время создать шаблон формы. Она уж очень схожа с шаблоном который мы делали в прошлой статье. Но разница все же есть, во-первых необходимо добавить одно скрытое поле, которое будет передавать, в обработчик, ID нашего поста, так же нужно исправить название кнопки, добавить код-слова и переделать name у инпутов. Вот html код шаблона:
<table width="600px" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td width="100px" height="100px" valign="top" align="center">
<form action="?page=edd_content" method="post" name="form">
<input name="edd_id_post" type="hidden" value="[_id]">
<br>
<input style="width:600px;" name="edd_name_post" type="text" value="[_title]">
<br>
<textarea style="width:600px;height:600px;" name="edd_txt_post" rows="10">[_text]</textarea>
<input style="width:600px;" name="edd_author_post" type="text" value="[_author]">
<br>
<br><br><input type="submit" value="Редактировать пост">
</form>
</td>
</tr>
</table>
В основном код-слова схожи с предыдущем шаблоном, но в этом появилась новое [_text] - не трудно догадаться, что оно будет отвечать за текст самого поста.
Так же обратите внимание, что обработчик нашей формы будет лежать на странице index.php?page=edd_content
Назвал я этот шаблон eddcontent.html и сохранил в папке с шаблонами templates
Давайте подумаем, что он из себя будет представлять? Я думаю стоит написать две функции, одна будет отвечать за вывод списка, вторая же будет отвечать за саму форму. Подключать этот модуль будем в случае если наша переменная $page равна "all_content" или "edd_content".
Вот код с комментариями:
function allcontent()//Функция вывода списка постов
{
$sm_read = file("templates/allcontent.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
preg_match("/\[_while\](.*?)\[_while\]/s",$sm_read,$tamp_while);//Находим в шаблоне тут часть, которую будет ду вайлить
$result_index = mysql_query("SELECT id,author,title FROM blog ORDER BY id DESC");//Выводим из базы данных посты
$myrow_index = mysql_fetch_array($result_index);
do
{
$copy_tamp = $tamp_while[1];//Сохраняем ту часть которая будет повторяться в отдельную переменную
//Делаем замены код-слов
$copy_tamp = str_replace("[_title]",$myrow_index[title],$copy_tamp);//Название поста
$copy_tamp = str_replace("[_author]",$myrow_index[author],$copy_tamp);//Автор
$copy_tamp = str_replace("[_id]",$myrow_index[id],$copy_tamp);//ID постов
$list .= $copy_tamp;//Объединяем результат в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));
$sm_read = preg_replace("/\[_while\].*?\[_while\]/s",$list,$sm_read);//Вставляем в шаблон список постов
return $sm_read;//Выводим с генерированный html код
}
Функцию сохранил как allcontent.php в папке moduls
Эта функция будет по id вытаскивать из базы данных всю информацию о посте, и сохранять ее форме, в общем то ничего сложно Вот код с комментариями:
function eddcontent($id)//Функция вывода выбранного поста
{
$result_index = mysql_query("SELECT * FROM blog WHERE id='$id'");//Выводим из базы данных пост
$myrow_index = mysql_fetch_array($result_index);
$sm_read = file("templates/eddcontent.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
$text_post = str_replace("<BR>","",$myrow_index[text]);//заменяем br в тексте на пустоту
//Делаем замены код-слов
$sm_read = str_replace("[_title]",$myrow_index[title],$sm_read);//Название поста
$sm_read = str_replace("[_text]",$text_post,$sm_read);//Текст поста
$sm_read = str_replace("[_author]",$myrow_index[author],$sm_read);//Автор
$sm_read = str_replace("[_id]",$myrow_index[id],$sm_read);//ID постов
return $sm_read;//Выводим с генерированный html код
}
Добавил эту функцию в уже существующий модуль allcontent.php
После отправки отредактированной информации из формы, переменные содержащие информацию, обработаются и сохраняться а базе данных, давайте напишем обработчик, вот его код с комментариями:
//ОБРАБОТЧИК
//Объявляем переменные, если форма была отправлена
if($_POST['edd_name_post'])$edd_name_post = $_POST['edd_name_post'];
if($_POST['edd_txt_post'])$edd_txt_post = $_POST['edd_txt_post'];
if($_POST['edd_author_post'])$edd_author_post = $_POST['edd_author_post'];
if($_POST['edd_id_post'])$edd_id_post = $_POST['edd_id_post'];
//Объявляем переменные, если форма была отправлена
if($edd_name_post & $edd_txt_post & $edd_author_post)
{
//Избавляемся от html кода
$edd_name_post = htmlspecialchars($edd_name_post);
$edd_txt_post = htmlspecialchars($edd_txt_post);
$edd_author_post = htmlspecialchars($edd_author_post);
//Избавляемся от html кода
//Избавляемся от кавычки
$edd_name_post = str_replace("'","'",$edd_name_post);
$edd_txt_post = str_replace("'","'",$edd_txt_post);
$edd_author_post = str_replace("'","'",$edd_author_post);
//Избавляемся от кавычки
$edd_txt_post = str_replace("\n","<BR>",$edd_txt_post);//Заменяем переносы строки на тег <BR>
//ОБНОВЛЯЕМ ПОСТ В БАЗЕ ДАННЫХ
$edd_blog = mysql_query ("UPDATE blog SET text='$edd_txt_post',title='$edd_name_post',author='$edd_author_post' WHERE id='$edd_id_post'");
//ОБНОВЛЯЕМ ПОСТ В БАЗЕ ДАННЫХ
header("location: index.php?page=all_content");//Перенаправление
exit;//на страницу списка постов
}
//ОБРАБОТЧИК
Добавил я этот кусок кода в файл allcontent.php перед нашими функциями allcontent() и eddcontent($id)
Осталось дело за малым, подключить наш модуль к админке. Но прежде чем это сделать, хотел бы вернуться к разговору о глобальной переменной GET['id']. Откройте наш файл index.php и добавьте этот кусочек кода:
if($_GET['id'])$id = $_GET['id'];
перед:
if($_GET['page'])$page = $_GET['page']; else $page = "index";
Смысл в том, что нам скорее всего пригодится эта глобальная переменная, и для того чтобы не объявлеть ее снова и снова, объявим в самом начале Сохраним файл, но не закрываем.
Вернемся к подключению нашего модуля. У нас есть две функции. Функция allcontent() будет подключаться в случае если переменная $page равна "all_content", а функция eddcontent($id) - в случае если $page равна "edd_content" Вот код с комментариями:
//РЕДАКТОР КОНТЕНТА
if($page == "all_content" || $page == "edd_content")
{
include("moduls/allcontent.php");//Подключаем наш модуль
if($page == "all_content")$txt = allcontent();//Если пост еще НЕ выбран
if($page == "edd_content")$txt = eddcontent($id);//Если пост выбран
}
//РЕДАКТОР КОНТЕНТА
Вставляется этот кусок кода перед подключением нашего главного шаблона:
include("templates/index.html");
Осталось разместить ссылку, на список постов, на главной странице админ панели. Для этого открываем шаблон menu.html который мы создавали в прошлой статье, и добавляем ссылку:
<table width="600px" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td width="100px" height="100px" valign="top" align="center"><a href="?page=add_content"><img src="img/add_content.jpg" border="0px"></a></td>
<td width="100px" height="100px" valign="top" align="center"><a href="?page=all_content"><img src="img/all_content.jpg" border="0px"></a></td>
<td width="100px" height="100px" valign="top" align="center"> </td>
<td width="100px" height="100px" valign="top" align="center"> </td>
<td width="100px" height="100px" valign="top" align="center"> </td>
<td width="100px" height="100px" valign="top" align="center"> </td>
</tr>
</table>
Вот изображение кнопки: Кнопка
Ну что ж, сегодня мы реализовали простейший редактор для нашей админ панели, в следующей статье мы скорее всего будем создавать bb коды для наших форм, так что не "переключайтесь", спасибо, что прочли статью, удачи Вам, у меня все!
Исходник |
Если проблема в пользовательской части блога, то мой первый вопрос: прошли ли вы все этапы создания пользовательской части? Я про пункт "Часть III - Разработка пользовательской части блога" вот в этом посте:
http://rio-shaman.ru/index.php?blog=36
Часть III делал не всё, некоторые пункты пропустил... видимо не стоило.
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\00blog\admin\index.php:1) in Z:\home\localhost\www\00blog\admin\moduls\allcontent.php on line 31
31 строка
header("location: index.php?page=all_content");//Перенаправление
header("location: index.php?page=all_content");//Перенаправление
Выводится какой то текст, оператором echo или каким либо другим способом. Либо ищите где вписывали объявление, либо скидывайте архивом Вашу сборку, я посмотрю.
п»їп»ї
Для этого нужно открыть файлы блокнотом:
-Выбрать "Сохранить как..."
-Выбрать кодировку ANSI
-Пересохранить с заменой
Кодировка неверная, отсюда каракозябры появляются, которые мешают работать скрипту
А можно спросить вне топа? titl в закладках иногда с каракозябрами, читала в поисковиках о возможных причинах, но простого решения так и не нашла. Пишут про charset=utf-8, что возвращает все-равно windows-1251 и.т.п. Может как-то можно это поправить ?
http://rio-shaman.ru/download/download_1916593448.rar
вообщем написал код позволяющий выводить список файлов на экран с возможностью удаления конкретного файла. С выводом проблем нет, а вот удалять - не в какую, пишет нет прав, это при том что у меня денвер. Поможете? Вот код:
При таком коде форма выглядит вот так:
за второе замечание я знаю, ещо не успел доделать, зациклился на этой ошибке, спасибо за помощ)
Например во так:
В конце статьи есть исходник