扩展果园菜单部分的最佳方法是什么?
我想对大多数内容类型使用普通菜单部分。
但我也想要一个自定义 MainNavigationMenuPart。它具有菜单部分的所有内容,但添加了一个媒体选择器字段和一个文本字段。- 这些项目将在菜单翻转时显示。
选项1
我认为这是最好的方法......
我已经研究过编写自定义菜单部分 - 但菜单部分当前的工作方式似乎有很多功能,我不确定如何以 DRY 的方式最好地利用它。
我可以将 MenuPartItem 添加到我的 customPart,所以主菜单部件模型看起来像这样
public class MainMenuPart : ContentPart<MainMenuRecord>
{
public MenuPart MenuPart { get; set; }
public string ShortDescription
{
get { return Record.ShortDescription; }
set { Record.ShortDescription = value; }
}
}
但 ...
- 如何在部件的编辑器视图中呈现它?
- 我想使用现有的 MenuPartItemEditor。
- 如何将此信息保存在零件的记录中?
选项 2
我还研究了向菜单部分添加字段(通过 cms)。
我的菜单部分现在在后端看起来像这样
在这里,我根据内容类型自定义了菜单的管理视图。购买在Views/EditorTemplates中创建Parts.Navigation.Menu.Edit.cshtml,在我的自定义中我可以访问菜单部分,但我似乎可以控制已添加到该部分的文件的显示。(菜单图像、突出显示和简短说明)
这是自定义的 Parts.Navigation.Menu.Edit.cshtml (原始在 Orchard.Core/Navigation/Views/EditorTemplates/Parts.Navigation.Menu.Edit.cshtml 中找到)
@model Orchard.Core.Navigation.ViewModels.MenuPartViewModel
@using Orchard.ContentManagement
@using Orchard.Core.Navigation.Models;
@if (!Model.ContentItem.TypeDefinition.Settings.ContainsKey("Stereotype") || Model.ContentItem.TypeDefinition.Settings["Stereotype"] != "MenuItem")
{
if (Model.ContentItem.ContentType == "StandardIndexPage" ||
Model.ContentItem.ContentType == "AlternateIndexPage" ||
Model.ContentItem.ContentType == "MapIndexPage")
{
var sd = ((dynamic)Model.ContentItem).MenuPart.ShortDescription;
@sd
<fieldset>
@Html.HiddenFor(m => m.OnMenu, true)
@Html.HiddenFor(m => m.CurrentMenuId, Model.CurrentMenuId)
<div>
<label for="MenuText">@T("Menu text (will appear on main menu)")</label>
@Html.TextBoxFor(m => m.MenuText, new { @class = "text-box single-line" })
<span class="hint">@T("The text that should appear in the menu.")</span>
</div>
</fieldset>
}
else
{
<fieldset>
@Html.EditorFor(m => m.OnMenu)
<label for="@Html.FieldIdFor(m => m.OnMenu)" class="forcheckbox">@T("Show on menu")</label>
<div data-controllerid="@Html.FieldIdFor(m => m.OnMenu)" class="">
<select id="@Html.FieldIdFor(m => m.CurrentMenuId)" name="@Html.FieldNameFor(m => m.CurrentMenuId)">
@foreach (ContentItem menu in Model.Menus)
{
@Html.SelectOption(Model.CurrentMenuId, menu.Id, Html.ItemDisplayText(menu).ToString())
}
</select>
<span class="hint">@T("Select which menu you want the content item to be displayed on.")</span>
<label for="MenuText">@T("Menu text")</label>
@Html.TextBoxFor(m => m.MenuText, new { @class = "text-box single-line" })
<span class="hint">@T("The text that should appear in the menu.")</span>
</div>
</fieldset>
}
}
else
{
<fieldset>
<label for="MenuText">@T("Menu text")</label>
@Html.TextBoxFor(m => m.MenuText, new { @class = "textMedium", autofocus = "autofocus" })
<span class="hint">@T("The text that should appear in the menu.")</span>
@Html.HiddenFor(m => m.OnMenu, true)
@Html.HiddenFor(m => m.CurrentMenuId, Request["menuId"])
</fieldset>
}
我还尝试使用主题中的placement.info 来控制字段的显示
<Match ContentType="StandardIndexPage">
<Place Fields_Boolean_Edit-Highlight="-"/>
</Match>
没有成功。