Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как обернуть в DIV блок из подкатегорий


Автор: mark2011 28.6.2011, 13:33
Всем доброго времени суток!

По порядку опишу все структуры, потом задам вопрос.

Есть база данных. Соответственно есть id, parent_id и name. Есть и другие поля, но они не значимы для вопроса. 
Есть функция PHP которая выводит дерево из mysql:

Код

function ShowTree($pid=0)
    {
    
    $tree = array();
    $ret = "";
    global $db;
    
    $query = 'SELECT * FROM goods where level in (1, 2)';
    $db->query($query);
    
    while ($row = $db->parse_query('array'))
    {
        $tree[$row['rodit_kod']][$row['elem_id']] = $row['name'];    
    }

        foreach($tree as $id=>$root)
        {
            if($pid!=$id)continue;
            
            if(count($root))
            {
                foreach($root as $key => $title)
                {
                    if ($pid != "0")
                    {
                        if (isset($_GET['id']) && ($_GET['id'] == $key))
                        {
                            $class = ' underlined';
                        }
                        
                        else
                        {
                            $class = '';
                        }
                        
                        /* выводятся второстепенные пункты меню (потомки) */
                        $ret .= "<li><span class=\"submenu".$class."\"><a href=\"test.php?id=".$key."\">".$title."</a></span>";
                        //$ret .="</div>";
                    }    
                    
                    
                    
                    else
                    {
                        /* выводятся главные пункты меню */
                        
                        $ret .= "<li class=\"main_menu_on\"><span class=\"clr\"><a href=\"#\" onClick=\"test_alert(".$key."); return false;\">".$title."</a></span></li>";
                        $ret .= "<div>";
                    }
                        
                        
                    
                    
                    if(count($tree[$key]))
                    {
                        $ret .= ShowTree($key);
                    }
                
                }
                
                
            }
        }
return $ret;

}


На выходе получается вот такой HTML код: (сорри за неформатированность, это прямо из исходного кода взято)

Код

<ul id="right_menu">
        <li class="main_menu_on">
               <span class="clr">
                         <a href="#" onClick="test_alert(90); return false;">DVD</a>
              </span>
        </li>
        <div>
        <li>
              <span class="submenu">
                     <a href="test.php?id=99347248">*Music</a></span>
        <li>
               <span class="submenu">
                     <a href="test.php?id=99347319">*RUS</a>
              </span>
          <li>
              <span class="submenu">
                     <a href="test.php?id=99347320">*Зарубежные</a>
              </span>
          <li>
              <span class="submenu">
                   <a href="test.php?id=99347247">*Индия</a>
             </span>
           <li>
               <span class="submenu">
                  <a href="test.php?id=99347341">*Мультфильмы</a>
              </span>
             <li>
                 <span class="submenu">
                   <a href="test.php?id=99347235">*Раскраски</a>
                </span>
             <li>
                <span class="submenu">
                   <a href="test.php?id=99344734">*Распродажа</a>
                </span>
              <li>
                <span class="submenu">
            <a href="test.php?id=99347317">*ТВ</a></span>
              <li>
               <span class="submenu">
           <a href="test.php?id=99347240">*Эротика</a>
               </span>
             <li class="main_menu_on">
          <span class="clr"><a href="#" onClick="test_alert(91); return false;">FUN Plastic</a></span>
            </li>
         <div>
             <li>
             <span class="submenu"><a href="test.php?id=222222">test2011</a></span>
              <li class="main_menu_on"><span class="clr"><a href="#" onClick="test_alert(7239); return false;">MP3</a></span></li>
          <div>
         <li class="main_menu_on"><span class="clr"><a href="#" onClick="test_alert(3830); return false;">Игры</a></span></li><div>
         <li class="main_menu_on"><span class="clr"><a href="#" onClick="test_alert(92); return false;">Игры</a></span></li><div>
         <li class="main_menu_on"><span class="clr"><a href="#" onClick="test_alert(93); return false;">Прочие</a></span></li><div>
         <li class="main_menu_on"><span class="clr"><a href="#" onClick="test_alert(94); return false;">Раскраски</a></span></li><div>
         <li class="main_menu_on"><span class="clr"><a href="#" onClick="test_alert(95); return false;">Фигурки</a></span></li><div>
         <li class="main_menu_on"><span class="clr"><a href="#" onClick="test_alert(96); return false;">Чистый склад</a></span></li><div>

    </ul>



А теперь суть. Всё что начинается со звёздочки есть пункт подкатегории. Всё остальное - категории. Сами подкатегории нужно показывать/скрывать в зависимости от их текущего состояния (своеобразный toggle). Может есть ещё способы, но я не нашёл другого, кроме как обернуть блок подкатегорий в div. Возникла проблема, поскольку функция рекурсивная и div работает совершенно не так, как мне нужно. Пробовал задавать какие-то математические условия, но пока точно не могу сообразить, что конкретно нужно написать.

Если есть какой-то другой способ реализовать нужный мне функционал, буду рад услышать любую помощь и объяснения по этому вопросу. Если нет - как сделать то, что уже имеется, т.е. обернуть блок подкатегорий в div?

Да, кстати. Если подкатегорий не будет (а такое есть в моём примере) то должен быть просто пустой div.

Всем заранее спасибо за помощь smile

Автор: mark2011 28.6.2011, 15:46
Как бы решено.
Отказался от привычного вывода дерева. Сначала вывожу первый уровень, формирую необходимые дивы, делаю их скрытыми. Далее по клику вывожу второй уровень. Получается дерево )))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)