Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1 2 3 След.
Многоуровневое меню без разделов
На btrix.net что-то тишина, может у вас подскажут)

Можно ли создать трехуровневое меню (Основные элементы-->Пунк­ты-->Подпункты)­ без создания разделов? Т.е. чтобы при нажатии на Основной элемент не происходил переход в заданный раздел, а просто разворачивался узел Пунктов, где каждый Пункт представлял бы собой ссылку на определенную страничку или же разворачивал узел Подпунктов.
Я прошу прощения может-быть за какую-то назойливость, но как вы сами понимаете комьюнити у 1С Bitrix ASP.NET очень небольшое и собственно спросить больше особо и негде, а разобраться самому никак не удается. Уж я пытался и пытаюсь :)

Речь идет о создании такого меню, основные секции которого не будут содержать ссылок, однако будут раскрывать пункты подменю, если таковые в данной секции присутствуют.

Алексей, на форуме bitrix.net вы сказали что это можно решить путем кастомизации шаблона компонента "Меню", возможно с применением js. Изучил я этот шаблон и понял, что ума не приложу как это сделать. Может быть вы укажете направление, в котором можно продолжить копать?
Как я писал в соседней ветке 2х уровневое меню делается просто.

например шаблон компонента меню "system.PublicMenu/primary"



Код
<%@ Reference VirtualPath="~/bitrix/components/bitrix/system.PublicMenu/component.ascx" %>
<%@ Control Language="C#" ClassName="template" Inherits="Bitrix.Main.Components.SystemPublicMenuTemplate" %>
<%@ Import Namespace="Bitrix" %>

<script runat="server">
   public void RenderMenuItem(BXPublicMenuItem item, int depth, bool last, HtmlTextWriter writer)
   {
      bool hasChildren = item.Children != null && item.Children.Count != 0;
      
      if (depth == 0)
         writer.AddAttribute(HtmlTextWriterAttribute.Class, item.IsSelected ? "root-item-selected" : "root-item");
      else if (item.IsAccessible)
      {
         string cssClass = (item.IsSelected ? "item-selected" : "") + (last ? " item-last" : "");
         cssClass = cssClass.Trim();
         if (cssClass != "")
            writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClass.ToString());
      }
      writer.RenderBeginTag(HtmlTextWriterTag.Li);
      {
         if (depth == 0)
         {
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "root-separator");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.RenderEndTag();
         }

         if (depth == 0)
            writer.AddAttribute(HtmlTextWriterAttribute.Class, item.IsSelected ? "root-item-selected" : "root-item");
         else if (hasChildren)
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "parent");
         else if (!item.IsAccessible)
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "denied");

         if (!item.IsAccessible)
            writer.AddAttribute(HtmlTextWriterAttribute.Title, "Доступ запрещен");
         writer.AddAttribute(HtmlTextWriterAttribute.Href, (hasChildren || item.IsAccessible) ? item.Href : "");
         writer.RenderBeginTag(HtmlTextWriterTag.A);
         writer.WriteEncodedText(item.Title);
         writer.RenderEndTag();

         if (hasChildren)
         {
            writer.RenderBeginTag(HtmlTextWriterTag.Ul);
            for (int i = 0; i < item.Children.Count; i++)
               RenderMenuItem(item.Children[i], depth + 1, i == item.Children.Count - 1, writer);
            writer.RenderEndTag();
         }
      }
      writer.RenderEndTag();
   }
   public override string Title
   {
      get
      {
         return "Главное меню портала";
      }
   }
</script>

<%
   if (Component.Menu == null || Component.Menu.Count == 0)
      return;
%>

<ul id="horizontal-multilevel-menu">
   <li class="left-margin">&nbsp;</li>
   <% 
      for (int i = 0; i < Component.Menu.Count; i++)
         RenderMenuItem(Component.Menu[i], 0, i == Component.Menu.Count - 1, CurrentWriter);
   %>
</ul>
<div class="menu-clear-left"></div>
А просто создать меню из нескольких уровней у меня уже получилось (наконец-то :) ). Я теперь бьюсь именно над тем чтобы основные секции меню, т.е. самые верхние, были без ссылок.

