[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Добавление пункта меню через панель управления...
userguest
Здравствуйте.
Хочу сделать возможность добавления пункта меню через администраторскую зону, не вручную в коде. Все сводится к тому, что нужно вставить заранее известный кусок кода в нужное место меню, которое находится в отдельном блоке (php файле, который методом include добавляется на страницу). Т.е. пока без возможности выбора места среди остальных пунктов - это позднее. Начну с простого.
Как это вообще обычно делается?

Мое предположение:
Имеем название пункта меню и его ссылку, т.е. адрес, на который он ведет.
1.Открываем файл с меню для записи и чтения.
2. Ищем последнее вхождение идентификатора последнего пункта меню (т.е. я заранее добавляю его после последнего пункта).
3. Делаем запись.
4. Закрыаем файл.



Спустя 8 часов, 25 минут, 34 секунды (20.06.2010 - 06:43) Basili4 написал(а):
А если пункт подменю то последний пункт меню уже не подойдет. Вам бы на мой взгляд передавать id пункта id_parent владелец это если под пункт ну название стиль сылки и возможно какие то свои данные

Вообщем Ваш алгоритм годен для реализации.

Спустя 3 часа, 33 минуты, 19 секунд (20.06.2010 - 10:16) userguest написал(а):
Спасибо за оценку.
Другой вариант с базами данных придумал. Оцените, пожалуйста.
Правда в этом алгоритме я немного застрял. Далее отмечу это место.
Цель та же - создавать меню через администраторскую зону, и добавил небольшое усложнение - возможность группировки меню через администраторскую

зону посредством JqueryUI Sortable, т.е. изменять порядок следования пунктов. Меню - одноуровневое, без подпунктов.

Есть таблица nav_menu с полями (MySQL):
id, id_menu, text, code, link_or_devider, order_number.

id - номер идентификатора в базе данных, заполняется автоматически.
id_menu - идентификатор пункта меню.
text - текст меню, т.е. то, что располагается между тегами <a href="#">Текст меню</a>.
code - код меню. Если меню выглядит таким образом:


<div class="nav_menu">

<div
class="style">

<ul
id="sortable">
<li
id="menu_a"><h3 class="devider">Заголовок 1</h3></li>
<li
id="menu_b"><a href="#">Пункт меню 1</a></li>
<li
id="menu_c"><h3 class="devider">Заголовок 2</h3></li>
<li
id="menu_d"><a href="#" >Пункт меню 2</a></li>
<li
id="menu_e"><h3 class="devider_link"><a href="#">Меню без подменю</a></h3></li>
</ul>

</div>

</div>



то кодом меню является, например:

<li><h3 class="devider">Заголовок 1</h3></li>


т.е. любой кусок кода, заключенный в теги <li></li>.
Отмечу, что в меню имеются пункты разного типа, оформлены одинаково, отличаются только цветом.


1 тип.
<li><h3 class="devider">Заголовок 1</h3></li>
Этот пункт является заголовком - разделителем, т.е. обозначает обобщенное название группы пунктов, идущих за ним. Ссылкой не является. Выделяется черным цветом.

2 тип.
<li><a href="#">Пункт меню 1</a></li>
Пункт меню, который является ссылкой. Выделяется белым цветом.

3 тип.
<li><h3 class="devider_link"><a href="#">Меню без подменю</a></h3></li>
Отличается от первого типа тем, что является самостоятельной ссылкой на крупные разделы.



С полем code закончено.
Поле link_or_devider - здесь хранится одно из значений "link" или "devider".
Это поможет в дальнейшем при выводе меню отличать 2-й и 3-й тип меню визуально, т.к. выглядят они одинаково. Разница чувствуется только когда курсор мыши меняет форму при наведении.. Например, поставить условие: если значение поля link_or_devider равняется "link", то к примеру к пункту добавляется маленький значок стрелочки, который бы обозначал, что данный пункт 3-его типа является самостоятельной ссылкой и уже не похож на 2-й тип.

Далее order_number - здесь хранится порядковый номер пункта в меню.

Теперь как будет все это работать.

Для публичной зоны:

Выводом меню занимается код, вынесенный в отдельный блок main_menu.php.

Суть вот в чем:
Делается циклический вывод всех полей code из таблицы с сортировкой по полю
order_number.
Т.е.



$result = mysql_query ("SELECT * FROM nav_menu ORDER BY order_number", $db);
$myrow = mysql_fetch_array ($result);

do {
print ($myrow['code']);
}
while ($myrow = mysql_fetch_array ($result));



Для администраторской зоны:

Здесь имею другой блок вывода main_menu.php с тем же самым кодом. Отличием от публичного блока является то, что в этом подключен Jquery Sortable, и тут мы уже имеем возможность сортировки меню.

Как это работает дальше:

Дальше мы сортируем меню нужным образом и с помощью метода jQuery Sortable toArray получаем массив.

Вот как получаю массив:


<script type="text/javascript">
$(function() {
$("#sortable").sortable();
$("#sortable").disableSelection();
var result_array = $('#sortable').sortable('toArray');
});
</
script>


Массив будет следующего содержания. Цитата с сайта:


Если имеею:

<ul id="a_sortable"><br>
<li
id="hello">Hello</li><br>
<li
id="goodbye">Good bye</li><br>
</ul>


то получаю:

result[0] содержит "hello" а result[1] будет содержать "goodbye".

Т.е. в моем случае получу массив result_array с новым порядком пунктов меню.

Здесь, как и обещал, отмечаю, что вот тут я и застрял. Не могу вытащить result_array из java в PHP. Пытаюсь олучить к нему доступ делая вот , что: передаю значение этого массива этой же странице:

        
<form name="take_array" method="POST" action="thispage.php">
<input
name="array" type="hidden" value="<?php echo (Array $result_array)?>"><br>
<input
name="formbutton_feedback" type="submit" value="Отправить" class="class"><br>
</form>


и код на этой же странице:

printf($_POST);

не печатает ничего кроме слова ARRAY.

Все про мою загвоздку все, рассказываю дальше.
После того как имею массив result_array с новым порядком - записываю его в базу.

foreach ($all as $key => $value){
$result = mysql_query ("UPDATE nav_menu SET order_number='$key+1' WHERE id_menu='$value'", $db);
;
}

После чего идет перенаправление на страницу, где говорится, что сортировка успешно завершена. И, кстати, где уже обновленное меню.

Все теперь новы порядок записан. И в следующий раз меню будет выводиться в новом порядке.

Здесь я описал ключевые моменты сортировки. Создание не буду описывать, т.к. это просто. Решение - простая форма для записи всех значений полей таблицы и добавление данных в таблицу. По-умолчанию данные добавляются в таблицу после последней записи, с порядковым номером пункта, который еще не использовался, для этого подсчитываем количество записей в таблице прибавляем один - все готово. Нужное место новому пункту определяю в администраторской зоне путем сортировки.

Спустя 1 день, 4 часа, 33 минуты, 5 секунд (21.06.2010 - 14:49) userguest написал(а):
Знатоки, покритикуйте и помогите.

Спустя 9 минут, 57 секунд (21.06.2010 - 14:59) qpayct написал(а):
наверное лучше было бы сделать в файле-шаблоне, только вот как его менять я пока не знаю сам и тож присоединяюсь к вопросу ТС.

Спустя 1 день, 5 часов, 24 минуты, 15 секунд (22.06.2010 - 20:24) userguest написал(а):
Эксперты?

Спустя 10 часов, 39 минут, 9 секунд (23.06.2010 - 07:03) Basili4 написал(а):
Я так и не увидел вопроса буков много. идею понял. Мне единственное не ясно зачем два скрипта делать для вывода меню. А так алгоритм на мой взгляд годный для реализации.

Спустя 1 час, 48 минут, 55 секунд (23.06.2010 - 08:52) userguest написал(а):
Спасибо за оценку, именно этого я и просил.

По поводу двух скриптов: один для публичной зоны, другой для администраторской - они отличаются кодом.

А вопрос был вот в чем: я застрял в реализации этого мини-плана.
В javascript получаю массив result_array:

<script type="text/javascript">
$(function() {
...
var result_array = $('#sortable').sortable('toArray');
});
</
script>

<?
php
здесь нужно использовать result_array. Использование $result_array - не дает результата.
?>



Мне нужно его вытащить из javascript и использовать его в следующем блоке php кода.

Спустя 2 минуты, 23 секунды (23.06.2010 - 08:54) Basili4 написал(а):
тебе нужно спомощью ajax передать его на сервер. в jquery есть метод post

Спустя 5 часов, 12 минут (23.06.2010 - 14:06) userguest написал(а):
Я так понимаю нужна будет перезагрузка страницы?

Спустя 1 час, 38 минут, 48 секунд (23.06.2010 - 15:45) userguest написал(а):
Basili4, если можно - строчку кода.

Спустя 17 минут, 2 секунды (23.06.2010 - 16:02) Basili4 написал(а):
$.post("test.php", result: result_array );

вместо текст test.php скрипт которому передешь result_array

у тебя в срипте будет $_POST['result']

Спустя 3 часа, 20 минут, 17 секунд (23.06.2010 - 19:22) userguest написал(а):
Спасибо.

Спустя 4 часа, 1 минута, 30 секунд (23.06.2010 - 23:24) userguest написал(а):
Код доделал до конца.
Все работает как хотел.

Не смотря на это, есть вопрос.
доработанный вариант кода предложенного Basili4:
$.post( "obr.php", {result: result_array},function(data){$("#text_block").text(data)});
То есть по завершении работы обработчика выводится текст заданный обработчиком (echo('Операция закончена')) в блок div с id text_block. Как сделать, чтобы пока работает обработчик выводилось сообщение, например ждите или "спиннер" и только после того как завершит работу обработчик - сообщение "Операция закончена".

То о чем я говорю можно посмотреть на этом сайте. После щелчка на любом городе там сначала выводится сообщение "идет загрузка" и только потом результат работы обработчика.

Спустя 56 секунд (23.06.2010 - 23:25) userguest написал(а):

Спустя 6 часов, 45 минут, 58 секунд (24.06.2010 - 06:11) Basili4 написал(а):
перед



$.post( "obr.php", {result: result_array},function(data){$("#text_block").text(data)});


создаешь див позицеонируешь его как тебе надо даеш ему z-index побольше я обычно даю 9999

внутрь дива помещаешь анимированный гиф с загрузкой, показываешь этот див

в нутри твоей функции function(data){ .... } бьешь див.

Спустя 3 часа, 36 минут, 49 секунд (24.06.2010 - 09:47) userguest написал(а):
Как создать <div> с нужным классом с помощью Jquery/javascript?

Спустя 4 минуты, 45 секунд (24.06.2010 - 09:52) Basili4 написал(а):
вот кусок переделай под себя.

var container = document.createElement('div');

container.innerHTML='<div class="imageBox"> \
<div class="imageBox-title">'+title+'</div> \
<
div class="imageBox-body">'+body+'</div> \
<
div class="imageBox-ok">\
<
input type="button" value="OK"/>\
</
div> \
</
div>';
container.style.position = 'absolute';
container.style.zIndex=99999;
container.style.top = "5%";
container.style.left ="20%";
var input = container.getElementsByTagName('INPUT')[0];
input.onclick = function()
{
container.parentNode.removeChild(container);
}

document.body.appendChild(container)


Спустя 5 часов, 7 минут, 3 секунды (24.06.2010 - 14:59) userguest написал(а):
Спасибо за код.
Попробую разобраться.

Возник вопрос:

Можно ли считать скорость генерации страницы качественной оценкой совокупности методов, используемых для реализации тех или иных частей веб-страницы? Это я вот к чему: страницу, в данном случае ее часть - меню, алгоритм создания которого я описал, можно сделать разными способами (методами), например без использования баз данных. Мой вариант - один из множества. Кто-то может сказать, что это хороший код, по причине того, что не может жить без баз данных и пр. или наоборот, сказать, что это плохой код по обратной причине. То как создается веб-страница и из каких составляющих - дело вкуса и умения. Но ведь должны быть и объективные параметры оценки php кода страницы. Могу ли я в случае с моим кодом сказать, что это хороший код, а точнее сказать, основываясь на чем, исходя из каких критериев, я могу так сказать? Возвращаясь к первому вопросу - может ли быть скорость генерации страницы рассматриваться как самостоятельный объективный критерий качества созданной веб-страницы?

Спустя 3 минуты, 58 секунд (24.06.2010 - 15:03) Basili4 написал(а):
Я короче читал завис. Сразу вспомнил лекции по философии. Я скажу по простому хороший код это отказоустойчивый, быстрый, хорошо комментированный код.

Спустя 23 минуты, 42 секунды (24.06.2010 - 15:27) tomash написал(а):
userguest
Ух.... складно излагаете smile.gif

1. скорость разработки;
2. оптимальность (скорость, затраты ресурсов);
3. безопасность;
4. удобство сопровождения и расширения функционала;
5. функциональность.

Это как для меня
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.