Доброго времени суток дорогой читатель Блога RS! Сегодня я решил посветить пост циклу статей "разработка cms", а именно продолжим писать нашу админку. Сегодня я собирался описать создание редактора меню, но вспомнил очень важную деталь. Мы не реализовали возможность удаление постов из базы данных. И раз уж сегодня пост будет посвящен доделыванию редактора постов, то внесем возможность привязывания поста к определенной категории на блоге. Мы с вами уже связали таблицу меню и таблицу с постами, что позволит теперь воздействовать через админ панель на содержания категорий блога, помещать новые посты в категорию, и извлекать старые.
Для начала я дам Вам маленькую графическую кнопочку. Поместите ее в папку с админкой, в каталог img
Теперь необходимо подправить шаблон allcontent.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>
<td valign="top" style="font-weight:bold;"> </td>
</tr>
[_while]
<tr>
<td width="250px" valign="top"><a style="font-weight:100;" href="?page=edd_content&id=[_id]">[_title]</a></td>
<td valign="top">[_author]</td>
<td valign="top"><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></td>
</tr>
[_while]
</table>
Я добавил новую колонку, которая содержит кнопку на удаление поста.
Теперь заходим в модуль allcontent.php и в самом вверху добавляем обработчик удаления поста:
//УДАЛЕНИЕ ПОСТА
if($_GET['del_post'])$del_post = $_GET['del_post'];//Объявляем переменную содержащею ID удаляемого поста
if($del_post)//Если переменная существует то...
{
$result_del_post = mysql_query ("DELETE FROM blog WHERE id='$del_post'");//...удаляем этот пост
header("location: ?page=all_content");//Переносим пользователя на страницу с постами
exit;
}
//УДАЛЕНИЕ ПОСТА
Ничего сверх естественного тут нет
Наша задачи вывести список с категориями в самом низу формы. Как определить является ли пункт меню категорией? Вспомните, мы в посте "Связываем меню и вывод мини новостей" делали такое условие:
Если колонка href у таблицы меню пуста, значит формируем ссылку в виде "index.php?cat=N". То есть все пункты у которых пуста эта колонка являются категориями!
Приступим. Открываем шаблон addcontent.html и редактируем форму
<form action="index.php?page=add_content" method="post" name="form">
<br>
<input style="width:600px;" name="name_post" type="text" value="Название статьи">
<br>
<textarea style="width:600px;height:600px;" id="txt_post" name="txt_post" rows="10">Введите текст*</textarea>
<input style="width:600px;" name="author_post" type="text" value="Автор*">
<br>
<p align="left">
<select name="menu_post">
<option value="0">Нет категории</option>
[_option]
</select>
</p>
<br><br><input type="submit" value="Добавить пост">
</form>
Я ввел новый элемент формы - список. Сформировал первый пунктик "Нет категории". Вдруг нам понадобится написать пост который не нуждается в категории. В атрибут value я поместил ноль. Это как раз и будет обозначать что у поста нет категории. Далее идет код слово, вместо него будут с генерированные, с помощью php, другие пунктики списка!
Теперь открываем модуль addcontent.php. Нам предстоит отредактировать функцию addcontent(). Она отвечает за вывод формы, значит именно в этой функции нам необходимо формировать наш список с категориями
function addcontent()
{
$sm_read = file("templates/addcontent.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
$allmenu = mysql_query("SELECT id,name FROM menu WHERE href=''");//Выводим из базы данных все пункт меню где href пуста
$menu = mysql_fetch_array($allmenu);
if($menu != "")//Если есть категории
{
do//То формируем список
{
$option .= "<option value=\"".$menu[id]."\">".$menu[name]."</option>\n";
}
while($menu = mysql_fetch_array($allmenu));
}
else $option = "";//Если нет категорий то создаем пустую переменную
$sm_read = str_replace("[_option]",$option,$sm_read);//Меняем код слово на с генерированный список
return $sm_read;//Выводим с генерированный html код
}
Логика проста. Вытаскиваем все пункты меню, у которых колонка href пуста, и формируем новые пунктики списка. После чего заменяем код слово на с генерированный код. Если категорий в БД нет, то код слово замениться на пустоту.
Дальше, в этом же модуле необходимо добавить следующую строчку
if($_POST['menu_post'])$menu_post = $_POST['menu_post'];
в самом вверху файла. Вот результат
//Объявляем переменные, если форма была заполнена и отправлена
if($_POST['name_post'])$name_post = $_POST['name_post'];
if($_POST['txt_post'])$txt_post = $_POST['txt_post'];
if($_POST['author_post'])$author_post = $_POST['author_post'];
if($_POST['menu_post'])$menu_post = $_POST['menu_post'];
//Объявляем переменные, если форма была заполнена и отправлена
После чего в самом обработчике отредактировать sql запрос на добавления поста
//ДОБАВЛЯЕМ ПОСТ В БАЗУ ДАННЫХ
$result_add_cont = mysql_query ("INSERT INTO blog (text,title,author,date_b,cat)
VALUES ('$txt_post','$name_post','$author_post','$date_cont','$menu_post')");
//ДОБАВЛЯЕМ ПОСТ В БАЗУ ДАННЫХ
Теперь при написание нового поста на блоге, есть возможность выбрать категорию для этого поста.
Сначала отредактируем шаблон списка постов allcontent.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>
<td 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="?page=edd_content&id=[_id]">[_title]</a></td>
<td valign="top">[_author]</td>
<td valign="top"><a style="font-weight:100;" href="?page=edd_cat&id=[_id]">[_cat]</a></td>
<td valign="top"><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></td>
</tr>
[_while]
</table>
Я добавил еще одну колонку. Назвал ее "Категории". Ввел новую ссылку и код слово [_cat]. Мы будем создавать кнопку на редактирования категорий прям в самом списке постов.
Теперь отредактируем модуль allcontent.php, а именно функцию allcontent()
$result_index = mysql_query("SELECT id,author,title,cat FROM blog ORDER BY id DESC");//Выводим из базы данных посты
$myrow_index = mysql_fetch_array($result_index);
do
{
$copy_tamp = $tamp_while[1];//Сохраняем ту часть которая будет повторяться в отдельную переменную
if($myrow_index[cat] != 0)
{
$result_cat = mysql_query("SELECT name FROM menu WHERE id='$myrow_index[cat]'");//Выводим из базы имя пункта
$myrow_cat = mysql_fetch_array($result_cat);
$name_cat = $myrow_cat[name];
}
else $name_cat = "Нет категории";
//Делаем замены код-слов
$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 постов
$copy_tamp = str_replace("[_cat]",$name_cat,$copy_tamp);//Имя категории
$list .= $copy_tamp;//Объединяем результат в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));
Изменению подвергся запрос выборки данных поста. То есть теперь нам еще необходимо делать выборку колонки cat. Далее я формирую имя категории. То есть если в базе данных, в колонке cat стоит ноль, то категория имеет имя "Нет категории". Если же там стоит какая-то цифра, то узнаем по этой цифре имя категории обращаесь в таблицу menu. Так же я добавил кусочек кода, который будет заменять код слово [_cat]
После нажатия на кнопку редактирования категории нас должно перенести в форму редактирования категории
Поэтому нам необходим новый шаблон с формой, вот код
<form action="index.php?page=edd_cat&id=[_id]" method="post" name="form">
<select name="edd_form_cat">
<option value="0">Нет категории</option>
[_option]
</select>
<br>
<br><br><input type="submit" value="Редактировать категорию">
</form>
В атрибуте action, тега form стоит ссылка на файл обработчик. Хочу пояснить почему именно такая ссылка. Я, для того что бы не запутаться в бесконечных ссылках, пытаюсь размещать обработчик по такому же адресу где и сама форма. Это упрощает процесс редактирования в будущем, и позволяет не путаться. То есть если форма находится по этому адресу
index.php?page=edd_cat&id=7
То обработчик будет находится именно по этому же адресу. Назвал я этот шаблон eddcat.html
Теперь в модуле allcontent.php напишем новую функцию, которая будет формировать форму редактирования категории из шаблона eddcat.html
function eddcat($id)//Функция редактирования категории у поста
{
$sm_read = file("templates/eddcat.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
$allmenu = mysql_query("SELECT id,name FROM menu WHERE href=''");//Выводим из базы данных все пункт меню где href пуста
$menu = mysql_fetch_array($allmenu);
if($menu != "")//Если есть категории
{
do//То формируем список
{
$option .= "<option value=\"".$menu[id]."\">".$menu[name]."</option>\n";
}
while($menu = mysql_fetch_array($allmenu));
}
else $option = "";//Если нет категорий то создаем пустую переменную
$sm_read = str_replace("[_id]",$id,$sm_read);//ID поста
$sm_read = str_replace("[_option]",$option,$sm_read);//Список
return $sm_read;//Выводим с генерированный html код
}
Функция не особо сложная, я ее за комментировал, поэтому разберетесь
Для того чтобы сейчас вы могли увидеть эту форму, Вам необходимо подключить новые возможности модуля к файлу index.php
//РЕДАКТОР КОНТЕНТА
if($page == "all_content" || $page == "edd_content" || $page == "edd_cat")
{
include("moduls/allcontent.php");//Подключаем наш модуль
if($page == "all_content")$txt = allcontent();//Если пост еще НЕ выбран
if($page == "edd_content")$txt = eddcontent($id);//Если пост выбран
if($page == "edd_cat")$txt = eddcat($id);//Если выбран редактор категории
}
//РЕДАКТОР КОНТЕНТА
Надеюсь тут понятно... Теперь при щелчке мыши по категории в списке постов, мы попадем на страницу редактирования категории
Остался последний штрих! Создать обработчик редактирование категории. Открываем файл allcontent.php и добавляем вот этот код
//РЕДАКТИРОВАНИЕ КАТЕГОРИИ
if(isset($_POST['edd_form_cat']))$edd_form_cat = $_POST['edd_form_cat'];//Определяем, была ли нажата кнопка "Редактировать категорию"
if(isset($edd_form_cat))//Если да
{
$new_cat = mysql_query ("UPDATE blog SET cat='$edd_form_cat' WHERE id='$id'");//то обновляем колонку cat у редактируемого поста
header("location: index.php?page=all_content");//Переносим пользователя на страницу с постами
exit;
}
//РЕДАКТИРОВАНИЕ КАТЕГОРИИ
в самый вверх файла
Если я ничего не забыл описать в посте, и Вы все сделали правильно, то получится вот так
За сегодня мы доделали наш редактор постов. Теперь посты можно не только добавлять и редактировать, но и удалять тоже. К тому же мы реализовали привязку постов к категориям через админ панель, тем самым на блоге теперь есть меню с рубриками!
В следующем посте мы с Вами сделаем редактор меню, это позволит добавлять новые рубрики, и редактировать старые! Так что не переключайтесь и подпишитесь на новости моего блога!
Если есть читатели которые повторяют разработку блога за мной, то отпишитесь, все ли у Вас получилось. В данной теме очень много мелочей, которые я вполне мог пропустить =(
Удачи Вам, на сегодня у меня все!
Исходник |
____
P.S.: Каждому человеку, который хочет научится работать в графическом редакторе, необходима практика! Познание новых эффектов могут помочь обрести новые навыки, и помочь добиться успехов. Узнайте как состарить фотографию посредством фотошопа, знания реализации такого эффект вполне может пригодится Вам в будущем!
добавляем в код файла function eddcontent($id) (между какими показан код верхней и нижней строки - для отметки):
в файле обработчике не забудьте добавить adcontent.php для сохранения нового значения:
$result_add_cont = mysql_query ("INSERT INTO blog (text,title,author,date_b,cat)
VALUES ('$txt_post','$name_post','$author_post','$date_cont','$$menu_post')");
//ДОБАВЛЯЕМ ПОСТ В БАЗУ ДАННЫХ
Нажимаю по категории разработка, выводятся 2 статьи, так и должно быть?