[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Многоуровневое меню
freed-master
Решил все-таки создать отдельную тему, потому как сразу появляются вопросы, решить которые я впринципе смогу, но не так как хотелосьбы.

Вкратце задача: написать меню содержащее 5 разделов по 6 подразделов в каждый из которых (из подразделов) будет добавляться неограниченный список ссылок, а ниже отображаться контент выбранной из списка ссылки.
(Надеюсь понятно описал)

Т.е.

1) В зависимости от выбранного раздела отображаются пункты подразделов.

Для этого присваиваю каждому разделу свой id, пусть это будут буквы: A, B, C, D, E. Информацию про это меню занес в таблицу бд menu_m с полями: id и name.

2) Теперь вывожу пункты раздела из бд циклом do while и гэтом передаю id раздела для отображения нужных пунктов подменю.

Выглядит это примерно так:
PHP
<?php do { ?>
<a href="index.php?page=<?php echo $row_menu_m['id']; ?>"><?php echo $row_menu_m['name']; ?></a>
<?php } while ($row_menu_m mysql_fetch_assoc($menu_m)); 
3) И вот первая трудность как привязать id раздкла к пунктам подразделов?

Создал таблицу бд menu_s с полями id_m (содержит id разделов) id_s (содержит id подразделов - цифровые значения - от 1 до 6) и name; всего получилось 30 строк.
Далее получаю значение переменной и вывожу пункты подменю:
PHP
<?php do { ?>
<a href="index.php?page=<?php echo $row_menu_s['id_m'].$row_menu_s['id_s']; ?>"><?php echo $row_menu_s['name']; ?></a>
<?php } while ($row_menu_s mysql_fetch_assoc($menu_s)); 

До этого момента что здесь не так?



Спустя 9 минут, 54 секунды (17.06.2009 - 19:29) Kuliev написал(а):
freed-master
Что то типа этого???

Спустя 4 минуты, 5 секунд (17.06.2009 - 19:33) twin написал(а):
Начинаем курс противопоповщины. Блин.
Он и сам давно не рад этому ляпу наверняка, но из песни слов не выкинешь.

ЦИКЛ do... while ИСПОЛЬЗУЕТСЯ ТОЛЬКО В ТОМ СЛУЧАЕ, КОГДА БЕЗ ПРОХОЖДЕНИЯ ПЕРВОЙ ИНТЕРАЦИИ НЕЛЬЗЯ ОПРЕДЕЛИТЬ УСЛОВИЕ ВЫХОДА ИЗ ЦИКЛА.
Другими словами. Если есть определенный массив, и он разбирается в цикле (а это в случае с запросами так и есть), то нужно использовать цикл while, потому что он предполагает, что может и не быть ни одной интерации, то есть витка. Если запрос вернул пусто. Ни одной строки. А do... while обязывает, что бы была хотя бы одна запись, удовлетворяющая условию запроса. Это не корректно и нелогично и неправильно по определению.

Спустя 2 минуты, 26 секунд (17.06.2009 - 19:35) Kuliev написал(а):
Цитата (twin @ 17.06.2009 - 21:33)
Начинаем курс противопоповщины. Блин.
Он и сам давно не рад этому ляпу наверняка, но из песни слов не выкинешь.

ЦИКЛ do... while ИСПОЛЬЗУЕТСЯ ТОЛЬКО В ТОМ СЛУЧАЕ, КОГДА БЕЗ ПРОХОЖДЕНИЯ ПЕРВОЙ ИНТЕРАЦИИ НЕЛЬЗЯ ОПРЕДЕЛИТЬ УСЛОВИЕ ВЫХОДА ИЗ ЦИКЛА.
Другими словами. Если есть определенный массив, и он разбирается в цикле (а это в случае с запросами так и есть), то нужно использовать цикл while, потому что он предполагает, что может и не быть ни одной интерации, то есть витка. Если запрос вернул пусто. Ни одной строки. А do... while обязывает, что бы была хотя бы одна запись, удовлетворяющая условию запроса. Это не корректно и нелогично и неправильно по определению.

