Исправляем баг меню
|
|
+5↑ Голосов: 7 |
Баг, конечно, не критичный но крайне неприятный для тех, кому нужно многоуровневое меню с разграничениями прав доступа к вложенным пунктам.

Так оно будет выглядеть в свернутом виде

Теперь нам понадобилось скрыть от гостей доступ к одному из разделов

Вот, что гости увидят в итоге

Теперь, отказавшись от предыдущей затеи, скроем пункты в разделе, с надеждой, что после этого раздел превратится в обычную ссылку

В свернутом виде это будет выглядеть так

А в развернутом

Я не рискнул экспериментировать, что получится, если мы захотим одновременно скрыть вышеупомянутые пункты и раздел:)
Еще раз хочу подчеркнуть, что лично я особых ужасов в этом не вижу. Этот баг из разряда неприятностей, которые можно было бы обойти средствами системы, правда, не без некоторых потерь. Но если говорить о том, как это должно выглядеть ПРАВИЛЬНО, то по логике вещей, в развернутом виде примерно так

На всякий случай напомню исходное меню

Строки:
Строку:
ПЕРЕД строкой:
Помним, что после копирования нужно менять кавычки!
Те, кому лень или нет нужды ковырять код, могут скачать патч в каталоге дополнений.
P.S. Если разработчики сочтут целесообразным включить это решение в оф.релиз, то будет не лишним оптимизировать файл шаблона. Из него можно исключить логику отображения скрытых пунктов. Мне не составит труда это сделать.
Описание бага
Предположим нам нужно сделать многоуровневое меню
Так оно будет выглядеть в свернутом виде

Теперь нам понадобилось скрыть от гостей доступ к одному из разделов

Вот, что гости увидят в итоге

Теперь, отказавшись от предыдущей затеи, скроем пункты в разделе, с надеждой, что после этого раздел превратится в обычную ссылку

В свернутом виде это будет выглядеть так

А в развернутом

Я не рискнул экспериментировать, что получится, если мы захотим одновременно скрыть вышеупомянутые пункты и раздел:)
Еще раз хочу подчеркнуть, что лично я особых ужасов в этом не вижу. Этот баг из разряда неприятностей, которые можно было бы обойти средствами системы, правда, не без некоторых потерь. Но если говорить о том, как это должно выглядеть ПРАВИЛЬНО, то по логике вещей, в развернутом виде примерно так

На всякий случай напомню исходное меню

Устранение бага
Открываем файл /modules/mod_menu/module.phpСтроки:
Код PHP:
Заменяем на:
while ($row = $inDB->fetch_assoc($rs_rows)){
if ($row['menu'] == $menu){
Код PHP:
Идем дальше.
$m_inside = array(); // массив для подсчета к-ва прямых потомков разделов
$m_num = 0; // счетчик "актуальных" пунктов меню
while ($row = $inDB->fetch_assoc($rs_rows)){
if ( ($row['menu'] == $menu) &
(($row['allow_group'] == -1)||($row['allow_group'] == $inUser->group_id)||$inUser->is_admin) &
// заносим в массив только "актуальные" пункты меню
(($row['parent_id'] == $root_id)||(isset($m_inside[$row['parent_id']]))) ){
// отсекаем вложенные пункты, к родительскому разделу которых нет прав доступа
if ( $row['NSRight'] - $row['NSLeft'] != 1 ) { // если не 1 - значит имеются потомки
$m_inside[$row['id']]['count'] = 0; // стартовое значение счетчика прямых потомков
$m_inside[$row['id']]['num'] = $m_num; // индекс пункта меню в массиве
}
if ( $row['parent_id'] != $root_id ) { // если родительский раздел не является корнем
$m_inside[$row['parent_id']]['count']++; // счетчик прямых потомков родительского раздела увеличивается на 1
}
Строку:
Код PHP:
Заменяем на:
$items[] = $item;
Код PHP:
Идем дальше.
$items[$m_num++] = $item; // заносим данные в текущую ячейку массива и увеличиваем счетчик на 1
ПЕРЕД строкой:
Код PHP:
Вставляем:
$smarty = $inCore->initSmarty('modules', 'mod_menu.tpl');
Код PHP:
Все.
foreach ( $m_inside as $m_par ) {
if ( !$m_par['count'] ) { // если нет "актуальных потомков"
$items[$m_par['num']]['NSRight'] = $items[$m_par['num']]['NSLeft'] + 1; // снимаем статус родителя
}
}
Помним, что после копирования нужно менять кавычки!
Те, кому лень или нет нужды ковырять код, могут скачать патч в каталоге дополнений.
P.S. Если разработчики сочтут целесообразным включить это решение в оф.релиз, то будет не лишним оптимизировать файл шаблона. Из него можно исключить логику отображения скрытых пунктов. Мне не составит труда это сделать.
| # 13 марта 2010 в 10:42 0 | ||
|