Улучшаем редактор меню в админ панели нашего движка

 

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

 

 

Давайте я выложу список целей, и не много поясню фронт работы на сегодня

 

Цель

 

  • Первое, что нам понадобится это переделать шаблон вывода списка пунктов меню - allmenu.html. Добавить одну ссылку которая позволит перенестись на страницу редактирования родительных пунктов.
  • Создать новый шаблон. Чем то ( а может и полностью, я не проверял ) он будет схож с шаблоном eddcat.html который мы писали в посте "Доделываем редактор постов для нашей CMS".
  • Перепишем функцию allmenu() в файле eddmenu.php
  • Добавим еще одну функцию - eddpodmenu() в файл eddmenu.php. Функция предназначена для вывода списка пунктов которые можно будет сделать родительными.
  • Напишем обработчик для функции eddpodmenu()
  • Переделаем обработчик в файле addmenu.php. Необходимо добавить в колонку podmenu, нашей базы данных, по умолчанию ноль
  • На по следок необходимо будет подключить новую функцию eddpodmenu() в файле index.php

Для того чтобы все прошло как по маслу, Вам необходимо освежить память и почитать предыдущий пост, и вот эту статью

 

Предисловие

 

Прежде чем я продолжу, хочу сказать пару слов тем кто на блоге впервые. Этот пост является частью цикла статей, которому по сути и посвящен данный блог, "Создать блог нуля". Так как данная статья лишь часть глобальной темы, то отдельно он не представляет какой либо ценности. Если у Вас есть желания написать свой движок персонального блога с нуля, то Вы попали туда куда нужно, переходите по ссылке, что я дал Вам выше, и приступайте к изучению.

Если Вам интересен материал данного блога то подпишитесь на RSS ленту блога через ридер, или же по почте

 

Шаблон allmenu.html

 

Будем работать по принципу, даю Вам полный, или часть кода, объясняю как он работает и куда его вставить. В коде есть комментарии так, что объяснения в этом посте и короткие комментарии в самом коде дадут Вам четко понять как все устроенно.

Вот код нужного нам шаблона

<table width="600px" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td valign="top" height="30px" colspan="4"><a href="?page=add_menu"><img src="img/add.jpg" border="0px"></a></td>
</tr>
[_while]
<tr>
<td valign="top"><a style="font-weight:100;" href="?page=edd_menu&edd_menu=[_id]">[_name]</a></td>
<td valign="top"><a style="font-weight:100;" href="?page=podmenu&edd_menu=[_id]">[_podmenu]</a></td>
<td width="15px">[_up]<a href="?page=edd_menu&up_menu=[_id]"><img src="img/up.jpg" border="0px"></a>[_up]</td>
<td width="15px">[_down]<a href="?page=edd_menu&down_menu=[_id]"><img src="img/down.jpg" border="0px"></a>[_down]</td>
<td width="30px" align="right"><a href="?page=edd_menu&del_menu=[_id]"><img src="img/del.jpg" border="0px"></a></td>
</tr>
[_while]
</table>

Тут почти все как и было, за исключением того что появилась новая ссылка с новым код словом

<td valign="top"><a style="font-weight:100;" href="?page=podmenu&edd_menu=[_id]">[_podmenu]</a></td>

Эта ссылка перенаправит нас на страницу редактирования родительных пунктов. Код слово [_podmenu] позволяет отобразить в редакторе уже выбранный родительный пункт

отображение родительных пунктов

 

Новый шаблон eddpodmenu.html

 

Как я уже говорил шаблон схож с шаблоном который мы писали в посте "Доделываем редактор постов для нашей CMS" Вот код:

<table width="300px" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td valign="top" align="center">
<form action="index.php?page=podmenu&edd_menu=[_id]" method="post" name="form">
<select name="eddpodmenu">
[_option]
</select>
<br><br><input type="submit" value="Редактировать родительный пункт">
</form>
</td>
</tr>
</table>

Код-слово [_option] в последствие заменится на с генерированный html код, если быть точнее то на теги <option>. Этот файл следует поместить, как Вы могли уже догадаться в папку admin/templates/

 

Переписываем функцию allmenu() в файле eddmenu.php

 

Для чего это надо? Так как теперь у каждого пункта необходимо делать проверку: "Есть ли у него родительный пункт?" и при этом выводить имя этого родительного пункта, то старый алгоритм, где вывод информации делался прямо из базы данных, теперь не актуален. Необходимо прибегнуть, как и в случае реализации меню в пользовательской части нашего движка, к многомерному массиву. Смотрим код:

