Доделываем редактор постов для нашей CMS

 

Доброго времени суток дорогой читатель Блога RS! Сегодня я решил посветить пост циклу статей "разработка cms", а именно продолжим писать нашу админку. Сегодня я собирался описать создание редактора меню, но вспомнил очень важную деталь. Мы не реализовали возможность удаление постов из базы данных. И раз уж сегодня пост будет посвящен доделыванию редактора постов, то внесем возможность привязывания поста к определенной категории на блоге. Мы с вами уже связали таблицу меню и таблицу с постами, что позволит теперь воздействовать через админ панель на содержания категорий блога, помещать новые посты в категорию, и извлекать старые.

 

 

Цели

 

  • Для начала напишем обработчик удаление поста из базы данных
  • Введем список выбора пунктов меню в форму добавления постов, так же подредактируем обработчик
  • Введем список выбора пунктов меню в редактор постов, так же подредактируем обработчик редактора

 

Удаление постов

 

Для начала я дам Вам маленькую графическую кнопочку. Поместите ее в папку с админкой, в каталог img

Кнопочка del

Теперь необходимо подправить шаблон 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;">&nbsp;</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;">&nbsp;</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.: Каждому человеку, который хочет научится работать в графическом редакторе, необходима практика! Познание новых эффектов могут помочь обрести новые навыки, и помочь добиться успехов. Узнайте как состарить фотографию посредством фотошопа, знания реализации такого эффект вполне может пригодится Вам в будущем!

 

Возможно Вам будут интересны следующие заметки

Комментарии (11)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Юрий, 10 Сентября 2012 г. 17:22 пишет:
Читатель
Работает все, кроме одной функции: нажимаю на "все материалы", выбираю материал для редактирования текста в нем - а там пустое поле. Т.е. в базе материал сам есть, название, текст, автор, категория, но когда я пытаюсь отредактировать сам текст (не категорию), то мне выдает пустую форму, без текста ...
Rio-Shaman, 12 Сентября 2012 г. 09:28 пишет:
Автор
В этом посте самое поле для редактирования текста вообще не правится... Даже не знаю, что Вам посоветовать, тут все должно работать...
Ответ для пользователя: Юрий
Sanya2104, 26 Июля 2013 г. 22:40 пишет:
Гость
Fatal error: Cannot redeclare allcontent() (previously declared in Z:\\home\\test1.ru\\www\\admin\\modules\\allcontent.php:92) in Z:\\home\\test1.ru\\www\\admin\\modules\\allcontent.php on line 126
вот что у меня выдаёт при переходе в редактирование постов
Алексей, 29 Июля 2013 г. 10:40 пишет:
Автор
У Вас есть где-то уже существует функция allcontent(). Найдите дубль, и переименуйте функцию...
Ответ для пользователя: Sanya2104
japson, 16 Января 2014 г. 15:09 пишет:
Гость
можно добавить редакцию категории в пост .
добавляем в код файла function eddcontent($id) (между какими показан код верхней и нижней строки - для отметки):
$text_post = str_replace("<BR>","",$myrow_index[text]);//заменяем br в тексте на пустоту

$allmenu = mysql_query("SELECT id,name FROM menu WHERE href=''");//Выводим из базы данных все пункт меню где href пуста
$menu = mysql_fetch_array($allmenu);
if($menu != "")//Если есть категории
{
    do//То формируем список
    {
		if ($menu[id]==$myrow_index[cat])
		{$sela= " selected";}
		else {$sela="";}
        $option .= "<option value=\"".$menu[id]."\"".$sela.">".$menu[name]."</option>\n";
    }
    while($menu = mysql_fetch_array($allmenu));
}



    //Делаем замены код-слов
	$sm_read = str_replace("[_cat]",$option,$sm_read);
    $sm_read = str_replace("[_title]",$myrow_index[title],$sm_read);//Название поста
смысл в чем. Вы сраниваете предыдущее состояние переменной cat и если нашли позицию, то присваиваете ей имя. В тоже время вы как и в добавлении нового поста определяете весь список значений категорий. Для возможного выбора.
в файле обработчике не забудьте добавить 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')");
//ДОБАВЛЯЕМ ПОСТ В БАЗУ ДАННЫХ
в файл eddcontent.html добавьте перед кнопкой submit (она счас в коде , чтобы не заблудиться):
 <br>
            
             <p align="left">
           Название рубрики: <select name="menu_post">
            <option value="0">Нет категории</option>
             [_cat]
            
            </select>
              </p>
            
            <br> 
            <br><br><input type="submit" value="Редактировать пост">
japson, 16 Января 2014 г. 15:11 пишет:
Гость
я там в sql запросе потерял у переменной "cat" букву "t"
Feel_Diference, 05 Февраля 2014 г. 06:22 пишет:
Гость
Не отображает по категориям, у меня 2 категории, разработка и нет категории. 2 статьи соответственно.
Нажимаю по категории разработка, выводятся 2 статьи, так и должно быть?
Алексей, 08 Февраля 2014 г. 22:50 пишет:
Автор
Т.е. у Вас одна статья лежит в каталоге "разработка", а другая не в каталоге. И при заходе в каталог "разработка" Вы видите как выводится две статьи?
Ответ для пользователя: Feel_Diference
я, 19 Февраля 2014 г. 20:17 пишет:
Гость
а у меня что-то именно здесь с кодировкой, надпись "Редактировать категорию" на кнопке отображает знаки вопроса..
Алексей, 20 Февраля 2014 г. 10:05 пишет:
Автор
Шаблон в какой кодировке?
Ответ для пользователя: я
я, 21 Февраля 2014 г. 21:34 пишет:
Гость
аа да..не та была кодировка,сейчас все нормально
Ответ для пользователя: Алексей