第二个菜单有不同的项目

时间:2013-05-01 10:23:34

标签: c#-4.0 orchardcms orchardcms-1.6

该网站包含2个菜单:

  • 主菜单(可从网站的任何地方看到)
  • 第二个菜单(仅在从主菜单中选择某个菜单项时可见)

辅助菜单说明 例如选择"公司"从主菜单中,主菜单显示公司1,公司2等的第二级。

主菜单:

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

选择公司1或公司2时,会出现二级菜单。

辅助菜单(此菜单中没有关卡,只包含属于该公司的项目):

  • 视频' S
  • 照片' S
  • 联系
  • ...

问题:

当选择例如公司1时,联系会话将是公司1的联系会话。当选择公司2时,二级菜单的联系菜单选项将是公司2的联系人菜单选项。

我怎么能把它变成果园呢? 目前我有2个导航,1个菜单小部件用于主菜单,1个菜单小部件用于辅助菜单。

在主菜单上选择其中一家公司时,我的二级菜单会出现(此菜单会添加到下面带有网址规则的图层中)。此导航的级别设置为1。 网址规则:

~/Company/*

但是,根据我在主菜单中选择的公司,二级菜单上的项目究竟会如何重定向到其他内容项目?

感谢。

1 个答案:

答案 0 :(得分:1)

这是一篇关于如何将导航项动态注入菜单的非常好的帖子:http://www.davidhayden.me/blog/dynamically-injecting-menu-items-in-orchard-cms

此外,如果您使用的是Orchard 1.6,我会应用此修复程序,以便在您注销时显示项目(如果您未在NavigationManager.cs类中更新Reduce方法,则存在权限问题:{{ 3}}

编辑:

 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部分添加到页面内容类型(或您正在使用的任何内容类型)。