Меню, которое "держит" активный пункт (phpbb 3.0)
Автор меню - Alice
Теперь поставим после меню скрипт проверялку-присвоялку активного класса.
В хедер этот скрипт совать бесполезно, потому что если скрипт загрузится до меню, то он не увидит элементы с нужными айди (ведь они еще не загрузились) и не присвоит им класс.
И нам остается добавить в тему стиля описание класса активного пункта меню.
Например, зададим ссылкам другой фон.
Готово. Теперь если Шанс творчески влепит эту заготовку в свои шаблоны и тему стиля, то находясь в галерее у пользователя всегда будет отмеченным активным пункт меню "галерея", пока пользователь будет шастать по страницам галереи.
А если пользователь будет сидеть в любом месте личного раздела (кроме лички) -то активным будет оставаться пункт "Личный раздел". Если же пользователь отправиться в личные сообщения, то активным станет пункт меню "Личные сообщения".
Разумеется, стиль описывать надо с учетом особенностей вашей каскадной таблицы.
Alice писал(а):Очень мне понравилось меню, в котором "держится" активный пункт меню, пока пользователь не уйдет со страниц, объединенных какой-то общей целью.
Например. Сидит пользователь в форуме -активным остается пункт меню "Форум".
Уходит пользователь читать материалы блога - активным становится пункт меню "Блоги".
Позырив исходник рнргуру и поразмышляв над ним, поняла, что далеко не к любому меню на форуме 4админс возможно применить использованный там механизм.
Да и на самом рнр гуру меню работает не всегда ровно. Например, если пользователь выбирает в меню "FAQ", то активными становятся сразу два пункта - "Форумы" и "FAQ".
В общем, пришлось написать свое.
Принцип действия - каждому пункту меню присваивается свой айди.
В НТМЛ код после меню ставится скрипт, который проверяет, где находится пользователь, и в зависимости от этого присваивает соответствующему пункту меню помимо айди еще и класс.
Пример. Предположим, у нас есть меню-список, содержащее следующие пункты: форум, портал, сайт (ссылка на какую-нибудь статическую страницу), чаво, галерея, пользователи, поиск, личный раздел, личные сообщения, регистрация, вход/выход.
Присвоим каждому элементу списка свой айди.
Код: Выделить всё
<ul id="navlist">
<li id="on-forum"><a href="{U_INDEX}">•Форум</a></li>
<li id="on-portal"><a href="{U_PORTAL}">•{L_PORTAL}</a></li>
<li id="on-site"><a href="/page.php?p=welcome">•Сайт</a></li>
<li id="on-gallery"><a href="{U_GALLERY_MOD}">•{L_GALLERY}</a></li>
<li id="on-help"><a href="{U_FAQ}">{L_FAQ}</a></li>
<!-- IF not S_IS_BOT -->
<!-- IF S_DISPLAY_MEMBERLIST -->
<li id="on-memberlist"><a href="{U_MEMBERLIST}">•{L_MEMBERLIST}</a></li>
<!-- ENDIF -->
<!-- IF S_DISPLAY_SEARCH -->
<li id="on-search"><a href="{U_SEARCH}">•{L_SEARCH}</a></li>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- IF not S_IS_BOT and S_USER_LOGGED_IN -->
<li id="on-ucp"><a id="on-ucp" href="{U_PROFILE}">•{L_PROFILE}</a></li>
<!-- IF S_DISPLAY_PM -->
<li id="on-pm"><a href="{U_PRIVATEMSGS}">•{PRIVATE_MESSAGE_INFO}<!-- IF PRIVATE_MESSAGE_INFO_UNREAD -->, {PRIVATE_MESSAGE_INFO_UNREAD}<!-- ENDIF --></a></li>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- IF not S_IS_BOT and not S_USER_LOGGED_IN and S_REGISTER_ENABLED --><li id="on-register"><a href="{U_REGISTER}">•{L_REGISTER}</a></li><!-- ENDIF -->
<!-- IF not S_IS_BOT --><li id="on-loginlogout"><a href="{U_LOGIN_LOGOUT}">•{L_LOGIN_LOGOUT}</a></li> <!-- ENDIF -->
</ul>
В хедер этот скрипт совать бесполезно, потому что если скрипт загрузится до меню, то он не увидит элементы с нужными айди (ведь они еще не загрузились) и не присвоит им класс.
Код: Выделить всё
<script type="text/javascript">
// <![CDATA[
currentpathname=window.location.pathname
currentsearch=window.location.search
if (currentpathname.indexOf('gallery') != -1) document.getElementById("on-gallery").setAttribute("class", "menu-active");
else if (currentpathname.indexOf('portal') != -1) document.getElementById("on-portal").setAttribute("class", "menu-active");
else if (currentpathname.indexOf('search') != -1) document.getElementById("on-search").setAttribute("class", "menu-active");
else if (currentpathname.indexOf('memberlist') != -1) document.getElementById("on-memberlist").setAttribute("class", "menu-active");
else if (currentpathname.indexOf('faq') != -1) document.getElementById("on-help").setAttribute("class", "menu-active");
else if (currentsearch.indexOf('i=pm') != -1) document.getElementById("on-pm").setAttribute("class", "menu-active");
else if (currentsearch.indexOf('login') != -1||currentsearch.indexOf('logout') != -1) document.getElementById("on-loginlogout").setAttribute("class", "menu-active");
else if (currentsearch.indexOf('register') != -1) document.getElementById("on-register").setAttribute("class", "menu-active");
else if (currentpathname.indexOf('page.php') != -1) document.getElementById("on-site").setAttribute("class", "menu-active");
else if (currentpathname.indexOf('ucp.php') != -1) document.getElementById("on-ucp").setAttribute("class", "menu-active");
else document.getElementById("on-forum").setAttribute("class", "menu-active");
// ]]>
</script>
Например, зададим ссылкам другой фон.
Код: Выделить всё
.menu-active a {
background: url("/storage/1ua_2ua_in_ua/images/nav_hover.gif") repeat-x scroll center top transparent;
}
А если пользователь будет сидеть в любом месте личного раздела (кроме лички) -то активным будет оставаться пункт "Личный раздел". Если же пользователь отправиться в личные сообщения, то активным станет пункт меню "Личные сообщения".
Разумеется, стиль описывать надо с учетом особенностей вашей каскадной таблицы.
Поделитесь ссылкой.
HTML код
BBCode
Link
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей