Древовидное меню на сайте - запарился делать...

M2
На сайте с 11.01.2011
Offline
341
787

Всем привет!

На сайте http://active-play.ru справа древовидное меню. Суть такая: там есть пункты меню с подпунктами, а есть без них. Если в меню нет подпунктов, нужно просто перейти по ссылке, в противном случае - открыть подменю...

Вот мой код:

JS:


/**
* Определяет, это ссылка или пункт меню, который содержит подпункты
*/
function isNormalLink(elemID)
{

var exp = 'expandable_' + elemID;
var classExp = '.' + exp;
var expStatus = '';
var expStyle = $$(classExp).getStyle('display');



$each(expStyle, function(key, value)
{
expStatus = expStatus + key;
});

var length = expStatus.length;
return (length == 0) ? true : false;
}

function cookie_is_set()
{
var c = Cookie.read('cookie_menu');
return (c == null) ? false : true;
}


function expandMenu(elemID)
{
var classExp = '.expandable_' + elemID;
var li = 'exp_' + elemID;

//если куки нет - просто открываем элемент, на котором щёлкнули, и ставим соответствующее значение
if (!cookie_is_set())
{
$$(classExp).setStyle('display', 'block');
$(li).removeClass('main_menu_off');
$(li).addClass('main_menu_on');
Cookie.write('cookie_menu', elemID);
}

//если есть - смотрим на её значение

else
{
var c = Cookie.read('cookie_menu');
var cExp = '.expandable_' + c;
var liCookie = 'exp_' + c;

//если она равна тому элементу, на котором щёлкнули, значит меняем его значение на противоположное
if (c == elemID)
{
var style = $$(classExp).getStyle('display');
var styleString = '';
$each(style, function (key, value)
{
styleString = styleString + key;
});

if (styleString.contains('none'))
{
$$(classExp).setStyle('display', 'block');
$(li).removeClass('main_menu_off');
$(li).addClass('main_menu_on');
}
else
{
$$(classExp).setStyle('display', 'none');
$(li).removeClass('main_menu_on');
$(li).addClass('main_menu_off');
}
}

//иначе закрываем элемент в куки и открываем текущий
else
{
$$(cExp).setStyle('display', 'none');
$(liCookie).removeClass('main_menu_off');
$(liCookie).addClass('main_menu_on');

$$(classExp).setStyle('display', 'block');
$(li).removeClass('main_menu_off');
$(li).addClass('main_menu_on');

Cookie.write('cookie_menu', elemID);

}
}
}

Шаблончик Smarty:


<ul id="right_menu">
{section name="menu_flevel" loop=$MENU}
{if $MENU[menu_flevel].level == 1}
<li class="main_menu_off" id="exp_{$MENU[menu_flevel].elem_id}"><span
class="clr"><a onClick="expandMenu({$MENU[menu_flevel].elem_id})" style="cursor: pointer;">
{$MENU[menu_flevel].name}</a></span></li>
{elseif $MENU[menu_flevel].level == 2}

{if $MENU_COOKIE}
{if ($MENU_COOKIE == $MENU[menu_flevel].rodit_kod)}
<li style="margin-left: 20px;"
class="expandable_{$MENU[menu_flevel].rodit_kod}" style="display:block;"><span class="submenu"><a
href="catalog.php?id={$MENU[menu_flevel].elem_id}">{$MENU[menu_flevel].name}</a></span></li>

{else}
<li class="expandable_{$MENU[menu_flevel].rodit_kod}" style="display: none;"><span class="submenu"><a href="catalog.php?id={$MENU[menu_flevel].elem_id}">{$MENU[menu_flevel].name}</a></span></li>


{/if}

{else}
<li class="expandable_{$MENU[menu_flevel].rodit_kod}"
style="display: none;"><span class="submenu"><a href="catalog.php?id=
{$MENU[menu_flevel].elem_id}">{$MENU[menu_flevel].name}</a></span></li>

{/if}
{/if}
{/section}
</ul>

Определения PHP в каждом из файлов:


//здесь подгрузка первого уровня дерева
$query = 'SELECT elem_id, rodit_kod, level, name FROM goods WHERE level IN (1, 2)';
$db->query($query);
$menu = array();

while ($menu_level = $db->parse_query('array'))
{
$menu[] = $menu_level;
$test = strpos($menu[$i]['name'], '*');
if ($test !== false)
{
$menu[$i]['name'] = chop_first_char($menu[$i]['name']);
}
$i++;
}
.............................
$smarty->assign(array(
'MENU' => $menu,


$smarty->assign(array(
.....................
'MENU_COOKIE' => isset($_COOKIE['cookie_menu']) ? $_COOKIE['cookie_menu'] : false

Функция chop_first_char


function chop_first_char($string)
{
if (!is_string($string))
{
return false;
}

$array = array();
$length = strlen($string);

for ($i = 0; $i < $length; $i++)
{
$array[] = $string[$i];
}

array_shift($array);
$c = count($array);

$str = '';
for ($j = 0; $j < $c; $j++)
{
$str .= $array[$j];
}

return $str;
}

Незначимые части выпущены.

Всё работает, чётко, кроме двух пунктов:

1. Когда переходишь со страницы на страницу, состояние меню как бы запоминается. Т.е. на главной я открыл один пункт, перешёл на "Доставку" - меню схлопнуто. Перешёл опять на главную - пункт меню открыт. Выглядит неестественно, хотя у меня вся работа идёт через кукисы.

2. Если открыть подменю и перейти на какую-нибудь страницу каталога (открыть "Чистый склад" и щёлкнуть по любому из пунктов там), то меня захлопнется, а ни в коем случае не должно.

Помогите пожалуйста кто-нибудь, меня эти функции задрали, я их уже на десятый раз переписываю....

------------------- Крутые VPS и дедики. Качество по разумной цене ( http://cp.inferno.name/view.php?product=1212&gid=1 ) VPS25OFF - скидка 25% на первый платеж по ссылке выше

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий