0

该网站由 2 个菜单组成:

  • 主菜单(从网站各处可见)
  • 第二个菜单(仅在从主菜单中选择某个菜单项时可见)

二级菜单说明: 例如从主菜单中选择“公司”时,主菜单显示二级菜单,包括公司 1、公司 2 等。

主菜单:

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

选择公司1或公司2时,出现辅助菜单。

二级菜单(此菜单没有级别,仅属于该公司的项目):

  • 视频的
  • 相片
  • 接触
  • ...

问题:

选择例如公司1时,联系人会议将是公司1的会议。选择公司2时,辅助菜单的联系菜单选项将是公司2的菜单。

我怎样才能把它变成果园?目前我有 2 个导航、1 个用于主菜单的菜单小部件和 1 个用于辅助菜单的菜单小部件。

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

~/Company/*

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

谢谢。

4

1 回答 1

1

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

此外,如果您使用的是 Orchard 1.6,我将应用此修复程序,以便在您注销时显示项目(如果您不更新 NavigationManager.cs 类中的 Reduce 方法,则会出现权限问题: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 部分添加到页面内容类型(或您使用的任何内容类型)。

于 2013-05-02T03:07:20.490 回答