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

Статус
В этой теме нельзя размещать новые ответы.

danneo

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

$cat['podcatid'] - id подкатегории
 
PHP:
if ($id == $cat['catid'] || $id == $cat['podcatid'] )
$cat['podcatid'] - id подкатегории
Наверно не так объяснил...
В меню есть толко категории (без подкатегорий). Нужно чтобы когда захожу в подкатегорию, то родительская категория продолжала бы быть активна.
 
я понял ваш вопрос, а вот вы невнимательно отнеслись к ответу

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

если вас смутило имя podcatid, то оно для примера, вместо него подставьте переменную id подкатегории
 
я понял ваш вопрос, а вот вы невнимательно отнеслись к ответу
в пхп
PHP:
||
служат логическим оператором "или"
т.е. первая строка проверяет, если ид равен catid или если ид равен подкатегории то класс делаем активным...
если вас смутило имя podcatid, то оно для примера, вместо него подставьте переменную id подкатегории
Не то... даже пробовал :)
Например, есть такие категории:
новости (id=17, parentid=0)
/региональные (id=18, parentid=17)
/федеральные
статьи
контакты
Выводятся они так (без подкатегорий:(
новости
статьи
контакты
Если я нахожусь в подкатегори "региональные" (id=18, parentid=17), то у меня должен добавляться стиль к ссылке "новости".
podcatid может и равно id (что вряд ли, выше видно), но как это указать, что нужно к категории "новости", то есть к добавить стиль?
 
да не зацикливайтесь на podcatid - это название было указано для примера, подразумевало ид подкатегории, и в вашем случае равно 18

parentid - это переменная с родительской категорией?
попробуйте первую строку еще так изменить
PHP:
if ($id == $cat['catid'] || $parentid == $cat['catid'] )

по поводу первоначально предложенного варианта - он тоже должен работать, для отладки вместо переменных подставьте явные значения категорий/подкатегорий :
PHP:
if ($id == 17 || $id == 18 )
 
У тебя должна существовать таблица отношений "матери-дочки"
Если глубина вложенности не велика попробуй такой алгоритм:
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 выше крыши, и для сервера не напряжно.
 
Только на будущее- используй в строке кавычки разного типа

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

А то потом запаришься разбираться, если кавычек в строке будет очень много
 
Нашел блок подобный нужному... но есть одна проблема с ним. Буду благодарен за его правку. Немного я подправил стиль, но дальше дело не идет. Смысл такой. В нем прописываю все ссылки, а он их обрабатывает и оформляет в стилях. Но проблема в том, что блок этот рассчитан на все модули 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) ? 0 : 1;
$cssnew = ($marker==1) ? $treecss['standart'] : $treecss['active'];
$titlenew = ($treeval['title']) ? ' title="'.$treeval['title'].'"' : '';
$itemnew = ($marker==1 || $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) ? 0 : 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;
?>
 
Что произойдёт если заменить в
Код:
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 "; ?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху