From 9922d5e09af438ddc455b2416f08dfa635f695a9 Mon Sep 17 00:00:00 2001 From: Suha Can Date: Sat, 19 Feb 2011 13:59:59 -0800 Subject: [PATCH] Adding commands for creating layers and widgets. Update recipe files. Remove layer/widget creation code from setup. --HG-- branch : recipe --- .../RecipeHandlers/CommandRecipeHandler.cs | 2 + .../Orchard.Setup/Recipes/blog.recipe.xml | 8 ++ .../Orchard.Setup/Recipes/cms.recipe.xml | 8 ++ .../Orchard.Setup/Recipes/minimal.recipe.xml | 8 ++ .../Orchard.Setup/Services/SetupService.cs | 76 +--------------- .../Orchard.Widgets/Commands/LayerCommands.cs | 53 ++++++++++++ .../Commands/WidgetCommands.cs | 86 +++++++++++++++++++ .../Orchard.Widgets/Orchard.Widgets.csproj | 2 + 8 files changed, 171 insertions(+), 72 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/Commands/LayerCommands.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Widgets/Commands/WidgetCommands.cs diff --git a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/CommandRecipeHandler.cs b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/CommandRecipeHandler.cs index d1d722b68..a05c86b84 100644 --- a/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/CommandRecipeHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Recipes/RecipeHandlers/CommandRecipeHandler.cs @@ -56,6 +56,8 @@ namespace Orchard.Recipes.RecipeHandlers { } // Utility class for parsing lines of commands. + // Note: This lexer handles double quotes pretty harshly by design. + // In case you needed them in your arguments, hopefully single quotes work for you as a replacement on the receiving end. class CommandParser { public CommandParameters ParseCommandParameters(string command) { var args = SplitArgs(command); diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Recipes/blog.recipe.xml b/src/Orchard.Web/Modules/Orchard.Setup/Recipes/blog.recipe.xml index 46b2d26cf..97ad73e74 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Recipes/blog.recipe.xml +++ b/src/Orchard.Web/Modules/Orchard.Setup/Recipes/blog.recipe.xml @@ -44,7 +44,15 @@ feature enable Orchard.Experimental.TestingLists + layer create /Name:"Default" /LayerRule:"true" + layer create /Name:"Authenticated" /LayerRule:"authenticated" + layer create /Name:"Anonymous" /LayerRule:"not authenticated" + layer create /Name:"Disabled" /LayerRule:"false" + layer create /Name:"TheHomepage" /LayerRule:"url '~/'" page create /Slug:"welcome-to-orchard" /Title:"Welcome to Orchard!" /Path:"welcome-to-orchard" /Homepage:true /Publish:true /UseWelcomeText:true + widget create /Type:"HtmlWidget" /Title:"First Leader Aside" /Zone:"TripelFirst" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true + widget create /Type:"HtmlWidget" /Title:"Second Leader Aside" /Zone:"TripelSecond" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true + widget create /Type:"HtmlWidget" /Title:"Third Leader Aside" /Zone:"TripelThird" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true menuitem create /MenuPosition:"1" /MenuText:"Home" /Url:"" /OnMainMenu:true diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Recipes/cms.recipe.xml b/src/Orchard.Web/Modules/Orchard.Setup/Recipes/cms.recipe.xml index cfabc15e2..d75854ca0 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Recipes/cms.recipe.xml +++ b/src/Orchard.Web/Modules/Orchard.Setup/Recipes/cms.recipe.xml @@ -40,7 +40,15 @@ feature enable Orchard.Experimental.TestingLists + layer create /Name:"Default" /LayerRule:"true" + layer create /Name:"Authenticated" /LayerRule:"authenticated" + layer create /Name:"Anonymous" /LayerRule:"not authenticated" + layer create /Name:"Disabled" /LayerRule:"false" + layer create /Name:"TheHomepage" /LayerRule:"url '~/'" page create /Slug:"welcome-to-orchard" /Title:"Welcome to Orchard!" /Path:"welcome-to-orchard" /Homepage:true /Publish:true /UseWelcomeText:true + widget create /Type:"HtmlWidget" /Title:"First Leader Aside" /Zone:"TripelFirst" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true + widget create /Type:"HtmlWidget" /Title:"Second Leader Aside" /Zone:"TripelSecond" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true + widget create /Type:"HtmlWidget" /Title:"Third Leader Aside" /Zone:"TripelThird" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true menuitem create /MenuPosition:"1" /MenuText:"Home" /Url:"" /OnMainMenu:true diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Recipes/minimal.recipe.xml b/src/Orchard.Web/Modules/Orchard.Setup/Recipes/minimal.recipe.xml index bed9494e1..c4038752f 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Recipes/minimal.recipe.xml +++ b/src/Orchard.Web/Modules/Orchard.Setup/Recipes/minimal.recipe.xml @@ -40,7 +40,15 @@ feature enable Orchard.Experimental.TestingLists + layer create /Name:"Default" /LayerRule:"true" + layer create /Name:"Authenticated" /LayerRule:"authenticated" + layer create /Name:"Anonymous" /LayerRule:"not authenticated" + layer create /Name:"Disabled" /LayerRule:"false" + layer create /Name:"TheHomepage" /LayerRule:"url '~/'" page create /Slug:"welcome-to-orchard" /Title:"Welcome to Orchard!" /Path:"welcome-to-orchard" /Homepage:true /Publish:true /UseWelcomeText:true + widget create /Type:"HtmlWidget" /Title:"First Leader Aside" /Zone:"TripelFirst" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true + widget create /Type:"HtmlWidget" /Title:"Second Leader Aside" /Zone:"TripelSecond" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true + widget create /Type:"HtmlWidget" /Title:"Third Leader Aside" /Zone:"TripelThird" /Position:"5" /Layer:"TheHomepage" /UseLoremIpsumText:true menuitem create /MenuPosition:"1" /MenuText:"Home" /Url:"" /OnMainMenu:true diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs index c256931c9..1268287af 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs @@ -4,9 +4,6 @@ using System.Linq; using System.Security.Cryptography; using System.Web; using Orchard.ContentManagement; -using Orchard.Core.Common.Models; -using Orchard.Core.Navigation.Models; -using Orchard.Core.Routable.Models; using Orchard.Core.Settings.Descriptor.Records; using Orchard.Core.Settings.Models; using Orchard.Data; @@ -14,7 +11,6 @@ using Orchard.Data.Migration.Interpreters; using Orchard.Data.Migration.Schema; using Orchard.Environment; using Orchard.Environment.Configuration; -using Orchard.Environment.Extensions; using Orchard.Environment.ShellBuilders; using Orchard.Environment.Descriptor; using Orchard.Environment.Descriptor.Models; @@ -29,8 +25,6 @@ using Orchard.Environment.State; using Orchard.Data.Migration; using Orchard.Themes.Services; using Orchard.Utility.Extensions; -using Orchard.Widgets.Models; -using Orchard.Widgets; namespace Orchard.Setup.Services { public class SetupService : ISetupService { @@ -79,31 +73,11 @@ namespace Orchard.Setup.Services { string[] hardcoded = { // Framework "Orchard.Framework", - // Core - "Common", - "Containers", - "Contents", - "Dashboard", - "Feeds", - "HomePage", - "Navigation", - "Reports", - "Routable", - "Scheduling", - "Settings", - "Shapes", - - "Orchard.Pages", - "Orchard.Widgets", - "Orchard.Themes", - "Orchard.Users", - "Orchard.Roles", - "Orchard.Modules", - "PackagingServices", - "Orchard.Packaging", - "Gallery", - "Orchard.Recipes" + "Common", "Containers", "Contents", "Dashboard", "Feeds", "HomePage", "Navigation", "Reports", "Routable", "Scheduling", "Settings", "Shapes", + // Modules + "Orchard.Pages", "Orchard.Widgets", "Orchard.Themes", "Orchard.Users", "Orchard.Roles", "Orchard.Modules", + "PackagingServices", "Orchard.Packaging", "Gallery", "Orchard.Recipes" }; context.EnabledFeatures = hardcoded; @@ -175,7 +149,6 @@ namespace Orchard.Setup.Services { while ( _processingEngine.AreTasksPending() ) _processingEngine.ExecuteNextTask(); - // creating a standalone environment. // in theory this environment can be used to resolve any normal components by interface, and those // components will exist entirely in isolation - no crossover between the safemode container currently in effect @@ -229,47 +202,6 @@ namespace Orchard.Setup.Services { var recipeManager = environment.Resolve(); executionId = recipeManager.Execute(Recipes().Where(r => r.Name == context.Recipe).FirstOrDefault()); - var contentManager = environment.Resolve(); - // If "Orchard.Widgets" is enabled, setup default layers and widgets - var extensionManager = environment.Resolve(); - var shellDescriptor = environment.Resolve(); - if (extensionManager.EnabledFeatures(shellDescriptor).Where(d => d.Id == "Orchard.Widgets").Any()) { - // Create default layers - var layerInitializer = environment.Resolve(); - layerInitializer.CreateDefaultLayers(); - - // add a layer for the homepage - var homepageLayer = contentManager.Create("Layer", VersionOptions.Draft); - homepageLayer.As().Name = "TheHomepage"; - homepageLayer.As().LayerRule = "url \"~/\""; - contentManager.Publish(homepageLayer); - - // and three more for the tripel...really need this elsewhere... - var tripelFirst = contentManager.Create("HtmlWidget", VersionOptions.Draft); - tripelFirst.As().LayerPart = homepageLayer.As(); - tripelFirst.As().Title = T("First Leader Aside").Text; - tripelFirst.As().Zone = "TripelFirst"; - tripelFirst.As().Position = "5"; - tripelFirst.As().Text = "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.

