Второе меню с разными пунктами

Сайт состоит из 2-х меню:

  • Главное меню (видно из любой точки сайта)
  • 2-е меню (отображается только при выборе определенного пункта меню из главного меню)

Описание дополнительного меню: при выборе, например, «компании» в главном меню, в главном меню отображается дополнительный уровень с компанией 1, компанией 2 и т. д.

Главное меню:

  • Company
    • Company 1
    • Компания 2
    • ...

При выборе «Компания 1» или «Компания 2» появляется вторичное меню.

Второстепенное меню (в этом меню нет уровней, только элементы, принадлежащие этой компании):

  • Видео
  • Фото
  • Контакт
  • ...

Вопрос:

При выборе, например, компании 1 сеанс связи будет сеансом связи компании 1. При выборе компании 2 пункт меню «Контакты» вторичного меню будет таким же, как у компании 2.

Как именно я могу превратить это в Орчард? В настоящее время у меня есть 2 навигации, 1 виджет меню для главного меню и 1 виджет для вторичного меню.

При выборе одной из компаний в главном меню появляется мое вторичное меню (это меню добавляется к слою с правилом URL-адреса ниже). Уровень этой навигации установлен на 1. Правило URL:

~/Company/*

Но как именно элементы во вторичном меню будут перенаправляться на другие элементы контента в зависимости от того, какую компанию я выбрал в главном меню?

Спасибо.


person Zerloke    schedule 01.05.2013    source источник


Ответы (1)


Это действительно хороший пост о том, как динамически вставлять элементы навигации в ваше меню: http://www.davidhayden.me/blog/dynamically-injecting-menu-items-in-orchard-cms

Кроме того, если вы используете Orchard 1.6, я бы применил это исправление, чтобы элементы отображались, когда вы выходите из системы (возникает проблема с разрешением, если вы не обновляете метод Reduce в классе NavigationManager.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;
        }
        }
    }

Примечание. * Я не тестировал это, но в основном я считаю, что лучший способ сделать это - создать контейнер и добавить все связанные элементы контента для конкретной компании, а затем запросить содержащиеся в нем элементы. Просто добавьте части «Контейнер» и «Контейнер» в тип контента страницы (или любой другой тип контента, который вы используете).

person The Pax Bisonica    schedule 02.05.2013
comment
Сообщение в блоге довольно короткое и не так много информации по этой теме. Так что в основном мне нужно изменить, чтобы он заполнял только элементы при выборе в компании1? Теги не подходят, или они? - person Zerloke; 04.05.2013
comment
Здравствуйте, пользователь, спасибо за редактирование. Я получаю сообщение об ошибке с _containerMIRepo (не уверен в этом?) И с запросом OrderBy (Error: Orchard.ContentManagement.IContentQuery ‹Orchard.ContentManagement.ContentItem› 'не содержит определения для' OrderBy 'и метода расширения 'Сортировать по'). Спасибо! - person Zerloke; 09.05.2013
comment
Я только что внес в это изменение, этой строки на самом деле не должно быть, вместо этого используйте item.id, который передается в метод. - person The Pax Bisonica; 09.05.2013
comment
Боюсь, я все еще не могу скомпилировать этот фрагмент кода (например, == containerId не существует). - person Zerloke; 11.05.2013
comment
Замените это идентификатором, переданным в этот метод. - person The Pax Bisonica; 11.05.2013