#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"); var menuItem = _contentManager.Create("MenuItem");
menuItem.As<MenuPart>().MenuPosition = MenuPosition; menuItem.As<MenuPart>().MenuPosition = MenuPosition;
menuItem.As<MenuPart>().MenuText = T(MenuText).ToString(); 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; menuItem.As<MenuItemPart>().Url = Url;
Context.Output.WriteLine(T("Menu item created successfully.").Text); 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); var model = Services.ContentManager.UpdateEditor(menuPart, this);
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
menuPart.Menu = menu.Record; menuPart.Menu = menu;
Services.ContentManager.Create(menuPart); 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; var menu = model.OnMenu ? _orchardServices.ContentManager.Get(model.CurrentMenuId) : null;
part.MenuText = model.MenuText; part.MenuText = model.MenuText;
part.Menu = menu != null ? menu.Record : null; part.Menu = menu;
if (string.IsNullOrEmpty(part.MenuPosition) && menu != null) { if (string.IsNullOrEmpty(part.MenuPosition) && menu != null) {
part.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); part.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu));
@@ -84,7 +84,13 @@ namespace Orchard.Core.Navigation.Drivers {
part.MenuPosition = position; 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) { 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(new ActivatingFilter<MenuItemPart>("MenuItem"));
Filters.Add(StorageFilter.For(repository)); 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 { namespace Orchard.Core.Navigation.Handlers {
[UsedImplicitly] [UsedImplicitly]
public class MenuPartHandler : ContentHandler { 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)); Filters.Add(StorageFilter.For(menuPartRepository));
OnInitializing<MenuPart>((ctx, x) => { OnInitializing<MenuPart>((ctx, x) => {
x.MenuText = String.Empty; 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) { 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() .ContentPartRecord()
.Column<string>("MenuText") .Column<string>("MenuText")
.Column<string>("MenuPosition") .Column<string>("MenuPosition")
.Column<int>("MenuRecord_id") .Column<int>("MenuId")
); );
ContentDefinitionManager.AlterTypeDefinition("MenuItem", cfg => cfg ContentDefinitionManager.AlterTypeDefinition("MenuItem", cfg => cfg
.WithPart("MenuPart") .WithPart("MenuPart")
.WithPart("IdentityPart")
.WithPart("CommonPart") .WithPart("CommonPart")
.DisplayedAs("Custom Link") .DisplayedAs("Custom Link")
.WithSetting("Description", "Represents a simple custom link with a text and an url.") .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 ContentDefinitionManager.AlterTypeDefinition("MenuWidget", cfg => cfg
.WithPart("CommonPart") .WithPart("CommonPart")
.WithPart("IdentityPart")
.WithPart("WidgetPart") .WithPart("WidgetPart")
.WithPart("MenuWidgetPart") .WithPart("MenuWidgetPart")
.WithSetting("Stereotype", "Widget") .WithSetting("Stereotype", "Widget")
@@ -72,6 +74,7 @@ namespace Orchard.Core.Navigation {
.WithPart("MenuPart") .WithPart("MenuPart")
.WithPart("BodyPart") .WithPart("BodyPart")
.WithPart("CommonPart") .WithPart("CommonPart")
.WithPart("IdentityPart")
.DisplayedAs("Html Menu Item") .DisplayedAs("Html Menu Item")
.WithSetting("Description", "Renders some custom HTML in the menu.") .WithSetting("Description", "Renders some custom HTML in the menu.")
.WithSetting("BodyPartSettings.FlavorDefault", "html") .WithSetting("BodyPartSettings.FlavorDefault", "html")
@@ -89,6 +92,7 @@ namespace Orchard.Core.Navigation {
ContentDefinitionManager.AlterTypeDefinition("ContentMenuItem", cfg => cfg ContentDefinitionManager.AlterTypeDefinition("ContentMenuItem", cfg => cfg
.WithPart("MenuPart") .WithPart("MenuPart")
.WithPart("CommonPart") .WithPart("CommonPart")
.WithPart("IdentityPart")
.WithPart("ContentMenuItemPart") .WithPart("ContentMenuItemPart")
.DisplayedAs("Content Menu Item") .DisplayedAs("Content Menu Item")
.WithSetting("Description", "Adds a Content Item to the menu.") .WithSetting("Description", "Adds a Content Item to the menu.")
@@ -114,6 +118,7 @@ namespace Orchard.Core.Navigation {
ContentDefinitionManager.AlterTypeDefinition("MenuItem", cfg => cfg ContentDefinitionManager.AlterTypeDefinition("MenuItem", cfg => cfg
.WithPart("MenuPart") .WithPart("MenuPart")
.WithPart("CommonPart") .WithPart("CommonPart")
.WithPart("IdentityPart")
.DisplayedAs("Custom Link") .DisplayedAs("Custom Link")
.WithSetting("Description", "Represents a simple custom link with a text and an url.") .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 .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 ContentDefinitionManager.AlterTypeDefinition("MenuWidget", cfg => cfg
.WithPart("CommonPart") .WithPart("CommonPart")
.WithPart("IdentityPart")
.WithPart("WidgetPart") .WithPart("WidgetPart")
.WithPart("MenuWidgetPart") .WithPart("MenuWidgetPart")
.WithSetting("Stereotype", "Widget") .WithSetting("Stereotype", "Widget")
@@ -143,13 +149,14 @@ namespace Orchard.Core.Navigation {
SchemaBuilder SchemaBuilder
.AlterTable("MenuPartRecord", table => table.DropColumn("OnMainMenu")) .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 ContentDefinitionManager.AlterTypeDefinition("HtmlMenuItem", cfg => cfg
.WithPart("MenuPart") .WithPart("MenuPart")
.WithPart("BodyPart") .WithPart("BodyPart")
.WithPart("CommonPart") .WithPart("CommonPart")
.WithPart("IdentityPart")
.DisplayedAs("Html Menu Item") .DisplayedAs("Html Menu Item")
.WithSetting("Description", "Renders some custom HTML in the menu.") .WithSetting("Description", "Renders some custom HTML in the menu.")
.WithSetting("BodyPartSettings.FlavorDefault", "html") .WithSetting("BodyPartSettings.FlavorDefault", "html")
@@ -168,7 +175,7 @@ namespace Orchard.Core.Navigation {
if(string.IsNullOrWhiteSpace(menuItem.MenuPosition)) { if(string.IsNullOrWhiteSpace(menuItem.MenuPosition)) {
continue; continue;
} }
menuItem.Menu = mainMenu.ContentItem.Record; menuItem.Menu = mainMenu.ContentItem;
} }
// at this point a widget should still be created to display the navigation // at this point a widget should still be created to display the navigation

View File

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

View File

@@ -8,6 +8,6 @@ namespace Orchard.Core.Navigation.Models {
[StringLength(DefaultMenuTextLength)] [StringLength(DefaultMenuTextLength)]
public virtual string MenuText { get; set; } public virtual string MenuText { get; set; }
public virtual string MenuPosition { 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) { public void GetMenu(IContent menu, NavigationBuilder builder) {
var menuParts = _contentManager var menuParts = _contentManager
.Query<MenuPart, MenuPartRecord>() .Query<MenuPart, MenuPartRecord>()
.Where(x => x.MenuRecord.Id == menu.Id) .Where(x => x.MenuId == menu.Id)
.WithQueryHints(new QueryHints().ExpandRecords<MenuItemPartRecord>()) .WithQueryHints(new QueryHints().ExpandRecords<MenuItemPartRecord>())
.List(); .List();

View File

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

View File

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