+1 мне лень было ему это писать.

Спустя 2 минуты, 11 секунд (17.06.2009 - 19:37) freed-master написал(а):
Я не знаю попова и не видел его курсы!

Сейчас напишу с чем столкнулся используя вышеописанный мной код...

Спустя 7 минут, 27 секунд (17.06.2009 - 19:45) freed-master написал(а):
Кажется надо объединить поля id_m и id_s таблицы menu_s, но...

Есть SQL-запрос на выборку пунктов подменю:
SQL
SELECT * FROM menu_s WHERE `id_m`='".$id_m."'
где
PHP
$id_m = isset($_GET['page'])?$_GET['page']:null;
нужно сделать что-то типа:
SQL
SELECT * FROM menu_s WHERE `id_m` содержит $id_m

Спустя 1 минута, 1 секунда (17.06.2009 - 19:46) kirik написал(а):
do-while можно уже называть "методом Попова" smile.gif

Спустя 3 минуты, 43 секунды (17.06.2009 - 19:50) Kuliev написал(а):
Цитата (kirik @ 17.06.2009 - 21:46)
do-while можно уже называть "методом Попова" smile.gif

Аха, так сказать его визитной карточкой.

Спустя 3 минуты, 10 секунд (17.06.2009 - 19:53) freed-master написал(а):
Цитата
ЦИКЛ do... while ИСПОЛЬЗУЕТСЯ ТОЛЬКО В ТОМ СЛУЧАЕ, КОГДА БЕЗ ПРОХОЖДЕНИЯ ПЕРВОЙ ИНТЕРАЦИИ НЕЛЬЗЯ ОПРЕДЕЛИТЬ УСЛОВИЕ ВЫХОДА ИЗ ЦИКЛА.
Я работаю в Дримвевере, а он сам вставляет нужный, по его мнению, код. Так значительно быстрее. Я конечно потом редактирую в ручную, но только то что можно, иначе не смогу дальше кодировать средствами Дрима.....

Спустя 3 минуты, 26 секунд (17.06.2009 - 19:56) Kuliev написал(а):
Цитата (freed-master @ 17.06.2009 - 21:53)
Цитата
ЦИКЛ do... while ИСПОЛЬЗУЕТСЯ ТОЛЬКО В ТОМ СЛУЧАЕ, КОГДА БЕЗ ПРОХОЖДЕНИЯ ПЕРВОЙ ИНТЕРАЦИИ НЕЛЬЗЯ ОПРЕДЕЛИТЬ УСЛОВИЕ ВЫХОДА ИЗ ЦИКЛА.
Я работаю в Дримвевере, а он сам вставляет нужный, по его мнению, код. Так значительно быстрее. Я конечно потом редактирую в ручную, но только то что можно, иначе не смогу дальше кодировать средствами Дрима.....

Я бы посоветовал пользоваться БЛОКНОТОМ так сказать память рук развивает.

Спустя 3 минуты, 6 секунд (17.06.2009 - 19:59) freed-master написал(а):
Хорошо, от ныне буду кодить вручную!

И все таки можно-ли осуществить запрос типа:
SQL
SELECT * FROM menu_s WHERE `id_m` содержит $id_m

Спустя 7 минут, 37 секунд (17.06.2009 - 20:07) Kuliev написал(а):
freed-master

Я так понимаю вам нужно меню типа этого:
    Россия
      Москва
      Питер
      Самара
    Украина
      Одесса
      Донецк
      Семфиропль
    США
      Канзас
      Техас
      Калифорния
При нажатие ссылкы чтобы открывалось подменю выбранной категории?

Спустя 12 минут, 43 секунды (17.06.2009 - 20:20) freed-master написал(а):
Мне нужно:

Раздел 1
Подраздел 1
Ссылка на страницу 1
Ссылка на страницу 2
Ссылка на страницу 3
...

И таких 5 разделов по 6 подразделов с ссылками на конечные страницы.