P.S: Использую шаблон "vertical", вот его код выложить и хотел, да только не получается)
так значит осталось поставить условие для пунктов первого уровня не выводить <a href=""></a>
Вот мой шаблон:
Код
<%@ Reference VirtualPath="~/bitrix/components/bitrix/system.PublicMenu/component.ascx" %>
<%@ Control Language="C#" ClassName="template" Inherits="Bitrix.Main.Components.SystemPublicMenuTemplate" %>
<%@ Import Namespace="Bitrix" %>
<%  if (Component.Menu != null) { %>
   <% 
      var uriComparer = new BXUriComparer();

      Action<BXPublicMenuItemCollection, bool, BXPublicMenuItem, BXPublicMenuItem> render = null;
      bool showAll = Parameters.GetBool("Template_ShowAllLevels");
        render = delegate(BXPublicMenuItemCollection items,bool isRoot, BXPublicMenuItem selectedParent,BXPublicMenuItem parent)
        {
            int firstNum = 0; int lastNum = 0;

            BXPublicMenuItem selected = null;
            for (int i = 0; i < items.Count; i++)
            {
                if (!items[i].IsAccessible) continue;

                if (items[i].IsSelected && (selected == null || uriComparer.Compare(items[i].Link, selected.Link) >= 0))
                    selected = items[i];
            }
            
            for (int i = 0; i < items.Count;i++ )
            {
                var item = items[i];
                if (!item.IsAccessible) continue;
                string cssClass = Stri ng.Empty;
            bool isFull = false;
            bool tAccessible = showAll || isRoot || parent == selectedParent;
            if (!tAccessible) continue;
            
            bool containsSelectedChildren = item.Children!=null && item.Children.Exists(x => x.IsSelected);
Код
            if (items[i].IsSelected && (containsSelectedChildren || isRoot) )
               cssClass = "selected";
            else 
               if (items[i]==selected && ! containsSelectedChildren )
                  cssClass = "current";
                %>
                
                <% if (!isFull && !isRoot) { isFull = true; %><ul><% } %>
               <li  <% if (cssClass!=Stri ng.Empty) { %> class="<%=cssClass %>"<% } %>><% if (items[i]==selected && ! containsSelectedChildren && !isRoot) 
               { %><b class="r0"></b><i class="selected"><%= Encode(item.Title)%></i><b class="r0"></b><% } 
               else { %><a href=<%= item.Href %> <%= (items[i].IsSelected && (parent==null || parent.Href!=item.Href) ? "class=\"selected\"":"") %>><%= Encode(item.Title)%></a><% } %>
               <% if (item.Children != null && item.Children.Count> 0) { %> 
                  <% render(item.Children, false, selected, item); %>
               <% } %>
                  </li>
               <% if (isFull && !isRoot) { %></ul><% } %>
            
            <%
         } 
        };
    %>
    <ul class="left-menu">
    <% render(Component.Menu, true, null, null); %>
    </ul>
<% } %>
<sc ript runat="server">
   protected override void PreLoadTemplateDefinition(Bitrix.Components.BXParametersDefinition def)
   {
      def["Template_ShowAllLevels"] = new Bitrix.Components.BXParamYesNo(GetMessageRaw("Param.ShowAllLevels"), false, Bitrix.Components.BXCategory.AdditionalSettings);
   }
</sc ript>
Прошу прощения за столько постов, но в одном все уместить я не могу, если добавляю еще пару строчек любого текста, сообщение уже не поститься :(

Так вот, возвращаясь к теме, я так понял что вывод элементов списка происходит в этой строчке:
Код
else { %><a href=<%= item.Href %> <%= (items[i].IsSelected && (parent==null || parent.Href!=item.Href) ? "class=\"selected\"":"") %>><%= Encode(item.Title)%></a><% } %>


А вы говорите, что нужно перед "else" поставить еще один условный оператор, который будет проверять является ли элемент верхним (items[i].IsRoot) и если является, то выводить его НЕ внутри тега <a href></>, как в этой строчке? Все правильно или чушь несу? :D
Цитата
SRfix пишет:
Так вот, возвращаясь к теме, я так понял что вывод элементов списка происходит в этой строчке:
разве это сам вывод?
По-моему, это генерация ссылки. Т.е. она генерируется для любой строки (1, 2, 3, ... 999 уровней). Но если перед ней добавить ещё одно условие на принадлежность к уровням больше 1, а для первого то же самое, то БЕЗ ссылки, то мне кажется должно сработать...


Цитата
SRfix пишет:
Все правильно или чушь несу?
У самого мозг уже закипел, но звучит вроде бы разумно!
Я тут подумал, если выводить 1ый уровень без <a href>, то он же будет не кликабельный. Т.е. просто надпись, на которую нельзя нажать. Или вы имеете ввиду убирать не тег ссылки, а адрес ссылки? Тогда получится что верхние пункты будут ссылаться на корень сайта, а откуда им тогда брать подпункты? Нипонятно :(


Offtop: А чтобы поставить аватарку нужно небось 50 сообщений и месяц на форуме? :D
Изменено: SRfix - 19.09.2012 13:57:13
Страницы: 1 2 3 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)
________________________________________________________________

Новости IT

Статьи

Форум

Композитный сайт

Битрикс24

Команда

Проекты, которым мы помогли

Если вам нужен сайт

a@coffeediz.ru

Готовые решения