function allmenu()//Функция вывода списка mеню
{
$sm_read = file("templates/allmenu.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его

preg_match("/\[_while\](.*?)\[_while\]/s",$sm_read,$tamp_while);//Находим в шаблоне тут часть, которую будет ду вайлить

$result_index = mysql_query("SELECT * FROM menu ORDER BY position");//Выводим из базы данных пункты меню
$myrow_index = mysql_fetch_array($result_index);
$col = mysql_num_rows($result_index);//Узнаем общее количество пунктов в базе данных

$i=0;//позволяет листать массив с нуля до N
do
{
//создаем многомерный массив со всей инфой из БД
$menuMASS[$i] = array($myrow_index[id],//0
$myrow_index[name],//1
$myrow_index[href],//2
$myrow_index[position],//3
$myrow_index[podmenu]);//4
$i++;
}
while($myrow_index = mysql_fetch_array($result_index));

for($i=0;isset($menuMASS[$i]);$i++)//замена циклу do while
{
$copy_tamp = $tamp_while[1];//Сохраняем ту часть которая будет повторяться в отдельную переменную

//Если обрабатываем первый пункт, то запрещаем вывод кнопки "поднять пункт вверх"
if($menuMASS[$i][3] == 1)$copy_tamp = preg_replace("/\[_up\].*?\[_up\]/s","&nbsp;",$copy_tamp);
else $copy_tamp = str_replace("[_up]","",$copy_tamp);//Если пункт не первый, то удаляем код слово из шаблона

//Если обрабатываем последний пункт, то запрещаем вывод кнопки "опустить пункт вниз"
if($menuMASS[$i][3] == $col)$copy_tamp = preg_replace("/\[_down\].*?\[_down\]/s","&nbsp;",$copy_tamp);
else $copy_tamp = str_replace("[_down]","",$copy_tamp);//Если пункт не последний, то удаляем код слово из шаблона

if($menuMASS[$i][4] != 0)//Если podmenu не равен нуль, стало быть у пункта есть подпункт
{
for($m=0;isset($menuMASS[$m]);$m++)//листаем массив в поиске совпадений
{
if($menuMASS[$i][4] == $menuMASS[$m][0])//если podmenu равено ID
{
$namepodmenu = $menuMASS[$m][1];//заносим имя подпункта в переменную
break;//тормозим цикл
}
}
}
if(!isset($namepodmenu))$namepodmenu = "-";//Если нет подпункта

//Делаем замены код-слов
$copy_tamp = str_replace("[_podmenu]",$namepodmenu,$copy_tamp);//подпункт
$copy_tamp = str_replace("[_name]",$menuMASS[$i][1],$copy_tamp);//Название пункта
$copy_tamp = str_replace("[_id]",$menuMASS[$i][0],$copy_tamp);//ID пункта

$list .= $copy_tamp;//Объединяем результат в одну переменную
unset($namepodmenu);//уничтожаем переменную с именем.
}

$sm_read = preg_replace("/\[_while\].*?\[_while\]/s",$list,$sm_read);//Вставляем в шаблон список пунктов

return $sm_read;//Выводим с генерированный html код
}

Суть функции все та же. Выводим все пункты из базы данных и формируем список. Но только теперь вывод идет не из базы данных, а из массивов. Немного подробнее:

  • Первый цикл do while формирует многомерный массив который содержит всю информацию о пунктах в базе данных
  • После средствами цикла for формируется список.
  • В теле цикла for есть еще один цикл. Он срабатывает только в том случае если у пункта есть подпункт, а именно если колонка podmenu не равна нулю. В этом цикле отыскивается имя родительного пункта и заносится в отдельную переменную ( $namepodmenu ), для того что бы потом вставить это имя в шаблон, вместо код слова [_podmenu]
  • Если цикл не запущен, то есть есть колонка podmenu равна нулю, то в переменную которая содержит имя ( $namepodmenu ) заносится тире ( "-" )

Более добавить по этой функции нечего, смотрите комментарии и будет Вам счастье =) Вот как это выглядит у меня:

результат функции allmenu

 

Функция eddpodmenu()

 

Эту функцию следует вставить в самый низ файла eddmenu.php. Вот код с комментариями:

function eddpodmenu($id)//форма выбора родительного пункта
{
$sm_read = file("templates/eddpodmenu.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его

$result_index = mysql_query("SELECT * FROM menu ORDER BY position");//Выводим из базы данных пункты меню
$myrow_index = mysql_fetch_array($result_index);

$i=0;//позволяет листать массив с нуля до N
do
{
//создаем массив почти со всей инфой ищ БД
$menuMASS[$i] = array($myrow_index[id],//0
$myrow_index[name],//1
$myrow_index[podmenu]);//2
$i++;
}
while($myrow_index = mysql_fetch_array($result_index));

for($i=0;isset($menuMASS[$i]);$i++)//цикл для поиска родительного пункта
{
if($menuMASS[$i][0] == $id)//если id в массиве совпадает с id редактируемого пункта
{
$select = $menuMASS[$i][2];//то сохраняем значение найденного podmenu в переменную
break;//останавливаем цикл
}
}
$punkt = "<option value=\"0\">-</option>";//Создаем самый первый вариант
for($i=0;isset($menuMASS[$i]);$i++)//запускаем цикл формирования списка возможных родительных пунктов
{
if($menuMASS[$i][0] != $id)//отсеиваем из списка возможных род пунктов редактируемый пункт
{
//если id не равен переменной select то не создаем отметку selected для тега option
if($menuMASS[$i][0] != $select)$punkt .= "<option value=\"".$menuMASS[$i][0]."\">".$menuMASS[$i][1]."</option>";
//если id равен переменной select то отмечаем этот пункт как выбранный
else $punkt .= "<option value=\"".$menuMASS[$i][0]."\" selected>".$menuMASS[$i][1]."</option>";
}
}
$sm_read = str_replace("[_option]",$punkt,$sm_read);//теги option
$sm_read = str_replace("[_id]",$id,$sm_read);//ID пункта

return $sm_read;
}
  •  Первые строки функции подключают шаблон и выводят все, что есть из таблицы базы данных - menu
  • Далее с помощью цикла do while формируется многомерный массив
  • Первый цикл for ищет пункт в массиве который мы в данный момент редактируем. Делается это с целью узнать в какой именно элемент массива нужно вставить приставку selected в теге <option>
  • Далее мы формируем список исключая из него пункт который мы редактируем, так как один и тот же пункт не может являться и дочерним и родительным одновременно. Так же во время перебора массива мы отыскиваем, уже выбранный ранее, родительный пункт, если такой имеется то он помечается атрибутом selected. Таким образом мы увидим следующую картину:

В случая если нет родительного пункта, мы видим прочерк

прочерк в списке выбора

Если же родительный пункт был выбран ранее то увидим его сразу же

видим родительный пункт в списке

Пункт мы видим по причине того что в теге <option> стоит атрибут selected. Надеюсь Вам все понятно =)

 

Обработчик функции eddpodmenu()

 

В самый верх нашего файла eddmenu.php, после строчки

if($_GET['edd_menu'])$edd_menu = $_GET['edd_menu'];

Вставляем следующий код:

//РЕДАКТИРОВАНИЕ РОДИТЕЛЬНОГО ПУНКТА
if(isset($_POST['eddpodmenu']))$eddpodmenu = $_POST['eddpodmenu'];
if(isset($eddpodmenu))
{
$edd_punct = mysql_query ("UPDATE menu SET podmenu='$eddpodmenu' WHERE id='$edd_menu'");

header("location: index.php?page=all_menu");//Пере направление
exit;//на страницу пунктов меню
}
//РЕДАКТИРОВАНИЕ РОДИТЕЛЬНОГО ПУНКТА

тут ничего для Вас нового нет! Определение переменной, и запись ее в базу данных

 

Обработчик файла addmenu.php

 

Необходимо лишь передать сам запрос в базу данных. Вот новый запрос:

	$result_add_menu = mysql_query ("INSERT INTO menu (name,href,position,podmenu) 
VALUES ('$addname_p','$addhref_p','$col','0')");

Принудительно прописываем в колонку podmenu ноль. Это все изменения =)

 

Подключение функции eddpodmenu() в index.php

 

Открываем файл index.php и вместо старого подключения редактора меню, вставляем новый

//РЕДАКТОР МЕНЮ
if($page == "all_menu" || $page == "edd_menu" || $page == "podmenu")
{
include("moduls/eddmenu.php");
if($page == "all_menu")$txt = allmenu();
if($page == "edd_menu")$txt = eddmenu($edd_menu);
if($page == "podmenu")$txt = eddpodmenu($edd_menu);
}
//РЕДАКТОР МЕНЮ

 

Заключение

 

Муторно редактировать эти файлы, но в этом все программирование, сидишь и делаешь из одних и тех же строчек кода разные алгоритмы =) После проделанных шагов, мы можем делать "деревья" в меню, несколькими щелчками мыши в админ панели =). Если у Вас есть какие вопросы, то задавайте их, постараюсь ответить!

Если Вам понравился мой блог, то подпишитесь на RSS ленту блога через ридер, или же по почте

Всего Вам наилучшего! У меня все!

Исходник

_______

P.S.: 21 век, удивительный век. В наше время через экран монитора можно лицезреть почти, что все развлекательные передачи, книги, фильмы. Например на сайте videozer.ru Вы можете посмотреть лучшие исторические фильмы, и не только! Увлекательного Вам просмотра =)

 

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

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

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
К данной статье пока нет комментариев.