2013-05-01 62 views
0

第二個菜單的站點由2個菜單:不同項目

  • 主菜單(從隨處可見的部位)
  • 第二個菜單(僅可見從主菜單中選擇某個菜單項時)

二級菜單描述: 當選擇例如「公司」從主菜單,主菜單示出了具有1公司,公司2等的二次電平。

主菜單:

  • 公司
    • 公司1
    • 公司2
    • ...

當選擇公司1或2公司第出現二級菜單。

二級菜單(此菜單沒有水平進去,屬於該公司剛剛項):

  • 視頻的
  • 照片的
  • 聯繫
  • ...

問題:

當選擇例如公司1接觸會議將是公司1的在選擇公司2二級菜單的聯繫人菜單選項將是該公司2

的我究竟怎樣才能使進果園呢? 目前我有2個導航,1個主菜單的菜單部件和2個菜單部件。

當在主菜單上選擇一家公司時,我的二級菜單出現了(這個菜單被添加到一個下面的URL規則圖層)。這個導航的級別設置爲1。 URL規則:

~/Company/* 

但究竟會在二級菜單上的項目重定向到根據我在主菜單中選擇什麼公司的其他內容項目?

謝謝。

回答

1

這是一個關於如何動態地注入導航項目到你的菜單中選擇一個真正的好職位:http://www.davidhayden.me/blog/dynamically-injecting-menu-items-in-orchard-cms

另外,如果你在果園1.6我想,這樣的項目表明,當你退出應用此修復程序(如果您未更新NavigationManager中的Reduce方法,則會出現權限問題。CS類:https://orchard.codeplex.com/workitem/19318#CommentContainer1

編輯:

using System.Collections.Generic; 
    using System.Linq; 
    using Orchard.ContentManagement; 
    using Orchard.Localization; 
    using Orchard.Projections.Models; 
    using Orchard.Projections.Services; 
    using Orchard.UI.Navigation; 

    namespace Orchard.Projections.Navigation { 
     /// <summary> 
     /// Dynamically injects query results as menu items on NavigationQueryMenuItem elements 
     /// </summary> 
     public class NavigationQueryProvider : INavigationFilter { 
      private readonly IContentManager _contentManager; 

      public NavigationQueryProvider(IContentManager contentManager) { 
       _contentManager = contentManager; 
      } 

      public IEnumerable<MenuItem> Filter(IEnumerable<MenuItem> items) { 

       foreach (var item in items) { 
        if (item.Content != null && item.Content.ContentItem.ContentType == "CompanyMenuItem") { 

var containedItems = GetContainedItems(item.Id).Select(record => new MenuItem{ 
    //fill all properties 
}; 

         var menuPosition = item.Position; 
         int index = 0; 
         foreach (var contentItem in contentItems) { 
          if (contentItem != null) { 
           var part = contentItem; 

           var menuText = _contentManager.GetItemMetadata(part).DisplayText; 
           var routes = _contentManager.GetItemMetadata(part).DisplayRouteValues; 

           var inserted = new MenuItem { 
            Text = new LocalizedString(menuText), 
            IdHint = item.IdHint, 
            Classes = item.Classes, 
            Url = item.Url, 
            Href = item.Href, 
            LinkToFirstChild = false, 
            RouteValues = routes, 
            LocalNav = item.LocalNav, 
           ---> Items = containedItems, 
            Position = menuPosition + ":" + index++, 
            Permissions = item.Permissions, 
            Content = part 
           }; 

           yield return inserted; 
          } 
         } 
        } 
        else { 
         yield return item; 
        } 
       } 
      } 

public IEnumerable<ContentItem> GetContainedtems(int Id) { 
      var container = _contentManager.Query<ContainerPart>().List().SingleOrDefault(x => x.Id == Id); 

      IContentQuery<ContentItem> query = _contentManager 
       .Query(VersionOptions.Published) 
       .Join<CommonPartRecord>() 
       .Where(x => x.Container.Id == Id); 

      var descendingOrder = container.OrderByDirection == (int)OrderByDirection.Descending; 
      query = query.OrderBy(container.OrderByProperty, descendingOrder); 

      var contentItems = query.List(); 
      return contentItems; 
     } 
     } 
    } 

注*我沒有測試過這一點,但基本上我認爲做的最好的方式,這是創建一個容器中,添加所有相關的內容項具體公司,然後查詢包含的項目。只需將Containable和Container部分添加到頁面內容類型(或您正在使用的任何內容類型)即可。

+0

這篇博客是在短邊的它並沒有太多的信息,找到有關這個話題。所以基本上我必須修改,所以它只在company1上選擇時填充項目?標籤似乎不是要走的路或是他們? – Zerloke 2013-05-04 12:49:54

+0

用戶您好感謝編輯。我得到一個錯誤與「_containerMIRepo」(不知道這個是什麼?),並與查詢「排序依據」(錯誤:Orchard.ContentManagement.IContentQuery 」不包含定義爲‘排序依據’並沒有擴展方法'OrderBy')。謝謝! – Zerloke 2013-05-09 11:37:32

+1

我只是做了一個改變是,該行實際上應該不會在那裏,而不是使用傳遞給方法的item.id。 – 2013-05-09 17:37:45