"; - contentManager.Publish(tripelFirst); - - var tripelSecond = contentManager.Create("HtmlWidget", VersionOptions.Draft); - tripelSecond.As().LayerPart = homepageLayer.As(); - tripelSecond.As().Title = T("Second Leader Aside").Text; - tripelSecond.As().Zone = "TripelSecond"; - tripelSecond.As().Position = "5"; - tripelSecond.As().Text = "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.

"; - contentManager.Publish(tripelSecond); - - var tripelThird = contentManager.Create("HtmlWidget", VersionOptions.Draft); - tripelThird.As().LayerPart = homepageLayer.As(); - tripelThird.As().Title = T("Third Leader Aside").Text; - tripelThird.As().Zone = "TripelThird"; - tripelThird.As().Position = "5"; - tripelThird.As().Text = "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.

"; - contentManager.Publish(tripelThird); - } - //null check: temporary fix for running setup in command line if (HttpContext.Current != null) { authenticationService.SignIn(user, true); diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Commands/LayerCommands.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Commands/LayerCommands.cs new file mode 100644 index 000000000..979e7ea0f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Commands/LayerCommands.cs @@ -0,0 +1,53 @@ +using System; +using Orchard.Commands; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Aspects; +using Orchard.Security; +using Orchard.Settings; +using Orchard.Widgets.Models; + +namespace Orchard.Widgets.Commands { + public class LayerCommands : DefaultOrchardCommandHandler { + private readonly IContentManager _contentManager; + private readonly ISiteService _siteService; + private readonly IMembershipService _membershipService; + + public LayerCommands(IContentManager contentManager, ISiteService siteService, IMembershipService membershipService) { + _contentManager = contentManager; + _siteService = siteService; + _membershipService = membershipService; + } + + [OrchardSwitch] + public string Name { get; set; } + + [OrchardSwitch] + public string LayerRule { get; set; } + + [OrchardSwitch] + public string Description { get; set; } + + [OrchardSwitch] + public string Owner { get; set; } + + [CommandName("layer create")] + [CommandHelp("layer create /Name: /LayerRule: [/Description:] [/Owner:]\r\n\t" + "Creates a new layer")] + [OrchardSwitches("Name,LayerRule,Description,Owner")] + public void Create() { + IContent layer = _contentManager.Create("Layer", t => { + t.Record.Name = Name; + t.Record.LayerRule = LayerRule; + t.Record.Description = Description ?? String.Empty; + }); + + _contentManager.Publish(layer.ContentItem); + if (String.IsNullOrEmpty(Owner)) { + Owner = _siteService.GetSiteSettings().SuperUser; + } + var owner = _membershipService.GetUser(Owner); + layer.As().Owner = owner; + + Context.Output.WriteLine(T("Layer created successfully.").Text); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Commands/WidgetCommands.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Commands/WidgetCommands.cs new file mode 100644 index 000000000..6efb70d27 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Commands/WidgetCommands.cs @@ -0,0 +1,86 @@ +using System; +using System.Linq; +using Orchard.Commands; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Aspects; +using Orchard.Core.Common.Models; +using Orchard.Security; +using Orchard.Settings; +using Orchard.Widgets.Models; +using Orchard.Widgets.Services; + +namespace Orchard.Widgets.Commands { + public class WidgetCommands : DefaultOrchardCommandHandler { + private readonly IWidgetsService _widgetsService; + private readonly ISiteService _siteService; + private readonly IMembershipService _membershipService; + private const string LoremIpsum = "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.

