UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: niakriss от 17 Сентября 2012, 10:52:20

Название: стили пунктов меню
Отправлено: niakriss от 17 Сентября 2012, 10:52:20
Здравствуйте. Столкнулась с такой проблемой. Мне надо сделать подменю таким образом, чтоб при открытии одного из пунктов он выделялся цветом и раскрывал список его дочерних пунктов. Это я сделала. Но так же надо чтоб при выборе этих дочерних пунктов выделение с родительского снималось, а дочерний выделялся. у меня получается, что выделяется и тот и другой. какое условие можно поставить, чтоб он определял что последний активный пунт - это дочерний, поэтому с родительского надо снять выделение.
Название: Re:стили пунктов меню
Отправлено: BaceH от 19 Сентября 2012, 02:51:55
ид выделенного элемента меню будет совпадать с текущей страницей.
Название: Re:стили пунктов меню
Отправлено: niakriss от 19 Сентября 2012, 11:43:28
а как можно написать это? текущую страницу я еще как нить напишу.. а как выделенную?
вот хотела так:
<xsl:if test="@id = @id[@status='active']">
...
</xsl:if>
но так не получается..
Название: Re:стили пунктов меню
Отправлено: john от 19 Сентября 2012, 19:02:48
Я сделал так. Активному пунтку меню присваивается статус  и его описываю в css
/classes/modules/custom.php
        public function is_active_page($id=NULL) {
        if(!$id) return;
        $page_id = cmsController::getInstance()->getCurrentElementId();// берем id текущей страницы
        if($page_id==$id) return 'active';
        }
в xslt шаблоне
используем –
<!-- вызов кастомного скрипта -->
<xsl:variable name="actmenu" select="document(concat('udata://custom/is_active_page/',@id,'/',$document-page-id))/udata" />

<a href="{@link}" class="{$actmenu}">link</a>
Название: Re:стили пунктов меню
Отправлено: niakriss от 20 Сентября 2012, 09:19:26
Всем спасибо.. проблема решена... Техподдержка помогла)))
Название: Re:стили пунктов меню
Отправлено: john от 24 Сентября 2012, 19:37:35
В тему стилей пунктов меню.
Как написать условие?
Если один из пунктов 1-го уровня меню имеет 2-ой уровень меню (т.е. подуровень), необходимо его выделить пунктиром. И если выбрана конкретная ветка, пункт этого 1-го уровня меню выделить например цветом.
Название: Re:стили пунктов меню
Отправлено: niakriss от 25 Сентября 2012, 09:21:36
я делала так.. в админке добавляла новое поле типа Флаг. Назвать можно какнить типа Есть вложенные подпункты или чтонить такое.
И в шаблонах прописала условие. Если это поле отмечено, то <div class-active>, если нет, то просто <div>...
в вашем случае либо подчеркнут либо нет...
если нужен полностью подробный пример, напишите. постараюсь расписать...
Название: Re:стили пунктов меню
Отправлено: john от 25 Сентября 2012, 15:35:29
Было бы неплохо посмотреть пример.
Спасибо!
Название: Re:стили пунктов меню
Отправлено: niakriss от 28 Сентября 2012, 09:27:32
<!-- вызов всего меню -->
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
  <ul>
  <xsl:apply-templates select="items/item" mode="menu"/>
  </ul>
</xsl:template>

<!-- активный пункт меню -->
<xsl:template match="item[@status = 'active']" mode="menu">
<xsl:variable name="is_submenu_link1"
select="document(concat('upage://', @id, '.submenu_link1'))//value" /><!-- Это поле, которое я создала в админке с типом данных флаг -->
<xsl:choose>
<xsl:when test="$is_submenu_link1"><!-- Если стоит галочка то выполняется следующее -->
<li class="current">
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
<xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
</li>
</xsl:when>
<xsl:otherwise><!-- Если галочка не стоит то это -->
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
</li>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<!-- неактивный пункт меню -->
<xsl:template match="item" mode="menu">
<xsl:variable name="is_submenu_link1" select="document(concat('upage://', @id, '.submenu_link1'))//value" />
<xsl:choose>
<xsl:when test="$is_submenu_link1">
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
<xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
</li>
</xsl:when>
<xsl:otherwise>
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="@name" disable-output-escaping="yes"/></span></a>
</li>
</xsl:otherwise></xsl:choose>
</xsl:template>

