Adding commands for creating layers and widgets.

Update recipe files.
Remove layer/widget creation code from setup.

--HG--
branch : recipe
This commit is contained in:
Suha Can
2011-02-19 13:59:59 -08:00
parent 1c7e805031
commit 9922d5e09a
8 changed files with 171 additions and 72 deletions

View File

@@ -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);

View File

@@ -44,7 +44,15 @@
<Command>
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
</Command>

View File

@@ -40,7 +40,15 @@
<Command>
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
</Command>

View File

@@ -40,7 +40,15 @@
<Command>
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
</Command>

View File

@@ -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<IRecipeManager>();
executionId = recipeManager.Execute(Recipes().Where(r => r.Name == context.Recipe).FirstOrDefault());
var contentManager = environment.Resolve<IContentManager>();
// If "Orchard.Widgets" is enabled, setup default layers and widgets
var extensionManager = environment.Resolve<IExtensionManager>();
var shellDescriptor = environment.Resolve<ShellDescriptor>();
if (extensionManager.EnabledFeatures(shellDescriptor).Where(d => d.Id == "Orchard.Widgets").Any()) {
// Create default layers
var layerInitializer = environment.Resolve<IDefaultLayersInitializer>();
layerInitializer.CreateDefaultLayers();
// add a layer for the homepage
var homepageLayer = contentManager.Create("Layer", VersionOptions.Draft);
homepageLayer.As<LayerPart>().Name = "TheHomepage";
homepageLayer.As<LayerPart>().LayerRule = "url \"~/\"";
contentManager.Publish(homepageLayer);
// and three more for the tripel...really need this elsewhere...
var tripelFirst = contentManager.Create("HtmlWidget", VersionOptions.Draft);
tripelFirst.As<WidgetPart>().LayerPart = homepageLayer.As<LayerPart>();
tripelFirst.As<WidgetPart>().Title = T("First Leader Aside").Text;
tripelFirst.As<WidgetPart>().Zone = "TripelFirst";
tripelFirst.As<WidgetPart>().Position = "5";
tripelFirst.As<BodyPart>().Text = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.</p>";
contentManager.Publish(tripelFirst);
var tripelSecond = contentManager.Create("HtmlWidget", VersionOptions.Draft);
tripelSecond.As<WidgetPart>().LayerPart = homepageLayer.As<LayerPart>();
tripelSecond.As<WidgetPart>().Title = T("Second Leader Aside").Text;
tripelSecond.As<WidgetPart>().Zone = "TripelSecond";
tripelSecond.As<WidgetPart>().Position = "5";
tripelSecond.As<BodyPart>().Text = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.</p>";
contentManager.Publish(tripelSecond);
var tripelThird = contentManager.Create("HtmlWidget", VersionOptions.Draft);
tripelThird.As<WidgetPart>().LayerPart = homepageLayer.As<LayerPart>();
tripelThird.As<WidgetPart>().Title = T("Third Leader Aside").Text;
tripelThird.As<WidgetPart>().Zone = "TripelThird";
tripelThird.As<WidgetPart>().Position = "5";
tripelThird.As<BodyPart>().Text = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.</p>";
contentManager.Publish(tripelThird);
}
//null check: temporary fix for running setup in command line
if (HttpContext.Current != null) {
authenticationService.SignIn(user, true);

View File

@@ -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:<name> /LayerRule:<rule> [/Description:<description>] [/Owner:<owner>]\r\n\t" + "Creates a new layer")]
[OrchardSwitches("Name,LayerRule,Description,Owner")]
public void Create() {
IContent layer = _contentManager.Create<LayerPart>("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<ICommonPart>().Owner = owner;
Context.Output.WriteLine(T("Layer created successfully.").Text);
}
}
}

View File

@@ -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 = "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur a nibh ut tortor dapibus vestibulum. Aliquam vel sem nibh. Suspendisse vel condimentum tellus.</p>";
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:<type> /Title:<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));
}
}
}

View File

@@ -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" />