"; + + public WidgetCommands(IWidgetsService widgetsService, ISiteService siteService, IMembershipService membershipService) { + _widgetsService = widgetsService; + _siteService = siteService; + _membershipService = membershipService; + } + + [OrchardSwitch] + public string Type { get; set; } + + [OrchardSwitch] + public string Title { get; set; } + + [OrchardSwitch] + public string Zone { get; set; } + + [OrchardSwitch] + public string Position { get; set; } + + [OrchardSwitch] + public string Layer { get; set; } + + [OrchardSwitch] + public string Owner { get; set; } + + [OrchardSwitch] + public string Text { get; set; } + + [OrchardSwitch] + public bool UseLoremIpsumText { get; set; } + + [OrchardSwitch] + public bool Publish { get; set; } + + [CommandName("widget create")] + [CommandHelp("widget create /Type: /Title: /Zone:<zone> /Position:<position> /Layer:<layer> [/Owner:<owner>] [/Text:<text>] [/UseLoremIpsumText:true|false]\r\n\t" + "Creates a new html widget")] + [OrchardSwitches("Type,Title,Zone,Position,Layer,Owner,Text,UseLoremIpsumText")] + public void Create() { + var layer = GetLayer(Layer); + if (layer == null) { + throw new OrchardException(T("Creating widget failed : layer {0} was not found.", Layer)); + } + + var widget = _widgetsService.CreateWidget(layer.ContentItem.Id, Type, T(Title).Text, Position, Zone); + var text = String.Empty; + if (UseLoremIpsumText) { + text = T(LoremIpsum).Text; + } + else { + if (!String.IsNullOrEmpty(Text)) { + text = Text; + } + } + widget.As<BodyPart>().Text = text; + if (String.IsNullOrEmpty(Owner)) { + Owner = _siteService.GetSiteSettings().SuperUser; + } + var owner = _membershipService.GetUser(Owner); + widget.As<ICommonPart>().Owner = owner; + + Context.Output.WriteLine(T("Widget created successfully.").Text); + } + + private LayerPart GetLayer(string layer) { + var layers = _widgetsService.GetLayers(); + return layers.FirstOrDefault(layerPart => String.Equals(layerPart.Name, layer, StringComparison.OrdinalIgnoreCase)); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj index 5dbd984ae..6a9a1b83e 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj @@ -45,6 +45,8 @@ </ItemGroup> <ItemGroup> <Compile Include="AdminMenu.cs" /> + <Compile Include="Commands\LayerCommands.cs" /> + <Compile Include="Commands\WidgetCommands.cs" /> <Compile Include="Controllers\AdminController.cs" /> <Compile Include="Drivers\LayerPartDriver.cs" /> <Compile Include="Drivers\WidgetPartDriver.cs" />