#18769: Fixing menu import/export

Work Item: 18769

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros 2012-07-06 17:37:49 -07:00
parent 64eebe9ef9
commit f659406712
13 changed files with 60 additions and 26 deletions

View File

@ -44,7 +44,7 @@ namespace Orchard.Core.Navigation.Commands {
var menuItem = _contentManager.Create("MenuItem");
menuItem.As<MenuPart>().MenuPosition = MenuPosition;
menuItem.As<MenuPart>().MenuText = T(MenuText).ToString();
menuItem.As<MenuPart>().Menu = menu.ContentItem.Record;
menuItem.As<MenuPart>().Menu = menu.ContentItem;
menuItem.As<MenuItemPart>().Url = Url;
Context.Output.WriteLine(T("Menu item created successfully.").Text);

View File

@ -185,7 +185,7 @@ namespace Orchard.Core.Navigation.Controllers {
var model = Services.ContentManager.UpdateEditor(menuPart, this);
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
menuPart.Menu = menu.Record;
menuPart.Menu = menu;
Services.ContentManager.Create(menuPart);

View File

@ -59,7 +59,7 @@ namespace Orchard.Core.Navigation.Drivers {
var menu = model.OnMenu ? _orchardServices.ContentManager.Get(model.CurrentMenuId) : null;
part.MenuText = model.MenuText;
part.Menu = menu != null ? menu.Record : null;
part.Menu = menu;
if (string.IsNullOrEmpty(part.MenuPosition) && menu != null) {
part.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
@ -84,7 +84,13 @@ namespace Orchard.Core.Navigation.Drivers {
part.MenuPosition = position;
}
context.ImportAttribute(part.PartDefinition.Name, "Menu", x => part.Menu = context.GetItemFromSession(x).Record);
var menuIdentity = context.Attribute(part.PartDefinition.Name, "Menu");
if (menuIdentity != null) {
var menu = context.GetItemFromSession(menuIdentity);
if (menu != null) {
part.Menu = menu;
}
}
}
protected override void Exporting(MenuPart part, ContentManagement.Handlers.ExportContentContext context) {

View File

@ -11,13 +11,5 @@ namespace Orchard.Core.Navigation.Handlers {
Filters.Add(new ActivatingFilter<MenuItemPart>("MenuItem"));
Filters.Add(StorageFilter.For(repository));
}
protected override void GetItemMetadata(GetContentItemMetadataContext context) {
var part = context.ContentItem.As<MenuItemPart>();
if (part != null) {
context.Metadata.Identity.Add("MenuItem.Url", part.Url);
}
}
}
}

View File

@ -8,12 +8,33 @@ using Orchard.Data;
namespace Orchard.Core.Navigation.Handlers {
[UsedImplicitly]
public class MenuPartHandler : ContentHandler {
public MenuPartHandler(IRepository<MenuPartRecord> menuPartRepository) {
private readonly IContentManager _contentManager;
public MenuPartHandler(
IRepository<MenuPartRecord> menuPartRepository,
IContentManager contentManager
) {
_contentManager = contentManager;
Filters.Add(StorageFilter.For(menuPartRepository));
OnInitializing<MenuPart>((ctx, x) => {
x.MenuText = String.Empty;
});
OnActivated<MenuPart>(PropertySetHandlers);
}
protected static void PropertySetHandlers(ActivatedContentContext context, MenuPart menuPart) {
menuPart.MenuField.Setter(menu => {
menuPart.Record.MenuId = menu.ContentItem.Id;
return menu;
});
}
protected void LazyLoadHandlers(MenuPart menuPart) {
menuPart.MenuField.Loader(ctx =>
_contentManager.Get(menuPart.Record.MenuId, menuPart.IsPublished() ? VersionOptions.Published : VersionOptions.Latest));
}
protected override void GetItemMetadata(GetContentItemMetadataContext context) {
@ -26,5 +47,6 @@ namespace Orchard.Core.Navigation.Handlers {
}
}
}
}
}

View File

@ -27,11 +27,12 @@ namespace Orchard.Core.Navigation {
.ContentPartRecord()
.Column<string>("MenuText")
.Column<string>("MenuPosition")
.Column<int>("MenuRecord_id")
.Column<int>("MenuId")
);
ContentDefinitionManager.AlterTypeDefinition("MenuItem", cfg => cfg
.WithPart("MenuPart")
.WithPart("IdentityPart")
.WithPart("CommonPart")
.DisplayedAs("Custom Link")
.WithSetting("Description", "Represents a simple custom link with a text and an url.")
@ -55,6 +56,7 @@ namespace Orchard.Core.Navigation {
ContentDefinitionManager.AlterTypeDefinition("MenuWidget", cfg => cfg
.WithPart("CommonPart")
.WithPart("IdentityPart")
.WithPart("WidgetPart")
.WithPart("MenuWidgetPart")
.WithSetting("Stereotype", "Widget")
@ -72,6 +74,7 @@ namespace Orchard.Core.Navigation {
.WithPart("MenuPart")
.WithPart("BodyPart")
.WithPart("CommonPart")
.WithPart("IdentityPart")
.DisplayedAs("Html Menu Item")
.WithSetting("Description", "Renders some custom HTML in the menu.")
.WithSetting("BodyPartSettings.FlavorDefault", "html")
@ -89,6 +92,7 @@ namespace Orchard.Core.Navigation {
ContentDefinitionManager.AlterTypeDefinition("ContentMenuItem", cfg => cfg
.WithPart("MenuPart")
.WithPart("CommonPart")
.WithPart("IdentityPart")
.WithPart("ContentMenuItemPart")
.DisplayedAs("Content Menu Item")
.WithSetting("Description", "Adds a Content Item to the menu.")
@ -114,6 +118,7 @@ namespace Orchard.Core.Navigation {
ContentDefinitionManager.AlterTypeDefinition("MenuItem", cfg => cfg
.WithPart("MenuPart")
.WithPart("CommonPart")
.WithPart("IdentityPart")
.DisplayedAs("Custom Link")
.WithSetting("Description", "Represents a simple custom link with a text and an url.")
.WithSetting("Stereotype", "MenuItem") // because we declare a new stereotype, the Shape MenuItem_Edit is needed
@ -136,6 +141,7 @@ namespace Orchard.Core.Navigation {
ContentDefinitionManager.AlterTypeDefinition("MenuWidget", cfg => cfg
.WithPart("CommonPart")
.WithPart("IdentityPart")
.WithPart("WidgetPart")
.WithPart("MenuWidgetPart")
.WithSetting("Stereotype", "Widget")
@ -143,13 +149,14 @@ namespace Orchard.Core.Navigation {
SchemaBuilder
.AlterTable("MenuPartRecord", table => table.DropColumn("OnMainMenu"))
.AlterTable("MenuPartRecord", table => table.AddColumn<int>("MenuRecord_id"))
.AlterTable("MenuPartRecord", table => table.AddColumn<int>("MenuId"))
;
ContentDefinitionManager.AlterTypeDefinition("HtmlMenuItem", cfg => cfg
.WithPart("MenuPart")
.WithPart("BodyPart")
.WithPart("CommonPart")
.WithPart("IdentityPart")
.DisplayedAs("Html Menu Item")
.WithSetting("Description", "Renders some custom HTML in the menu.")
.WithSetting("BodyPartSettings.FlavorDefault", "html")
@ -168,7 +175,7 @@ namespace Orchard.Core.Navigation {
if(string.IsNullOrWhiteSpace(menuItem.MenuPosition)) {
continue;
}
menuItem.Menu = mainMenu.ContentItem.Record;
menuItem.Menu = mainMenu.ContentItem;
}
// at this point a widget should still be created to display the navigation

View File

@ -1,13 +1,16 @@
using System.ComponentModel.DataAnnotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Records;
using Orchard.ContentManagement.Utilities;
namespace Orchard.Core.Navigation.Models {
public class MenuPart : ContentPart<MenuPartRecord> {
public ContentItemRecord Menu {
get { return Record.MenuRecord; }
set { Record.MenuRecord = value; }
private readonly LazyField<IContent> _menu = new LazyField<IContent>();
public LazyField<IContent> MenuField { get { return _menu; } }
public IContent Menu {
get { return _menu.Value; }
set { _menu.Value = value; }
}
[StringLength(MenuPartRecord.DefaultMenuTextLength)]

View File

@ -8,6 +8,6 @@ namespace Orchard.Core.Navigation.Models {
[StringLength(DefaultMenuTextLength)]
public virtual string MenuText { get; set; }
public virtual string MenuPosition { get; set; }
public virtual ContentItemRecord MenuRecord { get; set; }
public virtual int MenuId { get; set; }
}
}

View File

@ -16,7 +16,7 @@ namespace Orchard.Core.Navigation.Services {
public void GetMenu(IContent menu, NavigationBuilder builder) {
var menuParts = _contentManager
.Query<MenuPart, MenuPartRecord>()
.Where(x => x.MenuRecord.Id == menu.Id)
.Where(x => x.MenuId == menu.Id)
.WithQueryHints(new QueryHints().ExpandRecords<MenuItemPartRecord>())
.List();

View File

@ -22,7 +22,7 @@ namespace Orchard.Core.Navigation.Services {
public IEnumerable<MenuPart> GetMenuParts(int menuId) {
return _contentManager
.Query<MenuPart, MenuPartRecord>()
.Where( x => x.MenuRecord.Id == menuId)
.Where( x => x.MenuId == menuId)
.List();
}

View File

@ -93,7 +93,7 @@ namespace Orchard.Blogs.Commands {
if (menu != null) {
blog.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
blog.As<MenuPart>().MenuText = MenuText;
blog.As<MenuPart>().Menu = menu.ContentItem.Record;
blog.As<MenuPart>().Menu = menu.ContentItem;
}
}

View File

@ -82,7 +82,7 @@ namespace Orchard.Pages.Commands {
if (menu != null) {
page.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
page.As<MenuPart>().MenuText = MenuText;
page.As<MenuPart>().Menu = menu.ContentItem.Record;
page.As<MenuPart>().Menu = menu.ContentItem;
}
}

View File

@ -78,7 +78,11 @@ namespace Orchard.ContentManagement {
}
return _contentManager.New(_contentTypes[contentIdentity]);
var contentItem = _contentManager.Create(_contentTypes[contentIdentity], VersionOptions.Draft);
_identities.Add(contentIdentity, contentItem.Id);
_contentItemIds.Add(contentItem.Id, contentIdentity);
return contentItem;
}
}
}