Выеделение активной категории

Тема в разделе "PHP", создана пользователем danneo, 16 окт 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.445
    Симпатии:
    113
    В меню хочу сделать выделение стилем той категории, в которой нахожусь.
    Сделал так:
    PHP:
    if ($id == $cat['catid']) //Если id равно
    {$bt.= "<li class=\"active\">";}// выводить стиль активности
    else
    {
    $bt.= "<li>";} //просто, без стиля
    Но проблема в том, что когда перехожу в подкатегорию, id становится другое.
    Как делается правильно такое?
     
  2. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    PHP:
    if ($id == $cat['catid'] || $id == $cat['podcatid'] )
    $cat['podcatid'] - id подкатегории
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.445
    Симпатии:
    113
    Наверно не так объяснил...
    В меню есть толко категории (без подкатегорий). Нужно чтобы когда захожу в подкатегорию, то родительская категория продолжала бы быть активна.
     
  4. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    я понял ваш вопрос, а вот вы невнимательно отнеслись к ответу

    в пхп
    PHP:
    ||
    служат логическим оператором "или"
    т.е. первая строка проверяет, если ид равен catid или если ид равен подкатегории то класс делаем активным...

    если вас смутило имя podcatid, то оно для примера, вместо него подставьте переменную id подкатегории
     
  5. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.445
    Симпатии:
    113
    Не то... даже пробовал :)
    Например, есть такие категории:
    Выводятся они так (без подкатегорий:(
    Если я нахожусь в подкатегори "региональные" (id=18, parentid=17), то у меня должен добавляться стиль к ссылке "новости".
    podcatid может и равно id (что вряд ли, выше видно), но как это указать, что нужно к категории "новости", то есть к добавить стиль?
     
  6. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    да не зацикливайтесь на podcatid - это название было указано для примера, подразумевало ид подкатегории, и в вашем случае равно 18

    parentid - это переменная с родительской категорией?
    попробуйте первую строку еще так изменить
    PHP:
    if ($id == $cat['catid'] || $parentid == $cat['catid'] ) 
    по поводу первоначально предложенного варианта - он тоже должен работать, для отладки вместо переменных подставьте явные значения категорий/подкатегорий :
    PHP:
    if ($id == 17 || $id == 18 )
     
  7. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    У тебя должна существовать таблица отношений "матери-дочки"
    Если глубина вложенности не велика попробуй такой алгоритм:
    PHP:
    $id=$_GET[id// Дано: ID
    $parent=0;
    $i=0//счетчик на всякий случай
    While(!$parent AND $i<5){ // допустим ограничим 5 вложениями
    $res=mysql_query("SELECT parent FROM category WHERE category=$id"); //получаем родителя
    $parent=mysql_fetch_row($res);
    $parent=$parent[0]; //если родитель не равен 0 значит он не верхний элемент в цепочке и цикл продолжится 
    $i++;
    }
    Так для любого ID пройдешь по всей цепочке до самого главного ID. Минус- при большой степени вложенности много запросов к БД, хотя я думаю хватит 5 выше крыши, и для сервера не напряжно.
     
  8. TheGp

    TheGp Писатель

    Регистр.:
    21 янв 2010
    Сообщения:
    7
    Симпатии:
    1
    Только на будущее- используй в строке кавычки разного типа

    То есть не "<li class=\"active\">" а "<li class='active'>" или наоборот

    А то потом запаришься разбираться, если кавычек в строке будет очень много
     
  9. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.445
    Симпатии:
    113
    Нашел блок подобный нужному... но есть одна проблема с ним. Буду благодарен за его правку. Немного я подправил стиль, но дальше дело не идет. Смысл такой. В нем прописываю все ссылки, а он их обрабатывает и оформляет в стилях. Но проблема в том, что блок этот рассчитан на все модули CMS danneo, а не на один. Каждый модуль это главная ветка, в этой ветке есть вложенные, т.е. категории модуля. При посещении модуля, категорий, он выделяет активную ссылку.
    Но у мне нужно сделать вывод только для одного модуля. И сделать только главные ветки (вывод главных категорий). Когда я делаю только их, то выводится только последняя, т.к. они все одинаковые... нужно как-то их уникализировать. Вложенные уникализируются массивом [1],[2] и т.д. Я в этом не силен, вот и прошу помощи... с этими вложенными, как бы их сделать главными, чтобы только категории выводились, как главные ветки, а вложенных вообще не нужно.
    Сам код блока:
    PHP:
    <?php
    if(!defined("DNREAD")) exit();
    global 
    $dn,$workcpu,$to,$cpu;
    $bt '';
    // Массив css стилей дерева меню.
    $treecss = array();
    $treecss['active'] = 'active';
    $treecss['standart'] = '';
    $treecss['subactive'] = 'treesubactive';
    $treecss['substandart'] = 'treesubstandart';
    // Массив дерева меню.
    $tree = array();
    //  - Главная
    $tree['servis']['name'] = 'О компании';
    $tree['servis']['link'] = '/index.php?dn=servis&to=cat&id=9';
    $tree['servis']['title'] = 'О компании';
    $tree['servis']['keys'] = 'servis';
    // О нас - Вложенные
    $tree['servis']['sublink'] = array();
    // О нас - Вложенные - Первая линия - маркер = [1]
    $tree['servis']['sublink'][1]['name'] = 'О нас';                            // Название ссылки
    $tree['servis']['sublink'][1]['title'] = 'О нас';               // title ссылки
    $tree['servis']['sublink'][1]['link'] = '/index.php?dn=servis&to=cat&id=9';  // href ссылки
    $tree['servis']['sublink'][1]['catid'] = 1;                                       // ID категории
    $tree['servis']['sublink'][1]['cpu'] = '';                                        // ЧПУ категории
    // Контакты - Вложенные - Вторая линия - маркер = [2]
    $tree['servis']['sublink'][2]['name'] = 'Контакты';                            // Название ссылки
    $tree['servis']['sublink'][2]['title'] = 'Контакты';               // title ссылки
    $tree['servis']['sublink'][2]['link'] = '/index.php?dn=servis&to=cat&id=9';  // href ссылки
    $tree['servis']['sublink'][2]['catid'] = 1;                                       // ID категории
    $tree['servis']['sublink'][2]['cpu'] = '';                                        // ЧПУ категории
    // Отрисовка дерева - начало
    $bt.= "<ul class=\"menu2\">";
    foreach(
    $tree as $treekey => $treeval){
    // Отрисовка дерева - главные ветки - переменные
    $marker = ($treeval['keys']==$dn) ? 1;
    $cssnew = ($marker==1) ? $treecss['standart'] : $treecss['active'];
    $titlenew = ($treeval['title']) ? ' title="'.$treeval['title'].'"' '';
    $itemnew = ($marker==|| $to=='cat') ? '<a href="'.$treeval['link'].'"'.$titlenew.'>'.$treeval['name'].'</a>' $treeval['name'];
    // Отрисовка дерева - главные ветки - начало
    $bt.= '<li class="'.$cssnew.'">';
    $bt.= $itemnew;
    $bt.= '</li>';
    // Отрисовка дерева - вложенные ветки - начало
    if($treeval['keys']==$dn && is_array($treeval['sublink'])){
    // Отрисовка дерева - вложенные ветки - начало
    foreach($treeval['sublink'] as $treesubkey => $treesubval){
    $submarker = ($treesubval['catid']==$id || $cpu && $treesubval['cpu']==$cpu) ? 1;
    $subcssnew = ($submarker==1) ? $treecss['substandart'] : $treecss['subactive'];
    $subtitlenew = ($treesubval['title']) ? ' title="'.$treesubval['title'].'"' '';
    $subitemnew = ($submarker==1) ? '<a href="'.$treesubval['link'].'"'.$subtitlenew.'>'.$treesubval['name'].'</a>' $treesubval['name'];
    $bt.= '<li class="'.$subcssnew.'">';
    $bt.= $subitemnew;
    $bt.= '</li>';
    }
    // Отрисовка дерева - вложенные ветки - конец
    }
    // Отрисовка дерева - главные ветки - конец
    }
    $bt.= "</ul>";
    // Отрисовка дерева - конец
    return $bt;
    ?>
     
  10. sublimity

    sublimity Создатель

    Регистр.:
    7 янв 2008
    Сообщения:
    23
    Симпатии:
    3
    Что произойдёт если заменить в
    Код:
    if($treeval['keys']==$dn && is_array($treeval['sublink'])){ 
    и добавить && 4==6
    т.е. 
    
    if($treeval['keys']==$dn && is_array($treeval['sublink']) && 4==6){ 
    
    
    не будут отрисованны под категории типа "Контакты"...?

    Как мне кажется идея может быть в след. :
    PHP:
    // Отрисовка дерева - главные ветки - начало 
    if ($NeedModule!=1)
    {
    $bt.= '<li class="'.$cssnew.'">'
                
    $bt.= $itemnew
                
    $bt.= '</li>'
    }
    ............
    {
    ...
    $subitemnew = ($submarker==1) ? '<a href="'.$treesubval['link'].'"'.$subtitlenew.'>'.$treesubval['name'].'</a>' $treesubval['name']; 
    if (
    $NeedModule!=1$bt.= '<li class="'.$subcssnew.'">';  else $bt.= '<li class="'.$cssnew.'">';
    $bt.= $subitemnew
    $bt.= '</li>'
    }
    Вопрос как узнать какой модуль? т.е. найти NeedModule
    Может посмотреть echo "$dn,$workcpu,$to,$cpu "; ?
     
Статус темы:
Закрыта.