За последние 24 часа нас посетили 212836 программистов и 2178 роботов. Сейчас ищут 1989 программистов ...

Как сделать подменю?

Тема в разделе "PHP для новичков", создана пользователем melihovgv, 13 май 2012.

  1. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    Код (Text):
    1. <?  
    2.  
    3. $link = mysql_connect('localhost', 'root', '');
    4. if (!$link) {die('Не удалось соединиться : ' . mysql_error());}$db_selected = mysql_select_db('content', $link);if (!$db_selected) {die ('Не удалось выбрать базу mysite: ' . mysql_error());}
    5. @mysql_query('set character_set_client="utf8"');
    6. @mysql_query('set character_set_results="utf8"');
    7. @mysql_query('set collation_connection="utf8_general_ci"');
    8.  
    9. $id = (isset($_GET['id']))?(int)$_GET['id']:1;
    10. $sql2 = "SELECT * FROM `dmitrov_seodrift_ru` WHERE `id`=$id LIMIT 1";//выбираем запись с id=переданный_параметр
    11. $res2 = mysql_query($sql2);
    12. $pageData = mysql_fetch_array($res2);
    13.  
    14. $sql = "SELECT id,namelinks,title,namezagolovok FROM `content`";
    15. $res = mysql_query($sql);
    16.  
    17. while ($row = mysql_fetch_array($res)){
    18.   $sel=($id==$row['id'])?' class="sel"':'';//текущую страницу подсвечиваем
    19.   echo sprintf('<li><a href="?id=%s"%s>%s</a>%s', $row['id'], $sel, $row['namelinks'], "</li>");
    20. }
    21.  
    22. ?>
    23.  
    24. ------------------------
    25. CREATE TABLE IF NOT EXISTS `content` (
    26.   `id` int(11) NOT NULL AUTO_INCREMENT,
    27.   `namelinks` varchar(255) NOT NULL,
    28.   `psevdonim` varchar(255) NOT NULL,
    29.   `title` varchar(255) NOT NULL,
    30.   `namezagolovok` varchar(255) NOT NULL,
    31.   `contents` text NOT NULL,
    32.   PRIMARY KEY (`id`)
    33. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
    Добавлено спустя 3 минуты 33 секунды:
    Вопрос как сделать подменю, имея меню такого вида?
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    О, процентов на 70 в моём стиле :)
    Только элементы li должны быть внутри контейнера-списка ul или ol.
    Чтобы вывести подменю, нужно, чтобы оно как-то было организовано в общем. В таблице "content", например, можно сделать поле "parent" типа INT, в котором указывать id родительского документа. Тогда можно будет организовать подменю и вообще структуру.
     
  3. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    Вы говорите загадками))))
    Можете на примере показать?
     
  4. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    Допустим в parent я запишу id родительской категории..
    Вопрос в том, как ее вставить в этот цикл?

    while ($row = mysql_fetch_array($res)){
    $sel=($id==$row['id'])?' class="sel"':'';//текущую страницу подсвечиваем
    echo sprintf('<li><a href="?id=%s"%s>%s</a>%s', $row['id'], $sel, $row['namelinks'], "</li>");
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Разбирайтесь
    Код (PHP):
    1. <?php
    2. $id=(isset($_GET['id']))?(int)$_GET['id']:1;
    3. $out='';//тут будет меню
    4. function menu(&$arr,&$out,$parent=0,&$level=0){
    5.   global $id;
    6.   foreach($arr as $row){
    7.     if($row['parent']==$parent){
    8.       $sel=($row['id']==$id)?' class="sel"':'';
    9.       $level++;
    10.       $out.=sprintf('%s<li%s>[url="?id=%d"]%s[/url]',
    11.         str_repeat("\t",$level),$sel,$row['id'],$sel,$row['title_menu']);
    12.       $inner='';
    13.       $level++;
    14.       menu($arr,$inner,$row['id'],$level);
    15.       $level--;
    16.       if(strlen($inner)>0){
    17.         $out.=sprintf('%s%s<ul>%s%s%s</ul>%s%s',
    18.           "\n",str_repeat("\t",$level+1),"\n",$inner,str_repeat("\t",$level+1),"\n",str_repeat("\t",$level));
    19.       }
    20.       $out.="</li>\n";
    21.       $level--;
    22.     }
    23.   }
    24. }
    25.  
    26. $mysqli=new mysqli('127.0.0.1','root','pass','struct');//хост,логин,пароль,бд
    27. $result=$mysqli->query("SELECT id,parent,title_menu FROM pages");
    28. $structArr=array();
    29. while($res=$result->fetch_assoc()){$structArr[]=$res;}
    30. $result->close();
    31. menu($structArr,$out,0);//генерируем меню в переменную $out
    32. unset($structArr);//массив больше не нужен
    33. ?>
    34. <style>
    35. a.sel{
    36.   text-decoration:underline;
    37.   color:#f00;
    38. }
    39. </style>
    40.  
    41. <ul class="menu">
    42. <?=$out?>
    43. </ul>
     
  6. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    Что я Вам за это должен?
    Работает)
    Получается, чтобы третий уровень меню добавить, нужно еще одну ячейку в таблицы создать?
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Это рекурсивная функция, будет выводить всё дерево сайта.
    Третий уровень появится, если в записи БД указать в parent - id элемента со 2 уровня. Такая связь
    Код (Text):
    1. id    parent    title
    2. 1     0         Главная
    3. 2     1         Второй уровень, дочерняя к 1
    4. 3     2         Третий уровень, дочерняя к 2
    построит мини-дерево.
    Объясняйте и помогайте другим, как делать такие меню и прочие штучки.
     
  8. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    Понял)))Спасибо буду помогать молодым, чем смогу))

    Добавлено спустя 50 минут 25 секунд:
    Последний вопрос)Как можно добавить стили в меню???

    Добавлено спустя 5 минут 23 секунды:
    Чтобы в меню один класс, а в подменю, другой ??
    Либо - это нужно через css настраивать?
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Если выводите, как в примере выше
    Код (PHP):
    1. <ul class="menu">
    2. <?=$out?>
    3. </ul>
    , то
    Код (Text):
    1. /*стиль для всего блока*/
    2. .menu{
    3.   list-style:none outside none;
    4.   margin:0;
    5.   padding:0 0 0 20px;
    6. }
    7. /*для всех вложенных списков*/
    8. .menu ul{
    9.   list-style:none outside none;
    10.   margin:0;
    11.   padding:0 0 0 20px;
    12. }
    13. /*для всех элементов li*/
    14. .menu li{
    15.   font-style:normal;
    16. }
    17. /*стиль для элемента li, в котором ссылка на текущий документ*/
    18. /*может быть полезно для всяких раскрывающихся меню*/
    19. .menu li.sel{
    20.   list-style-type:square;
    21. }
    22. /*для всех ссылок*/
    23. .menu a{
    24.   text-decoration:none;
    25. }
    26. /*при наведении на ссылку*/
    27. .menu a:hover{
    28.   text-decoration:underline;
    29. }
    30. /*тот самый наш sel для текущей страницы*/
    31. .menu a.sel{
    32.   text-decoration:underline;
    33.   color:#f00;
    34. }
    35. /*стиль только для элемента li второго уровня*/
    36. .menu>li>ul>li{
    37.   font-weight: bold;
    38. }
    Полезная инфа тут http://htmlbook.ru/css/
     
  10. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    Благодарен за это))И последний момент, как отрисовывать данное меню в горизонтальное и вертикальное меню)Я так понимаю нужно функцию сделать, но опять же...Допустим я в БД создаю таблицу pol_menu. В этом меню vertikal на вертикальное меню, а горизонтальное gorizont. Какой переменной не хватает?Подскажите
     
  11. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Нарисуйте картинку, каким хотите видеть меню, а то не понятно.
    Обычно всё стилями делается.
    Если нужно вывести два меню от разных родителей, то нужно два раза вызвать функцию и указать id разных родителей:
    Код (PHP):
    1. menu($structArr,$out1,0);//меню от корня, будет в переменной $out1
    2. menu($structArr,$out2,10);//меню от элемента с id=10, будет в переменной $out2 
    Как-то так.
    Ну или я не понял, голова занята другим.
     
  12. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    [​IMG]
    Вот нарисовал
     
  13. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ну а что в них, полное меню сайта?
    Если да, то только стилями.
    Код (Text):
    1. <ul class="menuTop"><?=$out?></ul>
    2. <ul class="menuLeft"><?=$out?></ul>
    От классов menuTop и menuLeft будет зависеть внешний вид
    Код (Text):
    1. <style>
    2. .menuTop ul{
    3. /*стиль списка с классом menuTop*/
    4. }
    5. .menuLeft ul{
    6. /*стиль списка с классом menuLeft*/
    7. }
    Вроде, очевидные вещи...
     
  14. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    А как код узнает о том, что <ul class="menuTop"><?=$out?></ul> - это верхнее меню?
    <ul class="menuLeft"><?=$out?></ul> - а это меню слева?

    Добавлено спустя 1 минуту 16 секунд:
    Вот этот код нужно брать?
     
  15. melihovgv

    melihovgv Активный пользователь

    С нами с:
    2 мар 2011
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Москва
    Сделал вот так...от 0 - $out1 выводится и также выводится $out1 от 11...а $out2 не выводится...в чем может быть дело?

    Добавлено спустя 9 минут 31 секунду:
    Т.е. если вывожу $out1, то оно выходить с 0 по 10 значение, а если вывожу $out2 должно выводится с 10 и до конечного значения.
    Вопрос, как сделать ограничитель на $out1 ?