Хочу сделать возможность добавления пункта меню через администраторскую зону, не вручную в коде. Все сводится к тому, что нужно вставить заранее известный кусок кода в нужное место меню, которое находится в отдельном блоке (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 - код меню. Если меню выглядит таким образом:
то кодом меню является, например:
т.е. любой кусок кода, заключенный в теги <li></li>.
Отмечу, что в меню имеются пункты разного типа, оформлены одинаково, отличаются только цветом.
С полем code закончено.
Поле link_or_devider - здесь хранится одно из значений "link" или "devider".
Это поможет в дальнейшем при выводе меню отличать 2-й и 3-й тип меню визуально, т.к. выглядят они одинаково. Разница чувствуется только когда курсор мыши меняет форму при наведении.. Например, поставить условие: если значение поля link_or_devider равняется "link", то к примеру к пункту добавляется маленький значок стрелочки, который бы обозначал, что данный пункт 3-его типа является самостоятельной ссылкой и уже не похож на 2-й тип.
Далее order_number - здесь хранится порядковый номер пункта в меню.
Теперь как будет все это работать.
Для публичной зоны:
Выводом меню занимается код, вынесенный в отдельный блок main_menu.php.
Суть вот в чем:
Делается циклический вывод всех полей code из таблицы с сортировкой по полю
order_number.
Т.е.
Для администраторской зоны:
Здесь имею другой блок вывода main_menu.php с тем же самым кодом. Отличием от публичного блока является то, что в этом подключен Jquery Sortable, и тут мы уже имеем возможность сортировки меню.
Как это работает дальше:
Дальше мы сортируем меню нужным образом и с помощью метода jQuery Sortable toArray получаем массив.
Вот как получаю массив:
Массив будет следующего содержания. Цитата с сайта:
Если имеею:
то получаю:
result[0] содержит "hello" а result[1] будет содержать "goodbye".
Т.е. в моем случае получу массив result_array с новым порядком пунктов меню.
Здесь, как и обещал, отмечаю, что вот тут я и застрял. Не могу вытащить result_array из java в PHP. Пытаюсь олучить к нему доступ делая вот , что: передаю значение этого массива этой же странице:
и код на этой же странице:
не печатает ничего кроме слова ARRAY.
Все про мою загвоздку все, рассказываю дальше.
После того как имею массив result_array с новым порядком - записываю его в базу.
После чего идет перенаправление на страницу, где говорится, что сортировка успешно завершена. И, кстати, где уже обновленное меню.
Все теперь новы порядок записан. И в следующий раз меню будет выводиться в новом порядке.
Здесь я описал ключевые моменты сортировки. Создание не буду описывать, т.к. это просто. Решение - простая форма для записи всех значений полей таблицы и добавление данных в таблицу. По-умолчанию данные добавляются в таблицу после последней записи, с порядковым номером пункта, который еще не использовался, для этого подсчитываем количество записей в таблице прибавляем один - все готово. Нужное место новому пункту определяю в администраторской зоне путем сортировки.
Другой вариант с базами данных придумал. Оцените, пожалуйста.
Правда в этом алгоритме я немного застрял. Далее отмечу это место.
Цель та же - создавать меню через администраторскую зону, и добавил небольшое усложнение - возможность группировки меню через администраторскую
зону посредством 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:
Мне нужно его вытащить из javascript и использовать его в следующем блоке php кода.
По поводу двух скриптов: один для публичной зоны, другой для администраторской - они отличаются кодом.
А вопрос был вот в чем: я застрял в реализации этого мини-плана.
В 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']
вместо текст 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. Как сделать, чтобы пока работает обработчик выводилось сообщение, например ждите или "спиннер" и только после того как завершит работу обработчик - сообщение "Операция закончена".
То о чем я говорю можно посмотреть на этом сайте. После щелчка на любом городе там сначала выводится сообщение "идет загрузка" и только потом результат работы обработчика.
Все работает как хотел.
Не смотря на это, есть вопрос.
доработанный вариант кода предложенного 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 написал(а):
перед
создаешь див позицеонируешь его как тебе надо даеш ему z-index побольше я обычно даю 9999
внутрь дива помещаешь анимированный гиф с загрузкой, показываешь этот див
в нутри твоей функции function(data){ .... } бьешь див.
$.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 кода страницы. Могу ли я в случае с моим кодом сказать, что это хороший код, а точнее сказать, основываясь на чем, исходя из каких критериев, я могу так сказать? Возвращаясь к первому вопросу - может ли быть скорость генерации страницы рассматриваться как самостоятельный объективный критерий качества созданной веб-страницы?
Попробую разобраться.
Возник вопрос:
Можно ли считать скорость генерации страницы качественной оценкой совокупности методов, используемых для реализации тех или иных частей веб-страницы? Это я вот к чему: страницу, в данном случае ее часть - меню, алгоритм создания которого я описал, можно сделать разными способами (методами), например без использования баз данных. Мой вариант - один из множества. Кто-то может сказать, что это хороший код, по причине того, что не может жить без баз данных и пр. или наоборот, сказать, что это плохой код по обратной причине. То как создается веб-страница и из каких составляющих - дело вкуса и умения. Но ведь должны быть и объективные параметры оценки php кода страницы. Могу ли я в случае с моим кодом сказать, что это хороший код, а точнее сказать, основываясь на чем, исходя из каких критериев, я могу так сказать? Возвращаясь к первому вопросу - может ли быть скорость генерации страницы рассматриваться как самостоятельный объективный критерий качества созданной веб-страницы?
Спустя 3 минуты, 58 секунд (24.06.2010 - 15:03) Basili4 написал(а):
Я короче читал завис. Сразу вспомнил лекции по философии. Я скажу по простому хороший код это отказоустойчивый, быстрый, хорошо комментированный код.
Спустя 23 минуты, 42 секунды (24.06.2010 - 15:27) tomash написал(а):
userguest
Ух.... складно излагаете
1. скорость разработки;
2. оптимальность (скорость, затраты ресурсов);
3. безопасность;
4. удобство сопровождения и расширения функционала;
5. функциональность.
Это как для меня
Ух.... складно излагаете
1. скорость разработки;
2. оптимальность (скорость, затраты ресурсов);
3. безопасность;
4. удобство сопровождения и расширения функционала;
5. функциональность.
Это как для меня