Shifting Menu Items

This commit is contained in:
Sebastien Ros
2013-10-31 12:12:07 -07:00
parent 17a96308c5
commit 88c258ef55
18 changed files with 135 additions and 127 deletions

View File

@@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Routing;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Aspects;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Navigation.Models;
@@ -44,12 +41,8 @@ namespace Orchard.Core.Navigation.Drivers {
protected override DriverResult Display(MenuWidgetPart part, string displayType, dynamic shapeHelper) {
return ContentShape( "Parts_MenuWidget", () => {
if(part.Menu == null) {
return null;
}
var menu = _menuService.GetMenu(part.Menu.Id);
var menu = _menuService.GetMenu(part.MenuContentItemId);
if(menu == null) {
return null;
}
@@ -164,8 +157,9 @@ namespace Orchard.Core.Navigation.Drivers {
protected override DriverResult Editor(MenuWidgetPart part, dynamic shapeHelper) {
return ContentShape("Parts_MenuWidget_Edit", () => {
var model = new MenuWidgetViewModel {
CurrentMenuId = part.Menu == null ? -1 : part.Menu.Id,
CurrentMenuId = part.MenuContentItemId,
StartLevel = part.StartLevel,
StopLevel = part.Levels,
Breadcrumb = part.Breadcrumb,
@@ -188,8 +182,7 @@ namespace Orchard.Core.Navigation.Drivers {
part.Breadcrumb = model.Breadcrumb;
part.AddHomePage = model.AddHomePage;
part.AddCurrentPage = model.AddCurrentPage;
part.ShowFullMenu = model.ShowFullMenu;
part.Menu = _contentManager.Get(model.CurrentMenuId).Record;
part.MenuContentItemId = model.CurrentMenuId;
}
return Editor(part, shapeHelper);
@@ -203,11 +196,11 @@ namespace Orchard.Core.Navigation.Drivers {
context.ImportAttribute(part.PartDefinition.Name, "AddHomePage", x => part.AddHomePage = Convert.ToBoolean(x));
context.ImportAttribute(part.PartDefinition.Name, "ShowFullMenu", x => part.ShowFullMenu = Convert.ToBoolean(x));
context.ImportAttribute(part.PartDefinition.Name, "Menu", x => part.Menu = context.GetItemFromSession(x).Record);
context.ImportAttribute(part.PartDefinition.Name, "Menu", x => part.MenuContentItemId = context.GetItemFromSession(x).Id);
}
protected override void Exporting(MenuWidgetPart part, ExportContentContext context) {
var menuIdentity = _contentManager.GetItemMetadata(_contentManager.Get(part.Menu.Id)).Identity;
var menuIdentity = _contentManager.GetItemMetadata(_contentManager.Get(part.MenuContentItemId)).Identity;
context.Element(part.PartDefinition.Name).SetAttributeValue("Menu", menuIdentity);
context.Element(part.PartDefinition.Name).SetAttributeValue("StartLevel", part.StartLevel);

View File

@@ -37,7 +37,7 @@ namespace Orchard.Core.Navigation.Drivers {
}
protected override void Importing(ShapeMenuItemPart part, ImportContentContext context) {
IfNotNull(context.Attribute(part.PartDefinition.Name, "ShapeType"), x => part.Record.ShapeType = x);
IfNotNull(context.Attribute(part.PartDefinition.Name, "ShapeType"), x => part.ShapeType = x);
}
private static void IfNotNull<T>(T value, Action<T> then) where T : class {
@@ -47,7 +47,7 @@ namespace Orchard.Core.Navigation.Drivers {
}
protected override void Exporting(ShapeMenuItemPart part, ExportContentContext context) {
context.Element(part.PartDefinition.Name).SetAttributeValue("ShapeType", part.Record.ShapeType);
context.Element(part.PartDefinition.Name).SetAttributeValue("ShapeType", part.ShapeType);
}
}
}

View File

@@ -1,15 +1,10 @@
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.Core.Navigation.Models;
using Orchard.Data;
using Orchard.Core.Navigation.Models;
using Orchard.ContentManagement.Handlers;
namespace Orchard.Core.Navigation.Handlers {
[UsedImplicitly]
public class MenuItemPartHandler : ContentHandler {
public MenuItemPartHandler(IRepository<MenuItemPartRecord> repository) {
public MenuItemPartHandler() {
Filters.Add(new ActivatingFilter<MenuItemPart>("MenuItem"));
Filters.Add(StorageFilter.For(repository));
}
}
}

View File

@@ -1,12 +1,9 @@
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Navigation.Models;
using Orchard.Data;
namespace Orchard.Core.Navigation.Handlers {
public class MenuWidgetPartHandler : ContentHandler {
public MenuWidgetPartHandler(IRepository<MenuWidgetPartRecord> repository) {
Filters.Add(StorageFilter.For(repository));
public MenuWidgetPartHandler() {
OnInitializing<MenuWidgetPart>((context, part) => { part.StartLevel = 1; });
}
}

View File

@@ -1,11 +0,0 @@
using Orchard.Core.Navigation.Models;
using Orchard.Data;
using Orchard.ContentManagement.Handlers;
namespace Orchard.Core.Navigation.Handlers {
public class ShapeMenuItemPartHandler : ContentHandler {
public ShapeMenuItemPartHandler(IRepository<ShapeMenuItemPartRecord> repository) {
Filters.Add(StorageFilter.For(repository));
}
}
}

View File

@@ -10,12 +10,6 @@ namespace Orchard.Core.Navigation {
.Attachable()
.WithDescription("Provides an easy way to create a ContentMenuItem from the content editor."));
SchemaBuilder.CreateTable("MenuItemPartRecord",
table => table
.ContentPartRecord()
.Column<string>("Url", column => column.WithLength(1024))
);
SchemaBuilder.CreateTable("MenuPartRecord",
table => table
.ContentPartRecord()
@@ -38,16 +32,6 @@ namespace Orchard.Core.Navigation {
.WithPart("TitlePart")
);
SchemaBuilder.CreateTable("MenuWidgetPartRecord", table => table
.ContentPartRecord()
.Column<int>("StartLevel")
.Column<int>("Levels")
.Column<bool>("Breadcrumb")
.Column<bool>("AddHomePage")
.Column<bool>("AddCurrentPage")
.Column<int>("Menu_id")
);
ContentDefinitionManager.AlterTypeDefinition("MenuWidget", cfg => cfg
.WithPart("CommonPart")
.WithPart("IdentityPart")
@@ -78,12 +62,7 @@ namespace Orchard.Core.Navigation {
ContentDefinitionManager.AlterPartDefinition("AdminMenuPart", builder => builder
.Attachable()
.WithDescription("Adds a menu item to the Admin menu that links to this content item."));
SchemaBuilder.CreateTable("ShapeMenuItemPartRecord",
table => table.ContentPartRecord()
.Column<string>("ShapeType")
);
ContentDefinitionManager.AlterTypeDefinition("ShapeMenuItem",
cfg => cfg
.WithPart("ShapeMenuItemPart")

View File

@@ -1,11 +1,10 @@
using Orchard.ContentManagement;
namespace Orchard.Core.Navigation.Models {
public class MenuItemPart : ContentPart<MenuItemPartRecord> {
public class MenuItemPart : ContentPart {
public string Url {
get { return Record.Url; }
set { Record.Url = value; }
get { return this.Retrieve(x => x.Url); }
set { this.Store(x => x.Url, value); }
}
}
}

View File

@@ -1,7 +0,0 @@
using Orchard.ContentManagement.Records;
namespace Orchard.Core.Navigation.Models {
public class MenuItemPartRecord : ContentPartRecord {
public virtual string Url { get; set; }
}
}

View File

@@ -1,37 +1,36 @@
using Orchard.ContentManagement;
using Orchard.ContentManagement.Records;
namespace Orchard.Core.Navigation.Models {
public class MenuWidgetPart : ContentPart<MenuWidgetPartRecord> {
public class MenuWidgetPart : ContentPart {
public int StartLevel {
get { return Retrieve(x => x.StartLevel); }
set { Store(x => x.StartLevel, value); }
get { return this.Retrieve(x => x.StartLevel); }
set { this.Store(x => x.StartLevel, value); }
}
public int Levels {
get { return Retrieve(x => x.Levels); }
set { Store(x => x.Levels, value); }
get { return this.Retrieve(x => x.Levels); }
set { this.Store(x => x.Levels, value); }
}
public bool Breadcrumb {
get { return Retrieve(x => x.Breadcrumb); }
set { Store(x => x.Breadcrumb, value); }
get { return this.Retrieve(x => x.Breadcrumb); }
set { this.Store(x => x.Breadcrumb, value); }
}
public bool AddHomePage {
get { return Retrieve(x => x.AddHomePage); }
set { Store(x => x.AddHomePage, value); }
get { return this.Retrieve(x => x.AddHomePage); }
set { this.Store(x => x.AddHomePage, value); }
}
public bool AddCurrentPage {
get { return Retrieve(x => x.AddCurrentPage); }
set { Store(x => x.AddCurrentPage, value); }
get { return this.Retrieve(x => x.AddCurrentPage); }
set { this.Store(x => x.AddCurrentPage, value); }
}
public ContentItemRecord Menu {
get { return Record.Menu; }
set { Record.Menu = value; }
public int MenuContentItemId {
get { return this.Retrieve(x => x.MenuContentItemId); }
set { this.Store(x => x.MenuContentItemId, value); }
}
public bool ShowFullMenu {

View File

@@ -1,13 +0,0 @@
using Orchard.ContentManagement.Records;
namespace Orchard.Core.Navigation.Models {
public class MenuWidgetPartRecord : ContentPartRecord {
public virtual int StartLevel { get; set; }
public virtual int Levels { get; set; }
public virtual bool Breadcrumb { get; set; }
public virtual bool AddHomePage { get; set; }
public virtual bool AddCurrentPage { get; set; }
public virtual ContentItemRecord Menu { get; set; }
}
}

View File

@@ -1,13 +1,13 @@
using Orchard.ContentManagement;
namespace Orchard.Core.Navigation.Models {
public class ShapeMenuItemPart : ContentPart<ShapeMenuItemPartRecord> {
public class ShapeMenuItemPart : ContentPart {
/// <summary>
/// Maximum number of items to retrieve from db
/// </summary>
public virtual string ShapeType {
get { return Record.ShapeType; }
set { Record.ShapeType = value; }
public string ShapeType {
get { return this.Retrieve(x => x.ShapeType); }
set { this.Store(x => x.ShapeType, value); }
}
}
}

View File

@@ -1,10 +0,0 @@
using Orchard.ContentManagement.Records;
namespace Orchard.Core.Navigation.Models {
public class ShapeMenuItemPartRecord : ContentPartRecord {
/// <summary>
/// The shape to display
/// </summary>
public virtual string ShapeType { get; set; }
}
}

View File

@@ -17,7 +17,6 @@ namespace Orchard.Core.Navigation.Services {
var menuParts = _contentManager
.Query<MenuPart, MenuPartRecord>()
.Where(x => x.MenuId == menu.Id)
.WithQueryHints(new QueryHints().ExpandRecords<MenuItemPartRecord>())
.List();
foreach (var menuPart in menuParts) {

View File

@@ -143,14 +143,12 @@
<Compile Include="Navigation\Drivers\ShapeMenuItemPartDriver.cs" />
<Compile Include="Navigation\Handlers\AdminMenuPartHandler.cs" />
<Compile Include="Navigation\Handlers\MenuHandler.cs" />
<Compile Include="Navigation\Handlers\MenuItemPartHandler.cs" />
<Compile Include="Navigation\Handlers\MenuWidgetPartHandler.cs" />
<Compile Include="Navigation\Handlers\ShapeMenuItemPartHandler.cs" />
<Compile Include="Navigation\Models\AdminMenuPart.cs" />
<Compile Include="Navigation\Models\AdminMenuPartRecord.cs" />
<Compile Include="Navigation\Models\MenuWidgetPartRecord.cs" />
<Compile Include="Navigation\Models\MenuWidgetPart.cs" />
<Compile Include="Navigation\Models\ShapeMenuItemPart.cs" />
<Compile Include="Navigation\Models\ShapeMenuItemPartRecord.cs" />
<Compile Include="Navigation\Services\AdminMenuNavigationProvider.cs" />
<Compile Include="Navigation\Services\DefaultMenuManager.cs" />
<Compile Include="Navigation\Services\IMenuManager.cs" />
@@ -202,12 +200,10 @@
<Compile Include="Navigation\AdminMenu.cs" />
<Compile Include="Navigation\Controllers\AdminController.cs" />
<Compile Include="Navigation\Models\MenuItemPart.cs" />
<Compile Include="Navigation\Handlers\MenuItemPartHandler.cs" />
<Compile Include="Navigation\Models\MenuPart.cs" />
<Compile Include="Navigation\Drivers\MenuPartDriver.cs" />
<Compile Include="Navigation\Handlers\MenuPartHandler.cs" />
<Compile Include="Navigation\Permissions.cs" />
<Compile Include="Navigation\Models\MenuItemPartRecord.cs" />
<Compile Include="Navigation\Models\MenuPartRecord.cs" />
<Compile Include="Navigation\Services\IMenuService.cs" />
<Compile Include="Navigation\Services\MainMenuService.cs" />
@@ -372,7 +368,6 @@
<ItemGroup>
<Folder Include="App_Data\" />
<Folder Include="Containers\Services\" />
<Folder Include="Settings\Handlers\" />
</ItemGroup>
<ItemGroup>
<Content Include="Contents\Views\Web.config" />

View File

@@ -112,7 +112,7 @@ namespace Orchard.Widgets.Commands {
if(menu != null) {
widget.RenderTitle = false;
widget.As<MenuWidgetPart>().Menu = menu.ContentItem.Record;
widget.As<MenuWidgetPart>().MenuContentItemId = menu.ContentItem.Id;
}
}

View File

@@ -48,7 +48,7 @@ namespace Upgrade.Controllers {
var site = _orchardServices.WorkContext.CurrentSite.As<SiteSettingsPart>();
// SiteSettingsPartRecord
_upgradeService.ExecuteReader("SELECT * FROM " + _upgradeService.GetPrefixedTableName("Orchard_Core_SiteSettingsPartRecord"),
_upgradeService.ExecuteReader("SELECT * FROM " + _upgradeService.GetPrefixedTableName("Settings_SiteSettingsPartRecord"),
(reader, connection) => {
site.HomePage = (string)reader["HomePage"];
site.PageSize = (int)reader["PageSize"];
@@ -61,15 +61,15 @@ namespace Upgrade.Controllers {
site.SuperUser = (string)reader["SuperUser"];
});
_upgradeService.ExecuteReader("DROP TABLE " + _upgradeService.GetPrefixedTableName("Orchard_Core_SiteSettingsPartRecord"), null);
_upgradeService.ExecuteReader("DROP TABLE " + _upgradeService.GetPrefixedTableName("Settings_SiteSettingsPartRecord"), null);
// SiteSettings2PartRecord
_upgradeService.ExecuteReader("SELECT * FROM " + _upgradeService.GetPrefixedTableName("Orchard_Core_SiteSettings2PartRecord"),
_upgradeService.ExecuteReader("SELECT * FROM " + _upgradeService.GetPrefixedTableName("Settings_SiteSettings2PartRecord"),
(reader, connection) => {
site.BaseUrl = (string)reader["BaseUrl"];
});
_upgradeService.ExecuteReader("DROP TABLE " + _upgradeService.GetPrefixedTableName("Orchard_Core_SiteSettings2PartRecord"), null);
_upgradeService.ExecuteReader("DROP TABLE " + _upgradeService.GetPrefixedTableName("Settings_SiteSettings2PartRecord"), null);
// ThemeSiteSettingsPartRecord
_upgradeService.ExecuteReader("SELECT * FROM " + _upgradeService.GetPrefixedTableName("Orchard_Themes_ThemeSiteSettingsPartRecord"),
@@ -247,5 +247,80 @@ namespace Upgrade.Controllers {
return new JsonResult { Data = lastContentItemId };
}
[HttpPost]
public JsonResult MigrateMenuWidgetPart(int id) {
if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner))
throw new AuthenticationException("");
var lastContentItemId = id;
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Navigation_MenuWidgetPartRecord") + " WHERE Id > " + id,
(reader, connection) => {
lastContentItemId = (int)reader["Id"];
var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId);
contentPermissionPart.As<InfosetPart>().Store("MenuWidgetPart", "StartLevel", (int)reader["StartLevel"]);
contentPermissionPart.As<InfosetPart>().Store("MenuWidgetPart", "Levels", (int)reader["Levels"]);
contentPermissionPart.As<InfosetPart>().Store("MenuWidgetPart", "Breadcrumb", (bool)reader["Breadcrumb"]);
contentPermissionPart.As<InfosetPart>().Store("MenuWidgetPart", "AddHomePage", (bool)reader["AddHomePage"]);
contentPermissionPart.As<InfosetPart>().Store("MenuWidgetPart", "AddCurrentPage", (bool)reader["AddCurrentPage"]);
contentPermissionPart.As<InfosetPart>().Store("MenuWidgetPart", "MenuContentItemId", (int)reader["Menu_id"]);
});
if (lastContentItemId == id) {
// delete the table only when there is no more content to process
_upgradeService.ExecuteReader("DROP TABLE " + _upgradeService.GetPrefixedTableName("Navigation_MenuWidgetPartRecord"), null);
}
return new JsonResult { Data = lastContentItemId };
}
[HttpPost]
public JsonResult MigrateShapeMenuItemPart(int id) {
if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner))
throw new AuthenticationException("");
var lastContentItemId = id;
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Navigation_ShapeMenuItemPartRecord") + " WHERE Id > " + id,
(reader, connection) => {
lastContentItemId = (int)reader["Id"];
var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId);
contentPermissionPart.As<InfosetPart>().Store("ShapeMenuItemPart", "ShapeType", (string)reader["ShapeType"]);
});
if (lastContentItemId == id) {
// delete the table only when there is no more content to process
_upgradeService.ExecuteReader("DROP TABLE " + _upgradeService.GetPrefixedTableName("Navigation_ShapeMenuItemPartRecord"), null);
}
return new JsonResult { Data = lastContentItemId };
}
[HttpPost]
public JsonResult MigrateMenuItemPart(int id) {
if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner))
throw new AuthenticationException("");
var lastContentItemId = id;
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Navigation_MenuItemPartRecord") + " WHERE Id > " + id,
(reader, connection) => {
lastContentItemId = (int)reader["Id"];
var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId);
contentPermissionPart.As<InfosetPart>().Store("MenuItemPart", "Url", (string)reader["Url"]);
});
if (lastContentItemId == id) {
// delete the table only when there is no more content to process
_upgradeService.ExecuteReader("DROP TABLE " + _upgradeService.GetPrefixedTableName("Navigation_MenuItemPartRecord"), null);
}
return new JsonResult { Data = lastContentItemId };
}
}
}

View File

@@ -76,7 +76,7 @@ namespace Upgrade.Controllers {
var menuWidget = widget.As<MenuWidgetPart>();
menuWidget.Menu = mainMenu.ContentItem.Record;
menuWidget.MenuContentItemId = mainMenu.ContentItem.Id;
menuWidget.StartLevel = 1;
menuWidget.Levels = 1;

View File

@@ -51,6 +51,24 @@
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateLayerPart", "Infoset")">@T("Migrate")</button>
</fieldset>
<fieldset>
<legend>@T("Migrating Menu Widget Parts:")</legend>
<span class="hint">@T("This migration step will copy all Menu Widget parts to Infosets.")</span>
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateMenuWidgetPart", "Infoset")">@T("Migrate")</button>
</fieldset>
<fieldset>
<legend>@T("Migrating Shape Menu Item Parts:")</legend>
<span class="hint">@T("This migration step will copy all Shape Menu Item parts to Infosets.")</span>
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateShapeMenuItemPart", "Infoset")">@T("Migrate")</button>
</fieldset>
<fieldset>
<legend>@T("Migrating Menu Item Parts:")</legend>
<span class="hint">@T("This migration step will copy all Menu Item parts to Infosets.")</span>
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateMenuItemPart", "Infoset")">@T("Migrate")</button>
</fieldset>
@using (Script.Foot()) {
<script type="text/javascript">
$(function() {