При этом все храниться в бд + возможность через админку добавлять и редактировать подразделы (не более 6 - ограничено дизайном) и ссылки на конечные страницы (с их контентом)

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

Спустя 5 минут, 7 секунд (17.06.2009 - 20:25) sergeiss написал(а):
Я тоже в Дримвивере работаю smile.gif Но только при написании кода пишу его тут же сам, в текстовом режиме. И только благодарю ДримВивер за любезно предоставляемые подсказки smile.gif
А вот чтобы он сам за меня писал ПХП код... Может, в моей версии этого нету? rolleyes.gif Но мне и не надо.

По сути вопроса.
Мне кажется, ты сам себя загоняешь в угол тем, что присваиваешь null как дефолтовую величину. Я это говорил в другой теме, и не поленюсь повторить тут.

А код с условием "содержит" такой примерно (хотя я и не понял пока, зачем это нужно):
SQL
where `id` in (1, 4, 5)

Спустя 32 минуты, 55 секунд (17.06.2009 - 20:58) freed-master написал(а):
Пока получилось вот что:
PHP
<?php
require_once('inc/config.php');
$id_menu = isset($_GET['page'])?$_GET['page']:null;
id_m 

$menu_m mysql_query("SELECT * FROM `menu_m`") or die (mysql_error());
$menu_s mysql_query("SELECT * FROM `menu_s` WHERE `id` LIKE '".$id_menu."%'") or die (mysql_error());
$menu_l mysql_query("SELECT * FROM `menu_l` WHERE `id_s`='".$id_m."'") or die (mysql_error());
?>

