Всем доброго времени суток! Добро пожаловать на Блог RS! Сегодня нам предстоит довольно муторная работа, необходимо реализовать, в админ панели нашего движка, способность отмечать родительные и дочерние пункты нашего меню. Вообще ничего сложного нам не предстоит, если не считать, что обработать придется пять файлов, один из них создать с нуля, другой полностью переписать.
Давайте я выложу список целей, и не много поясню фронт работы на сегодня
Для того чтобы все прошло как по маслу, Вам необходимо освежить память и почитать предыдущий пост, и вот эту статью
Прежде чем я продолжу, хочу сказать пару слов тем кто на блоге впервые. Этот пост является частью цикла статей, которому по сути и посвящен данный блог, "Создать блог нуля". Так как данная статья лишь часть глобальной темы, то отдельно он не представляет какой либо ценности. Если у Вас есть желания написать свой движок персонального блога с нуля, то Вы попали туда куда нужно, переходите по ссылке, что я дал Вам выше, и приступайте к изучению.
Если Вам интересен материал данного блога то подпишитесь на RSS ленту блога через ридер, или же по почте
Будем работать по принципу, даю Вам полный, или часть кода, объясняю как он работает и куда его вставить. В коде есть комментарии так, что объяснения в этом посте и короткие комментарии в самом коде дадут Вам четко понять как все устроенно.
Вот код нужного нам шаблона
<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] позволяет отобразить в редакторе уже выбранный родительный пункт
Как я уже говорил шаблон схож с шаблоном который мы писали в посте "Доделываем редактор постов для нашей 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/
Для чего это надо? Так как теперь у каждого пункта необходимо делать проверку: "Есть ли у него родительный пункт?" и при этом выводить имя этого родительного пункта, то старый алгоритм, где вывод информации делался прямо из базы данных, теперь не актуален. Необходимо прибегнуть, как и в случае реализации меню в пользовательской части нашего движка, к многомерному массиву. Смотрим код:
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"," ",$copy_tamp);
else $copy_tamp = str_replace("[_up]","",$copy_tamp);//Если пункт не первый, то удаляем код слово из шаблона
//Если обрабатываем последний пункт, то запрещаем вывод кнопки "опустить пункт вниз"
if($menuMASS[$i][3] == $col)$copy_tamp = preg_replace("/\[_down\].*?\[_down\]/s"," ",$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 код
}
Суть функции все та же. Выводим все пункты из базы данных и формируем список. Но только теперь вывод идет не из базы данных, а из массивов. Немного подробнее:
Более добавить по этой функции нечего, смотрите комментарии и будет Вам счастье =) Вот как это выглядит у меня:
Эту функцию следует вставить в самый низ файла 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;
}
В случая если нет родительного пункта, мы видим прочерк
Если же родительный пункт был выбран ранее то увидим его сразу же
Пункт мы видим по причине того что в теге <option> стоит атрибут selected. Надеюсь Вам все понятно =)
В самый верх нашего файла 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;//на страницу пунктов меню
}
//РЕДАКТИРОВАНИЕ РОДИТЕЛЬНОГО ПУНКТА
тут ничего для Вас нового нет! Определение переменной, и запись ее в базу данных
Необходимо лишь передать сам запрос в базу данных. Вот новый запрос:
$result_add_menu = mysql_query ("INSERT INTO menu (name,href,position,podmenu)
VALUES ('$addname_p','$addhref_p','$col','0')");
Принудительно прописываем в колонку podmenu ноль. Это все изменения =)
Открываем файл 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 Вы можете посмотреть лучшие исторические фильмы, и не только! Увлекательного Вам просмотра =)