Поле которое я создала у меняозначает, что есть подпункты... поэтому если они есть, то родитель выделяется иначе.... вы можете по другому как то сделать..
Название: Re:стили пунктов меню
Отправлено: admin от 29 Сентября 2012, 00:20:07
и все же я не понимаю зачем вам такая сложная конструкция, у вас есть в админке страницы вида

1 первая
1.1 подпункт первый
1.2 подпункт второй

2. вторая
3. третья

на всех страницах вы проставляете галочки "Выводить в меню", у пунктов первого уровня дополнительно ставите галочки "Показывать подменю", "Меню всегда развернуты" (последняя галочка вам нужна чтобы подпункты всех пунктов были видны, если вам надо чтобы были видны только подпункты текущей страницы то эту галочку убираем)

затем делаем вызов (вывести меню в 2 уровня от корня)
<xsl:apply-templates select="document('udata://content/menu/notemplate/2/0')" />

пишем шаблон вывода меню

<!-- вызов всего меню -->
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
  <ul>
<xsl:apply-templates select="items/item" mode="menu"/>
  </ul>
</xsl:template>

<!-- все пункты меню (общий шаблон) -->
<xsl:template match="item" mode="menu">
<li>
<a href="{@link}"><span id="a"><xsl:value-of select="text()" /><!--disable-output-escaping="yes" не нужен, в названии меню не предполагается наличие тегов, имя пункта меню содержиться внутри узла в виде текста так что выводим его не через @name, а через text()--></span></a>
<xsl:apply-templates select="items[item]" mode="sub_menu"/>
</li>
</xsl:template>

<!-- активный пункт меню (уточняющий шаблон размещаем ниже общего) -->
<xsl:template match="item[@status = 'active']" mode="menu">
<li class="current">
<a href="{@link}"><span id="a"><xsl:value-of select="text()"/></span></a>
<xsl:apply-templates select="items[item]" mode="sub_menu"/>
</li>

</xsl:template>

<!--вывод блока для подпункта меню-->
<xsl:template match="items" mode="sub_menu">
  <ul>
<xsl:apply-templates select="item" mode="menu"/><!--выводим элементы подпункта при помощи шаблона описанного выше, в принципе такая связка шаблонов выведет любое количество уровней меню-->
  </ul>
</xsl:template>
Название: Re:стили пунктов меню
Отправлено: niakriss от 01 Октября 2012, 12:51:29
потому что у меня первый уровень горизонтальный и у него свои стили.. а второй и 3 уровни вертикальные и у них совсем другие стили... не знала как иначе сделать.. так получилось.. а времени на улучшение не было.. вот и оставила пока так...
Название: Re:стили пунктов меню
Отправлено: admin от 01 Октября 2012, 13:08:40
в итоге, мною предложенный вариант подошел вам? или все же пока вам удобнее пользоваться своим кодом?
Название: Re:стили пунктов меню
Отправлено: niakriss от 01 Октября 2012, 14:50:14
нет... я пробовала на подобии этого.. тогда выпадающее меню появляется только тогда, когда пункт активынй... а у неактивных не выпадает... мне нужно чтоб у всех выпадало при наведении... а в моем случаи выпадает...
Название: Re:стили пунктов меню
Отправлено: admin от 01 Октября 2012, 15:31:10
для того чтобы 2 уровень меню появился при использования макроса content/menu, убедитесь, что у страниц первого уровня, которые имеют подпункты, в админке стоят галочки "Отображать в меню", "Показывать подменю", "Меню всегда развернуто". Последняя галочка как раз и отвечает за вывод подпунктов, даже если родительская страница 1 уровня не является активной .
Название: Re:стили пунктов меню
Отправлено: niakriss от 01 Октября 2012, 17:05:43
оу.. пасиб огромное.. ларчик то просто открывался... я недавно с юми работаю, поэтому не все нюансы еще знаю...
поставила галочку Меню всегда развернуто и все заработало))) пасиб...