<?php 
while($row mysql_fetch_assoc($menu_m)) { ?>
<a href="index.php?page=<?php echo $row['id']; ?>"><?php echo $row['name']; ?></a>
<?php ?>
<br />
<?php while($row mysql_fetch_assoc($menu_s)) { ?>
<a href="index.php?page=<?php echo $row['id']; ?>"><?php echo $row['name']; ?></a>
<?php ?>
<br />
<?php  while($row mysql_fetch_assoc($menu_l)) { ?>
<a href="index.php?page=<?php echo $id_menu?>&amp;id=<?php echo $row['id_l']; ?>"><?php echo $row['name']; ?></a><br />
<?php 


Возник вопрос: как считать с переменной $id_menu первый символ и присвоить его переменной $id_m?

Спустя 6 минут, 33 секунды (17.06.2009 - 21:04) sergeiss написал(а):
Цитата (freed-master @ 17.06.2009 - 21:58)
Возник вопрос: как считать с переменной $id_menu первый символ и присвоить его переменной $id_m?

substr(....)

Спустя 7 минут, 48 секунд (17.06.2009 - 21:12) freed-master написал(а):
да, спосибо уже разобрался:
PHP
$id_m substr($id_menu01);

Спустя 18 минут, 21 секунда (17.06.2009 - 21:30) freed-master написал(а):
Теперь что скажите:
PHP
<?php
require_once('inc/config.php');
$path_m = isset($_GET['page'])?$_GET['page']:A1;
$path substr($path_m01);

$menu_m mysql_query("SELECT `id`, `name` FROM `menu` WHERE `type`='m'") or die (mysql_error());
$menu_s mysql_query("SELECT `id`, `name` FROM `menu` WHERE `id` LIKE '".$path."%' AND `type`='s'") or die (mysql_error());
$menu_l mysql_query("SELECT * FROM `content` WHERE `path`='".$path_m."'") or die (mysql_error());
?>

<?php 
while($row mysql_fetch_assoc($menu_m)) { ?>
<a href="index.php?page=<?php echo $row['id']; ?>"><?php echo $row['name']; ?></a>
<?php ?>
<br />
<?php while($row mysql_fetch_assoc($menu_s)) { ?>
<a href="index.php?page=<?php echo $row['id']; ?>"><?php echo $row['name']; ?></a>
<?php ?>
<br />
<?php  while($row mysql_fetch_assoc($menu_l)) { ?>
<a href="index.php?page=<?php echo $path_m?>&amp;id=<?php echo $row['id']; ?>"><?php echo $row['title']; ?></a><br />
<?php 

Спустя 1 час, 11 минут, 15 секунд (17.06.2009 - 22:42) sergeiss написал(а):
1. А1 надо в кавычки заключить, т.к. это символьная строка, а не константа.
2. А вот циклы у тебя не совсем правильные, по-моему... Потому что тут, как я понимаю, должны быть вложенные циклы. Или я не понял логику того, как ты хочешь сделать.

Спустя 32 минуты, 34 секунды (17.06.2009 - 23:14) freed-master написал(а):
Сейчас все работает правильно... ведь помимо приведенного php есть еще и html...

Теперь пытаюсь показать посетителю в каком разделе он находится.

Сейчас класс присвоин статически:
PHP
<?php while($row mysql_fetch_assoc($menu_m)) { ?>
<td class="mm_off"><a href="index.php?page=<?php echo $row['id']; ?>"><?php echo $row['name']; ?></a></td>
<?php 
а нужно что-бы он присваивался в зависимости отполученного гэтом значения переменной page. Если совпадает - mm_on, если нет - mm_off

Спустя 7 часов, 5 минут, 11 секунд (18.06.2009 - 06:19) Kuliev написал(а):
sergeiss
Цитата
2. А вот циклы у тебя не совсем правильные, по-моему... Потому что тут, как я понимаю, должны быть вложенные циклы. Или я не понял логику того, как ты хочешь сделать.

Что-то я тоже не понял, что он с циклами намутил blink.gif

Спустя 39 минут, 7 секунд (18.06.2009 - 06:59) freed-master написал(а):
Чего это вас мои циклы не устраивают?...

А как бы вы сделали? Хоть примерно набросайте?

Код страницы (на данный момент) целиком:
Свернутый текст
PHP
<?php
require_once('inc/config.php');
$path_m = isset($_GET['page'])?$_GET['page']:"A1";
$path substr($path_m01);
$id = isset($_GET['id'])?$_GET['id']:null;
$menu_m mysql_query("SELECT `id`, `name` FROM `menu` WHERE `type`='m'") or die (mysql_error());
$menu_s mysql_query("SELECT `id`, `name` FROM `menu` WHERE `id` LIKE '".$path."%' AND `type`='s'") or die (mysql_error());
$menu_l mysql_query("SELECT * FROM `content` WHERE `path`='".$path_m."'") or die (mysql_error());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="inc/style.css"/>
<meta name="description" content="" />
<meta name="keywords" content="" />
</head>

<body>
<table cellpadding="0" cellspacing="0">
<tr class="BookAntiqua">
<td rowspan="2" id="d_left_t">&nbsp;</td>
<?php while($row mysql_fetch_assoc($menu_m)) { ?>
<td class="mm_off"><a href="index.php?page=<?php echo $row['id']; ?>"><?php echo $row['name']; ?></a></td>
<?php ?>
<td colspan="2" class="search">
<form method="post" action="inc/search.php">
<input type="text" name="query" id="search" />
<input type="submit" value="Найти" />
</form>
</td>
<td rowspan="2" id="d_right_t">&nbsp;</td></tr>
<tr id="d_submenu" class="BookAntiqua">
<td colspan="7">
<?php while($row mysql_fetch_assoc($menu_s)) { ?>
<div class="sm_off"><a href="index.php?page=<?php echo $row['id']; ?>"><?php echo $row['name']; ?></a></div>
<?php ?>
</td></tr>
<tr>
<td rowspan="2" id="d_left">&nbsp;</td>
<td colspan="7" class="Verdana">
<div class="lm_link"><ol>
<?php  while($row mysql_fetch_assoc($menu_l)) { ?>
<li><a href="index.php?page=<?php echo $path_m?>&amp;id=<?php echo $row['id']; ?>"><?php echo $row['title']; ?></a></li>
<br />
<?php ?>
</ol></div>
</td>
<td rowspan="2" id="d_right">&nbsp;</td>
</tr>
<tr><td colspan="7" id="content" class="BookAntiqua">
<?php if (isset($id)) {
$content mysql_query("SELECT `title`, `content`, `description`, `keywords`, `date`, `auther`, `count` FROM `content` WHERE `id`='".$id."'") or die (mysql_error()); 
$row mysql_fetch_assoc($content); 
?>
<h1><?php echo $row['title']; ?></h1>
<?php echo $row['content']; } ?>
</td></tr>
<tr>
<td id="d_coner_l">&nbsp;</td>
<td colspan="7" id="d_bottom"><p class="Verdana">www.justit.com | 2009 © Черненков Василий</p></td><td id="d_coner_r">&nbsp;</td>
</tr>
</tab

Спустя 1 час, 35 минут, 7 секунд (18.06.2009 - 08:34) glock18 написал(а):
Цитата
Возник вопрос: как считать с переменной $id_menu первый символ и присвоить его переменной $id_m?

если один символ строки нужен, то всегда проще (и, думаю, лучше) взять его
PHP
echo $str{0};


А меню я тоже че-т не осилил. Странное какое-то, по-моему smile.gif Такое ощущение, что показывается только большое меню, и одно подменю у того, которое выбрано. остальные не показываются/грузятся. так?

Спустя 1 час, 48 минут, 4 секунды (18.06.2009 - 10:22) Kuliev написал(а):
Я так и не понял где тут у тебя многоуровневое меню но на мой взгляд оно должно выглядеть так.
Прошу сильно не пинать. huh.gif
PHP
<?php
$country 
=  array ("Россия" => array (
"Москва" => array("Мира","Ленина","Лесная","Затонная"),
"Питер"  => array("Карбышева","Юбилейная","Гоголя","Сталина"),
"Самара" => array("Чайкиной","Вокзальная"),
"Орел"   => array("Пушкина","Морская","Грибная")),
"Украина"=> array("Донецк","Житомир","Одесса"), "США"=> array ("Техас","Калифорния","Мичиган","Ойева"));

$city = isset($_GET['city'])? $_GET['city'] : null;
$street = isset($_GET['street'])? $_GET['street'] : null;

echo 
"<ul>\n";

foreach (
$country as $key=>$val)
{
  echo 
"<li class=li_><a href='".$_SERVER['PHP_SELF']."?city=".$key."'>".$key."</a>\n\r";

     if (
$city != $key)
     continue;

     echo 
"<ul type=square>\n";

     foreach (
$country[$city] as $k=>$v)
     {
          if (!
is_array($v))
          {
                echo 
"<li class=li><a href='".$_SERVER['PHP_SELF']."?city=".$city."&link=".$v."&street=".$k."'>".$v."</a>\n";
          }
          else
          {
             echo 
"<li class=li><a href='".$_SERVER['PHP_SELF']."?city=".$city."&link=".$v."&street=".$k."'>".$k."</a>\n";
          }
         if (
$street != $k)
         continue;

          echo 
"<ul type=disc style='color:red'>\n";
          foreach (
$v as $str)
          {
              echo 
"<li>".$str."\n";
          }
            echo 
"</ul>\n\r";

     }

    echo 
"</ul>\n";

}

 echo 
"</ul>\n";

/*

 echo "<pre>";
 print_r($country);

 */


Должно получиться вот так:
user posted image

Спустя 4 часа, 6 минут, 11 секунд (18.06.2009 - 14:28) freed-master написал(а):
Цитата
Такое ощущение, что показывается только большое меню, и одно подменю у того, которое выбрано. остальные не показываются/грузятся. так?
Именно так все и есть!
Цитата
Я так и не понял где тут у тебя многоуровневое меню
Цитата
Код страницы (на данный момент) целиком:
меню у меня не вертикальное, а горизонтальное и тесно переплитается с html-кодом...


_____________
Всем, кто заинтересован, могу помочь начать зарабатывать на forex.
Пишите в личку или на e-mail: flash-dirt@yandex.ru
Быстрый ответ:

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