2016-09-28 5 views
0

Я новичок в Orchard и пытаюсь понять, как он работает по коду. Итак, я создал пользовательский тип содержимого через код, и я могу создавать элементы контента в этом типе контента. У меня есть флажок «Показать в меню» на странице редактора элемента «Содержимое». Но когда я проверяю его и выбираю меню, в которое я хочу, чтобы этот новый созданный пользовательский элемент был добавлен, он добавляется как элемент вертикального меню, тогда как мне нужно его добавить в виде вертикального подменю к одному из корневых элементов. Пожалуйста, найдите изображения, которые описывают, что происходит сейчас, и что мне нужно. Current behavior Expected behaviorOrchard CMS - создать вертикальное навигационное меню рядом с Home

Product2 является пользовательский элемент контента и должен быть добавлен в качестве элемента в вертикальном меню, как показано на изображении 2

+0

Вы полностью прочитали [эту документацию] (http://docs.orchardproject.net/en/latest/Documentation/Navigation-and-menus/)? – devqon

+0

@devqon Да, я это сделал. Но в документации описывается способ Dashboard для создания подменю, тогда как мне нужен способ сделать это с помощью кода. Кроме того, я попытался использовать IMenuProvider и создал класс MainMenu, но это просто добавляет пункты меню, как указано в изображении под названием «Current Behavior». Кроме того, я хочу добавить элементы меню в новое Меню, которое я создал, а не по умолчанию. –

ответ

1

Эта задача довольно сложная. Есть несколько шагов.

  1. Понимание того, как создать дочернюю тему

    См official documentation, создать дочернюю тему и включить его

  2. Понимание концепции формы чередуется

    См official documentation

  3. Настройки меню в админке

    Перейти к админке, нажмите на навигации в меню и добавить некоторые пункты меню и подпункты, например

    [ Home (Content Menu Item) ] 
    [ Service (Content Menu Item) ] 
        [ Document Storage (Custom Link) ] 
    

    После того как вы эта структура Orchard отображает эту структуру через вызов @Zone(Model.Navigation) в теме. Вы должны искать, где этот вызов расположен для вас, это зависит от темы.

    Моего ребенок тема использует Layout.cshtml альтернативные, который вызывает @Zone(Model.Navigation), где это необходимо, как так

    @{ 
        Func<dynamic, dynamic> Zone = x => Display(x); // Zone as an alias for Display to help make it obvious when we're displaying zones 
    } 
    
    <div class="wrapper"> 
        @* Navigation bar *@ 
        @if (Model.Navigation != null) 
        { 
         <div id="layout-navigation" class="group navbar navbar-default" role="navigation"> 
         @Zone(Model.Navigation) 
         </div> 
        } 
    
        ... 
    </div> 
    

    Теперь, если Orchard оказывает само меню, он использует шаблон в Menu.cshtml форме, таким образом, следующий шаг будет обеспечить Форма чередуется на Menu.cshtml.

  4. Создание формы заменяющего меню в вашей детской теме

    Перейти к вам папке ребенка темы и добавить файл Views\Menu.cshtml и начать отображение меню есть, например

    <ul class="nav navbar-nav"> 
        @DisplayChildren(Model) 
    </ul> 
    

    @DisplayChildren(Model) вызов начнет визуализировать элементы меню с помощью шаблона формы MenuItem.cshtml, поэтому следующим шагом будет предоставление альтернативы формы для MenuItem.cshtml.

  5. Создание формы заменяющих пунктов меню в вашей детской теме

    Перейти к вам папке ребенка темы и добавить файл Views\MenuItem.cshtml и начать рендеринг пунктов меню. Вот содержание моего MenuItem.cshtml файла, оказывающий пункты меню, как <li> структуры в соответствии с бутстраповской спецификацией:

    @* 
        this shape alternate is displayed when a <li> element is rendered 
        whereas the following code is based on Orchard.Core\Shapes\Views\Menu.cshtml 
    *@ 
    
    @{ 
        // odd formatting in this file is to cause more attractive results in the output. 
        var items = Enumerable.Cast<dynamic>((System.Collections.IEnumerable)Model); 
    } 
    @{ 
        if (!HasText(Model.Text)) { 
         @DisplayChildren(Model) 
        } 
        else { 
         if ((bool) Model.Selected) { 
          Model.Classes.Add("current"); 
         } 
    
         if (items.Any()) { 
          Model.Classes.Add("dropdown"); 
         } 
    
         @* morphing the shape to keep Model untouched*@ 
         Model.Metadata.Alternates.Clear(); 
         Model.Metadata.Type = "MenuItemLink"; 
    
         @* render the menu item only if it has some content *@ 
         var renderedMenuItemLink = Display(Model); 
         if (HasText(renderedMenuItemLink)) { 
          var tag = Tag(Model, "li"); 
          @tag.StartElement 
          @renderedMenuItemLink 
    
          if (items.Any()) { 
           <ul class="dropdown-menu"> 
            @DisplayChildren(Model) 
           </ul> 
          } 
    
          @tag.EndElement 
         } 
        } 
    } 
    

    Вы также можете предоставить чередуешься переопределить конкретные типы элементов меню, как в Custom Link. Файл будет затем MenuItemLink.cshtml с содержанием как

    @* 
        this shape alternate is displayed when menu link is _not_ of type "Content Menu Item" otherwise MenuItemLink-ContentMenuItem.cshtml is used 
        whereas the following code is based on Orchard.Core\Shapes\Views\MenuItemLink.cshtml 
    *@ 
    <a href="@Model.Href" @if (Model.Item.Items.Length > 0) { <text>class="dropdown-toggle" data-toggle="dropdown"</text> }>@Model.Text</a> 
    

    Как вы можете видеть, много работы, но довольно гибкая.