За последние 24 часа нас посетили 34503 программиста и 1312 роботов. Сейчас ищут 957 программистов ...

Двухуровневое дерево меню

Тема в разделе "PHP для новичков", создана пользователем darkgod, 30 июл 2009.

  1. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Всем доброго времени суток...

    Я сделал вывод двухуровневой системы меню в виде дерева, но есть небольшая загвоздка...

    PHP:
    1. <?
    2. $inq = $db->query("SELECT catname, catid, parent_catid FROM category where parent_catid='0'");
    3. while($item = $db->fetchrow($inq)){
    4.    echo '<a href="index.php?mod=news&cat=' . $item['catid'] . '">' . $item['catname'] . '</a><br>';
    5.  
    6.     if($_GET['cat'] == $item['catid']) { // смотрим нужно ли выводить подменю
    7.         $parinq = $db->query("SELECT catname, catid, parent_catid FROM category where parent_catid=" . $item['catid']);
    8.         while($paritem = $db->fetchrow($parinq)){
    9.            echo '--<a href="index.php?mod=news&cat=' . $paritem['catid'] . '">' . $paritem['catname'] . '</a><br>';
    10.         }
    11.     }
    12.  
    13. } ?>
    14.  

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

    Помогите решить проблемку...
     
  2. Shadow_exe

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

    С нами с:
    28 июл 2009
    Сообщения:
    45
    Симпатии:
    0
    Так проверяйте не только пэрент категории но и сам айди категории, а если $_GET['cat'] нет совсем, то можно выводить все подкатегории...
     
  3. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    дык не получаецо никак... если проверяю ид подкатегории, то у меня список закрывается по переходу в подкатегорию - потому что ид категории не найден
     
  4. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Самый детский способ, добавить 2 колонки для каждой меню: parent1 и parent2. Но самый лучший способ - это конечно же Nested Sets
     
  5. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    не хотелось бы создавать кучу дополнительных полей...

    Может все-таки можно как нибудь реализовать это с такой вложенностью?
     
  6. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Удалите это условие:
    PHP:
    1. if($_GET['cat'] == $item['catid'])
     
  7. Yadfewm

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

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Вопрос понял плохо, башка не варит.

    У меня на сайте категории можно вкладывать друг в друга БЕСКОНЕЧНО. А в админке сайта выводится огромное дерево сайта. А на сайте выводится где -> мы -> сейчас -> находимся, и в меню подсвечивается в какой из главных категорий находится категория в которой мы сейчас находимся.

    Реализовывал все сам, очень грубый код, было давно - показывать стыдно!
     
  8. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Если я это удалю, то тогда у меня подкатегории будут постоянно тображаться, но надо чтобы они начинали отображаться только когда я перехожу в категорию которой они принадлежат!
     
  9. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Все же покажите, может что выцеплю и чем нить поможет в моей ситуации
     
  10. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Попробуйте так:

    PHP:
    1. <?php
    2. if( isset( $_GET['cat']))
    3. {
    4.     $result = mysql_query( 'SELECT `parent_catid`
    5.                            FROM   `category`
    6.                            WHERE  `parent_catid` != 0 AND `catid` = ' .(int)$_GET['cat'] .' LIMIT 1');
    7.    
    8.     if( mysql_num_rows( $result))
    9.         $CatData = mysql_result( $result, 0, 0);
    10. }
    11.  
    12. $inq = $db->Query('SELECT `catname`, `catid`, `parent_catid`
    13.                   FROM   `category`
    14.                   WHERE  `parent_catid` = 0');
    15.  
    16. while( $item = $db->FetchRow( $inq))
    17. {
    18.     ?><a href="index.php?mod=news&cat=<?= $item['catid']; ?>"><?= $item['catname']; ?></a><br /><?php
    19.  
    20.     if( isset( $_GET['cat']) && $_GET['cat'] == $item['catid'] || isset( $CatData) && $CatData == $item['catid'])
    21.     {
    22.         $parinq = $db->Query('SELECT `catname`, `catid`, `parent_catid`
    23.                              FROM   `category`
    24.                              WHERE  `parent_catid` = ' .$item['catid']);
    25.  
    26.         while( $paritem = $db->FetchRow( $parinq))
    27.         {
    28.             ?>--<a href="index.php?mod=news&cat=<?= $paritem['catid']; ?>"><?= $paritem['catname']; ?></a><br /><?php
    29.         }
    30.     }
    31.  
    32. }
    33. ?>
     
  11. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    в таком виде подменю всегда отображается (((
     
  12. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Попробуйте снова, я код подправил.
     
  13. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    спасибо! заработало... только вот мне кажется 3 запроса к базе многовато... но хоть так работает! попробую чуть передеалть, если не получится, то оставлю так.

    Спасибо огромное за помощь!
     
  14. Yadfewm

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

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0


    1. <?
    2. $inq = $db->query("SELECT catname, catid, parent_catid FROM category where parent_catid='0'");
    3. while($item = $db->fetchrow($inq)){
    4. echo '<a href="index.php?mod=news&cat=' . $item['catid'] . '">' . $item['catname'] . '</a><br>';

    делаем запрос $item2 = SELECT * FROM category where id = $item['parent_catid']
    if GET[cat]== $item2[parent_catid] (обратите внимание) => echo ..... что-то типа того

    5.
    6. if($_GET['cat'] == $item['catid']) { // смотрим нужно ли выводить подменю
    7. $parinq = $db->query("SELECT catname, catid, parent_catid FROM category where parent_catid=" . $item['catid']);
    8. while($paritem = $db->fetchrow($parinq)){
    9. echo '--<a href="index.php?mod=news&cat=' . $paritem['catid'] . '">' . $paritem['catname'] . '</a><br>';
    10. }
    11. }
    12.
    13. } ?>


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

    Помогите решить проблемку...
     
  15. Yadfewm

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

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Ну вот, поужинал и меня опередили =(
     
  16. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    neverlose, к тебе еще вопросик... в том варианте что ты показал - что-то похожее на рекурсию имеется... Подскажи плиз у этого меню будет только 3 запроса или больше?
     
  17. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Там нет рекурсии. 2-3 запроса и не более.
     
  18. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    ок. еще раз спасибо большое!

    Yadfewm, тебе тоже спасибо за то что отозвался на просьбу...
     
  19. Yadfewm

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

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    а это не рекурсия?

    Код (Text):
    1. #  while( $item = $db->FetchRow( $inq))
    2. #  {

    darkgod :D спс
     
  20. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Нет.
     
  21. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Это цикл