diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogWidgetCommands.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogWidgetCommands.cs index af390fd45..32056996c 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogWidgetCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogWidgetCommands.cs @@ -1,36 +1,24 @@ using System; -using System.Linq; using Orchard.Blogs.Models; using Orchard.Blogs.Services; 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.Blogs.Commands { public class BlogWidgetCommands : DefaultOrchardCommandHandler { - private readonly IWidgetsService _widgetsService; + private readonly IWidgetCommandsService _widgetCommandsService; private readonly IBlogService _blogService; - private readonly ISiteService _siteService; - private readonly IMembershipService _membershipService; private readonly IContentManager _contentManager; private BlogPart blog; public BlogWidgetCommands( - IWidgetsService widgetsService, + IWidgetCommandsService widgetCommandsService, IBlogService blogService, - ISiteService siteService, - IMembershipService membershipService, IContentManager contentManager) { - _widgetsService = widgetsService; + _widgetCommandsService = widgetCommandsService; _blogService = blogService; - _siteService = siteService; - _membershipService = membershipService; _contentManager = contentManager; RenderTitle = true; @@ -75,11 +63,21 @@ namespace Orchard.Blogs.Commands { public void CreateRecentBlogPostsWidget() { var type = "RecentBlogPosts"; - var widget = CreateStandardWidget(type); + // Check any custom parameters that could cause creating the widget to fail. + blog = GetBlog(BlogId, BlogPath); + if (blog == null) { + Context.Output.WriteLine(T("Creating {0} widget failed: blog was not found.", type)); + return; + } + + // Create the widget using the standard parameters. + var widget = _widgetCommandsService.CreateBaseWidget( + Context, type, Title, Name, Zone, Position, Layer, Identity, RenderTitle, Owner, null, false, null); if (widget == null) { return; } + // Publish the successfully created widget. widget.As().BlogId = blog.Id; // Setting count to 0 means all posts. It's an optional parameter and defaults to 5. @@ -90,7 +88,8 @@ namespace Orchard.Blogs.Commands { } } - _contentManager.Publish(widget.ContentItem); + // Publish the successfully created widget. + _widgetCommandsService.Publish(widget); Context.Output.WriteLine(T("{0} widget created successfully.", type).Text); } @@ -100,64 +99,28 @@ namespace Orchard.Blogs.Commands { public void CreateBlogArchivesWidget() { var type = "BlogArchives"; - var widget = CreateStandardWidget(type); + // Check any custom parameters that could cause creating the widget to fail. + blog = GetBlog(BlogId, BlogPath); + if (blog == null) { + Context.Output.WriteLine(T("Creating {0} widget failed: blog was not found.", type)); + return; + } + + // Create the widget using the standard parameters. + var widget = _widgetCommandsService.CreateBaseWidget( + Context, type, Title, Name, Zone, Position, Layer, Identity, RenderTitle, Owner, null, false, null); if (widget == null) { return; } + // Set the custom parameters. widget.As().BlogId = blog.Id; - _contentManager.Publish(widget.ContentItem); + // Publish the successfully created widget. + _widgetCommandsService.Publish(widget); Context.Output.WriteLine(T("{0} widget created successfully.", type).Text); } - private WidgetPart CreateStandardWidget(string type) { - var widgetTypeNames = _widgetsService.GetWidgetTypeNames().ToList(); - if (!widgetTypeNames.Contains(type)) { - Context.Output.WriteLine(T("Creating widget failed: type {0} was not found. Supported widget types are: {1}.", - type, - string.Join(" ", widgetTypeNames))); - return null; - } - - var layer = GetLayer(Layer); - if (layer == null) { - Context.Output.WriteLine(T("Creating {0} widget failed: layer {1} was not found.", type, Layer)); - return null; - } - - blog = GetBlog(BlogId, BlogPath); - if (blog == null) { - Context.Output.WriteLine(T("Creating {0} widget failed: blog was not found.", type)); - return null; - } - - var widget = _widgetsService.CreateWidget(layer.ContentItem.Id, type, T(Title).Text, Position, Zone); - - if (!String.IsNullOrWhiteSpace(Name)) { - widget.Name = Name.Trim(); - } - - widget.RenderTitle = RenderTitle; - - if (String.IsNullOrEmpty(Owner)) { - Owner = _siteService.GetSiteSettings().SuperUser; - } - var owner = _membershipService.GetUser(Owner); - widget.As().Owner = owner; - - if (widget.Has() && !String.IsNullOrEmpty(Identity)) { - widget.As().Identifier = Identity; - } - - return widget; - } - - private LayerPart GetLayer(string layer) { - var layers = _widgetsService.GetLayers(); - return layers.FirstOrDefault(layerPart => String.Equals(layerPart.Name, layer, StringComparison.OrdinalIgnoreCase)); - } - private BlogPart GetBlog(int blogId, string blogPath) { return _contentManager.Get(blogId) ?? _blogService.Get(blogPath); } diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EmailFieldElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EmailFieldElementDriver.cs index d86b80a35..91c9da709 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EmailFieldElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EmailFieldElementDriver.cs @@ -77,9 +77,13 @@ namespace Orchard.DynamicForms.Drivers { } protected override void OnDisplaying(EmailField element, ElementDisplayingContext context) { - context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData()); - context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData(), new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); - context.ElementShape.ProcessedValue = element.RuntimeValue; + var tokenData = context.GetTokenData(); + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); + context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + + // Allow the initial value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + context.ElementShape.ProcessedValue = element.PostedValue != null ? element.PostedValue : _tokenizer.Replace(element.RuntimeValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EnumerationElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EnumerationElementDriver.cs index 3e8fb619b..3e67340ea 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EnumerationElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/EnumerationElementDriver.cs @@ -41,7 +41,13 @@ namespace Orchard.DynamicForms.Drivers { Id: "InputType", Name: "InputType", Title: "Input Type", - Description: T("The control to render when presenting the list of options."))); + Description: T("The control to render when presenting the list of options.")), + _DefaultValue: shape.Textbox( + Id: "DefaultValue", + Name: "DefaultValue", + Title: "Default Value", + Classes: new[] { "text", "large", "tokenized" }, + Description: T("The default value of this enumeration field."))); form._InputType.Items.Add(new SelectListItem { Text = T("Select List").Text, Value = "SelectList" }); form._InputType.Items.Add(new SelectListItem { Text = T("Multi Select List").Text, Value = "MultiSelectList" }); @@ -83,6 +89,13 @@ namespace Orchard.DynamicForms.Drivers { var displayType = context.DisplayType; var tokenData = context.GetTokenData(); + // Allow the initially selected value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + if (element.PostedValue == null) { + var defaultValue = _tokenizer.Replace(element.DefaultValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + element.RuntimeValue = defaultValue; + } + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); context.ElementShape.ProcessedOptions = _tokenizer.Replace(element.Options, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }).ToArray(); diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/HiddenFieldElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/HiddenFieldElementDriver.cs index 62448c847..20f44324b 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/HiddenFieldElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/HiddenFieldElementDriver.cs @@ -27,7 +27,7 @@ namespace Orchard.DynamicForms.Drivers { Id: "Value", Name: "Value", Title: "Value", - Classes: new[] { "text", "medium" }, + Classes: new[] { "text", "medium", "tokenized" }, Description: T("The value of this hidden field."))); return form; @@ -35,8 +35,12 @@ namespace Orchard.DynamicForms.Drivers { } protected override void OnDisplaying(HiddenField element, ElementDisplayingContext context) { - context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData()); - context.ElementShape.ProcessedValue = element.RuntimeValue ?? string.Empty; + var tokenData = context.GetTokenData(); + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); + + // Allow the initial value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + context.ElementShape.ProcessedValue = element.PostedValue != null ? element.PostedValue : _tokenizer.Replace(element.RuntimeValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); } } } diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/QueryElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/QueryElementDriver.cs index 3960c87cc..83399063e 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/QueryElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/QueryElementDriver.cs @@ -68,6 +68,12 @@ namespace Orchard.DynamicForms.Drivers { Value: "{Content.Id}", Description: T("Specify the expression to get the value of each option."), Classes: new[]{"text", "large", "tokenized"}), + _DefaultValue: shape.Textbox( + Id: "DefaultValue", + Name: "DefaultValue", + Title: "Default Value", + Classes: new[] { "text", "large", "tokenized" }, + Description: T("The default value of this query field.")), _InputType: shape.SelectList( Id: "InputType", Name: "InputType", @@ -122,6 +128,13 @@ namespace Orchard.DynamicForms.Drivers { var displayType = context.DisplayType; var tokenData = context.GetTokenData(); + // Allow the initially selected value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + if (element.PostedValue == null) { + var defaultValue = _tokenizer.Replace(element.DefaultValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + element.RuntimeValue = defaultValue; + } + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData); context.ElementShape.Options = GetOptions(element, context.DisplayType, queryId, tokenData).ToArray(); diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TaxonomyElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TaxonomyElementDriver.cs index 59c4b7b9f..7e2b10701 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TaxonomyElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TaxonomyElementDriver.cs @@ -67,6 +67,12 @@ namespace Orchard.DynamicForms.Drivers { Value: "{Content.Id}", Description: T("Specify the expression to get the value of each option."), Classes: new[] { "text", "large", "tokenized" }), + _DefaultValue: shape.Textbox( + Id: "DefaultValue", + Name: "DefaultValue", + Title: "Default Value", + Classes: new[] { "text", "large", "tokenized" }, + Description: T("The default value of this query field.")), _InputType: shape.SelectList( Id: "InputType", Name: "InputType", @@ -126,6 +132,13 @@ namespace Orchard.DynamicForms.Drivers { var displayType = context.DisplayType; var tokenData = context.GetTokenData(); + // Allow the initially selected value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + if (element.PostedValue == null) { + var defaultValue = _tokenizer.Replace(element.DefaultValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + element.RuntimeValue = defaultValue; + } + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); context.ElementShape.TermOptions = GetTermOptions(element, context.DisplayType, taxonomyId, tokenData).ToArray(); diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextAreaElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextAreaElementDriver.cs index dedebedae..3dc880b8a 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextAreaElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextAreaElementDriver.cs @@ -88,9 +88,13 @@ namespace Orchard.DynamicForms.Drivers { } protected override void OnDisplaying(TextArea element, ElementDisplayingContext context) { - context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData()); - context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData(), new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); - context.ElementShape.ProcessedValue = element.RuntimeValue; + var tokenData = context.GetTokenData(); + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); + context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + + // Allow the initial value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + context.ElementShape.ProcessedValue = element.PostedValue != null ? element.PostedValue : _tokenizer.Replace(element.RuntimeValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextFieldElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextFieldElementDriver.cs index 253ede4be..7176ad9b8 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextFieldElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/TextFieldElementDriver.cs @@ -83,9 +83,13 @@ namespace Orchard.DynamicForms.Drivers { } protected override void OnDisplaying(TextField element, ElementDisplayingContext context) { - context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData()); - context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData(), new ReplaceOptions {Encoding = ReplaceOptions.NoEncode}); - context.ElementShape.ProcessedValue = element.RuntimeValue; + var tokenData = context.GetTokenData(); + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); + context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + + // Allow the initial value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + context.ElementShape.ProcessedValue = element.PostedValue != null ? element.PostedValue : _tokenizer.Replace(element.RuntimeValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/UrlFieldElementDriver.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/UrlFieldElementDriver.cs index c6ddb4950..05ecc9c04 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/UrlFieldElementDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Drivers/UrlFieldElementDriver.cs @@ -71,9 +71,13 @@ namespace Orchard.DynamicForms.Drivers { } protected override void OnDisplaying(UrlField element, ElementDisplayingContext context) { - context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData()); - context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData(), new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); - context.ElementShape.ProcessedValue = element.RuntimeValue; + var tokenData = context.GetTokenData(); + context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData); + context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); + + // Allow the initial value to be tokenized. + // If a value was posted, use that value instead (without tokenizing it). + context.ElementShape.ProcessedValue = element.PostedValue != null ? element.PostedValue : _tokenizer.Replace(element.RuntimeValue, tokenData, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Enumeration.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Enumeration.cs index 93c400b08..7118464ba 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Enumeration.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Enumeration.cs @@ -20,6 +20,10 @@ namespace Orchard.DynamicForms.Elements { get { return _options.Value; } } + public string DefaultValue { + get { return this.Retrieve(x => x.DefaultValue); } + } + public IEnumerable RuntimeValues { get { return _runtimeValues.Value; } } diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Query.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Query.cs index 293c9e06a..200cf4556 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Query.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Query.cs @@ -27,6 +27,10 @@ namespace Orchard.DynamicForms.Elements { get { return this.Retrieve(x => x.ValueExpression, () => "{Content.Id}"); } } + public string DefaultValue { + get { return this.Retrieve(x => x.DefaultValue); } + } + public EnumerationValidationSettings ValidationSettings { get { return Data.GetModel(""); } } diff --git a/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Taxonomy.cs b/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Taxonomy.cs index 3da3359d5..b964df847 100644 --- a/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Taxonomy.cs +++ b/src/Orchard.Web/Modules/Orchard.DynamicForms/Elements/Taxonomy.cs @@ -34,6 +34,10 @@ namespace Orchard.DynamicForms.Elements { set { this.Store(x => x.ValueExpression, value); } } + public string DefaultValue { + get { return this.Retrieve(x => x.DefaultValue); } + } + public EnumerationValidationSettings ValidationSettings { get { return Data.GetModel(""); } } diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Commands/TagsWidgetCommands.cs b/src/Orchard.Web/Modules/Orchard.Tags/Commands/TagsWidgetCommands.cs index 0e9b79662..cf4085374 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Commands/TagsWidgetCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Commands/TagsWidgetCommands.cs @@ -1,31 +1,16 @@ 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.Tags.Models; -using Orchard.Widgets.Models; using Orchard.Widgets.Services; namespace Orchard.Tags.Commands { public class TagWidgetCommands : DefaultOrchardCommandHandler { - private readonly IWidgetsService _widgetsService; - private readonly ISiteService _siteService; - private readonly IMembershipService _membershipService; - private readonly IContentManager _contentManager; + private readonly IWidgetCommandsService _widgetCommandsService; public TagWidgetCommands( - IWidgetsService widgetsService, - ISiteService siteService, - IMembershipService membershipService, - IContentManager contentManager) { - _widgetsService = widgetsService; - _siteService = siteService; - _membershipService = membershipService; - _contentManager = contentManager; + IWidgetCommandsService widgetCommandsService) { + _widgetCommandsService = widgetCommandsService; RenderTitle = true; } @@ -66,34 +51,18 @@ namespace Orchard.Tags.Commands { public void CreateTagsCloudWidget() { var type = "TagCloud"; - var layer = GetLayer(Layer); - if (layer == null) { - Context.Output.WriteLine(T("Creating {0} widget failed: layer {1} was not found.", type, Layer)); - return; - } + // Check any custom parameters that could cause creating the widget to fail. + // Nothing to check in this widget, see BlogWidgetCommands.cs for an example. - var widget = _widgetsService.CreateWidget(layer.ContentItem.Id, type, T(Title).Text, Position, Zone); - - if (!String.IsNullOrWhiteSpace(Name)) { - widget.Name = Name.Trim(); - } - - widget.RenderTitle = RenderTitle; - - if (String.IsNullOrEmpty(Owner)) { - Owner = _siteService.GetSiteSettings().SuperUser; - } - var owner = _membershipService.GetUser(Owner); - widget.As().Owner = owner; - - if (widget.Has() && !String.IsNullOrEmpty(Identity)) { - widget.As().Identifier = Identity; - } + // Create the widget using the standard parameters. + var widget = _widgetCommandsService.CreateBaseWidget( + Context, type, Title, Name, Zone, Position, Layer, Identity, RenderTitle, Owner, null, false, null); if (widget == null) { return; } + // Set the custom parameters. widget.As().Slug = Slug; // It's an optional parameter and defaults to 5. @@ -104,13 +73,9 @@ namespace Orchard.Tags.Commands { } } - _contentManager.Publish(widget.ContentItem); + // Publish the successfully created widget. + _widgetCommandsService.Publish(widget); Context.Output.WriteLine(T("{0} widget created successfully.", type).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/Commands/WidgetCommands.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Commands/WidgetCommands.cs index 50d926bd1..66a611029 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Commands/WidgetCommands.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Commands/WidgetCommands.cs @@ -1,37 +1,13 @@ -using System; -using System.Linq; -using Orchard.Commands; -using Orchard.ContentManagement; -using Orchard.ContentManagement.Aspects; -using Orchard.Core.Common.Models; -using Orchard.Core.Navigation.Models; -using Orchard.Core.Navigation.Services; -using Orchard.Security; -using Orchard.Settings; -using Orchard.Widgets.Models; +using Orchard.Commands; 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 readonly IMenuService _menuService; - private readonly IContentManager _contentManager; - - 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.

"; + private readonly IWidgetCommandsService _widgetCommandsService; public WidgetCommands( - IWidgetsService widgetsService, - ISiteService siteService, - IMembershipService membershipService, - IMenuService menuService, - IContentManager contentManager) { - _widgetsService = widgetsService; - _siteService = siteService; - _membershipService = membershipService; - _menuService = menuService; - _contentManager = contentManager; + IWidgetCommandsService widgetCommandsService) { + _widgetCommandsService = widgetCommandsService; RenderTitle = true; } @@ -76,67 +52,15 @@ namespace Orchard.Widgets.Commands { [CommandHelp("widget create /Title: /Name:<name> /Zone:<zone> /Position:<position> /Layer:<layer> [/Identity:<identity>] [/RenderTitle:true|false] [/Owner:<owner>] [/Text:<text>] [/UseLoremIpsumText:true|false] [/MenuName:<name>]\r\n\t" + "Creates a new widget")] [OrchardSwitches("Title,Name,Zone,Position,Layer,Identity,Owner,Text,UseLoremIpsumText,MenuName,RenderTitle")] public void Create(string type) { - var widgetTypeNames = _widgetsService.GetWidgetTypeNames().ToList(); - if (!widgetTypeNames.Contains(type)) { - Context.Output.WriteLine(T("Creating widget failed : type {0} was not found. Supported widget types are: {1}.", - type, - string.Join(" ", widgetTypeNames))); + var widget = _widgetCommandsService.CreateBaseWidget( + Context, type, Title, Name, Zone, Position, Layer, Identity, RenderTitle, Owner, Text, UseLoremIpsumText, MenuName); + + if (widget == null) { return; } - var layer = GetLayer(Layer); - if (layer == null) { - Context.Output.WriteLine(T("Creating widget failed : layer {0} was not found.", Layer)); - return; - } - - var widget = _widgetsService.CreateWidget(layer.ContentItem.Id, type, T(Title).Text, Position, Zone); - - if (!String.IsNullOrWhiteSpace(Name)) { - widget.Name = Name.Trim(); - } - - var text = String.Empty; - if (widget.Has<BodyPart>()) { - if (UseLoremIpsumText) { - text = T(LoremIpsum).Text; - } - else { - if (!String.IsNullOrEmpty(Text)) { - text = Text; - } - } - widget.As<BodyPart>().Text = text; - } - - widget.RenderTitle = RenderTitle; - - if(widget.Has<MenuWidgetPart>() && !String.IsNullOrWhiteSpace(MenuName)) { - var menu = _menuService.GetMenu(MenuName); - - if(menu != null) { - widget.RenderTitle = false; - widget.As<MenuWidgetPart>().MenuContentItemId = menu.ContentItem.Id; - } - } - - if (String.IsNullOrEmpty(Owner)) { - Owner = _siteService.GetSiteSettings().SuperUser; - } - var owner = _membershipService.GetUser(Owner); - widget.As<ICommonPart>().Owner = owner; - - if (widget.Has<IdentityPart>() && !String.IsNullOrEmpty(Identity)) { - widget.As<IdentityPart>().Identifier = Identity; - } - - _contentManager.Publish(widget.ContentItem); + _widgetCommandsService.Publish(widget); 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 2068b356a..8b2f667a2 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Orchard.Widgets.csproj @@ -116,6 +116,7 @@ <Compile Include="Filters\WidgetFilter.cs" /> <Compile Include="ResourceManifest.cs" /> <Compile Include="Conditions\ContentDisplayedRuleProvider.cs" /> + <Compile Include="Services\IWidgetCommandsService.cs" /> <Compile Include="Services\RuleManager.cs" /> <Compile Include="Services\DefaultLayerEvaluationService.cs" /> <Compile Include="Services\ILayerEvaluationService.cs" /> @@ -124,6 +125,7 @@ <Compile Include="Services\IWidgetsService.cs" /> <Compile Include="Services\LayerResolverSelector.cs" /> <Compile Include="Services\RuleContext.cs" /> + <Compile Include="Services\WidgetCommandsService.cs" /> <Compile Include="Services\WidgetsService.cs" /> <Compile Include="Shapes.cs" /> <Compile Include="ViewModels\WidgetElementViewModel.cs" /> diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/IWidgetCommandsService.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IWidgetCommandsService.cs new file mode 100644 index 000000000..108c55ea9 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/IWidgetCommandsService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.Commands; +using Orchard.Widgets.Models; + +namespace Orchard.Widgets.Services { + public interface IWidgetCommandsService : IDependency { + WidgetPart CreateBaseWidget(CommandContext context, string type, string title, string name, string zone, string position, string layer, string identity, bool renderTitle, string owner, string text, bool useLoremIpsumText, string menuName); + void Publish(WidgetPart widget); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetCommandsService.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetCommandsService.cs new file mode 100644 index 000000000..4f57dc32b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Services/WidgetCommandsService.cs @@ -0,0 +1,106 @@ +using System; +using System.Linq; +using Orchard.Commands; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Aspects; +using Orchard.Core.Common.Models; +using Orchard.Core.Navigation.Models; +using Orchard.Core.Navigation.Services; +using Orchard.Localization; +using Orchard.Security; +using Orchard.Settings; +using Orchard.Widgets.Models; + +namespace Orchard.Widgets.Services { + public class WidgetCommandsService : IWidgetCommandsService { + private readonly IMenuService _menuService; + private readonly IWidgetsService _widgetsService; + private readonly ISiteService _siteService; + private readonly IMembershipService _membershipService; + private readonly IContentManager _contentManager; + + 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 WidgetCommandsService( + IWidgetsService widgetsService, + IMenuService menuService, + ISiteService siteService, + IMembershipService membershipService, + IContentManager contentManager) { + _siteService = siteService; + _membershipService = membershipService; + _widgetsService = widgetsService; + _menuService = menuService; + _contentManager = contentManager; + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + + public WidgetPart CreateBaseWidget(CommandContext context, string type, string title, string name, string zone, string position, string layer, string identity, bool renderTitle, string owner, string text, bool useLoremIpsumText, string menuName) { + var widgetTypeNames = _widgetsService.GetWidgetTypeNames().ToList(); + if (!widgetTypeNames.Contains(type)) { + context.Output.WriteLine(T("Creating widget failed : type {0} was not found. Supported widget types are: {1}.", + type, + string.Join(" ", widgetTypeNames))); + return null; + } + + var layerPart = GetLayer(layer); + if (layerPart == null) { + context.Output.WriteLine(T("Creating widget failed : layer {0} was not found.", layer)); + return null; + } + + var widget = _widgetsService.CreateWidget(layerPart.ContentItem.Id, type, T(title).Text, position, zone); + + if (!String.IsNullOrWhiteSpace(name)) { + widget.Name = name.Trim(); + } + + var widgetText = String.Empty; + if (widget.Has<BodyPart>()) { + if (useLoremIpsumText) { + widgetText = T(LoremIpsum).Text; + } + else { + if (!String.IsNullOrEmpty(text)) { + widgetText = text; + } + } + widget.As<BodyPart>().Text = text; + } + + widget.RenderTitle = renderTitle; + + if (widget.Has<MenuWidgetPart>() && !String.IsNullOrWhiteSpace(menuName)) { + var menu = _menuService.GetMenu(menuName); + + if (menu != null) { + widget.RenderTitle = false; + widget.As<MenuWidgetPart>().MenuContentItemId = menu.ContentItem.Id; + } + } + + if (String.IsNullOrEmpty(owner)) { + owner = _siteService.GetSiteSettings().SuperUser; + } + var widgetOwner = _membershipService.GetUser(owner); + widget.As<ICommonPart>().Owner = widgetOwner; + + if (widget.Has<IdentityPart>() && !String.IsNullOrEmpty(identity)) { + widget.As<IdentityPart>().Identifier = identity; + } + + return widget; + } + private LayerPart GetLayer(string layer) { + var layers = _widgetsService.GetLayers(); + return layers.FirstOrDefault(layerPart => String.Equals(layerPart.Name, layer, StringComparison.OrdinalIgnoreCase)); + } + + public void Publish(WidgetPart widget) { + _contentManager.Publish(widget.ContentItem); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Views/WidgetFiltersControl.cshtml b/src/Orchard.Web/Modules/Orchard.Widgets/Views/WidgetFiltersControl.cshtml index 5d6fdac18..3e54450a2 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Views/WidgetFiltersControl.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Views/WidgetFiltersControl.cshtml @@ -9,8 +9,8 @@ var returnUrl = Request.RawUrl; } <div id="widgets-layers-control" class="widgets-container"> - @if (layers.Any()) { - using (Html.BeginForm("index", "admin", FormMethod.Get, new { area = "Orchard.Widgets" })) { + @using (Html.BeginForm("index", "admin", FormMethod.Get, new { area = "Orchard.Widgets" })) { + if (layers.Any()) { <fieldset class="bulk-actions-auto"> <label for="layerId">@T("Current Layer:")</label> <select id="layerId" name="layerId"> @@ -22,23 +22,20 @@ @Html.Link(T("Edit").Text, Url.Action("EditLayer", "Admin", new { area = "Orchard.Widgets", id = Model.CurrentLayer.Id, returnUrl }), new { @class = "button" }) </fieldset> } - } - <div id="widgets-layer-add"> - @Html.Link(T("Add a new layer...").Text, Url.Action("AddLayer", "Admin", new { area = "Orchard.Widgets", returnUrl })) - </div> - - @if (cultures.Count() > 1) { - using (Html.BeginForm("index", "admin", FormMethod.Get, new { area = "Orchard.Widgets" })) { - <fieldset class="bulk-actions-auto"> - <label for="culture">@T("Current Culture:")</label> - <select id="culture" name="culture"> - @Html.SelectOption((string)Model.CurrentCulture, "", T("any (show all)").ToString()) - @foreach (var culture in cultures) { - @Html.SelectOption((string)Model.CurrentCulture, (string)culture, System.Globalization.CultureInfo.GetCultureInfo(culture).DisplayName) - } - </select> - <button type="submit" class="apply-bulk-actions-auto">@T("Show")</button> - </fieldset> + <div id="widgets-layer-add"> + @Html.Link(T("Add a new layer...").Text, Url.Action("AddLayer", "Admin", new { area = "Orchard.Widgets", returnUrl })) + </div> + if (cultures.Count() > 1) { + <fieldset class="bulk-actions-auto"> + <label for="culture">@T("Current Culture:")</label> + <select id="culture" name="culture"> + @Html.SelectOption((string)Model.CurrentCulture, "", T("any (show all)").ToString()) + @foreach (var culture in cultures) { + @Html.SelectOption((string)Model.CurrentCulture, (string)culture, System.Globalization.CultureInfo.GetCultureInfo(culture).DisplayName) + } + </select> + <button type="submit" class="apply-bulk-actions-auto">@T("Show")</button> + </fieldset> } } diff --git a/src/Orchard.Web/Modules/TinyMce/Module.txt b/src/Orchard.Web/Modules/TinyMce/Module.txt index 2214a0e3a..7c31538f8 100644 --- a/src/Orchard.Web/Modules/TinyMce/Module.txt +++ b/src/Orchard.Web/Modules/TinyMce/Module.txt @@ -6,5 +6,5 @@ Version: 1.10.1 OrchardVersion: 1.9 Description: The TinyMCE module enables rich text contents to be created using a "What You See Is What You Get" user interface. FeatureDescription: TinyMCE HTML WYSIWYG editor. -FeatureDependencies: Orchard.Resources +Dependencies: Orchard.Resources Category: Input Editor diff --git a/src/Orchard/Events/EventsInterceptor.cs b/src/Orchard/Events/EventsInterceptor.cs index 45497f9d0..21e9e3ec9 100644 --- a/src/Orchard/Events/EventsInterceptor.cs +++ b/src/Orchard/Events/EventsInterceptor.cs @@ -39,18 +39,23 @@ namespace Orchard.Events { // static IEnumerable<T> IEnumerable.OfType<T>(this IEnumerable source) // where T is from returnType's IEnumerable<T> var enumerableOfTypeT = _enumerableOfTypeTDictionary.GetOrAdd( returnType, type => typeof(Enumerable).GetGenericMethod("OfType", type.GetGenericArguments(), new[] { typeof(IEnumerable) }, typeof(IEnumerable<>))); - return enumerableOfTypeT.Invoke(null, new[] { results }); + return (enumerableOfTypeT != null) ? enumerableOfTypeT.Invoke(null, new[] { results }) : null; + } } public static class Extensions { public static MethodInfo GetGenericMethod(this Type t, string name, Type[] genericArgTypes, Type[] argTypes, Type returnType) { - return (from m in t.GetMethods(BindingFlags.Public | BindingFlags.Static) - where m.Name == name && - m.GetGenericArguments().Length == genericArgTypes.Length && - m.GetParameters().Select(pi => pi.ParameterType).SequenceEqual(argTypes) && - (m.ReturnType.IsGenericType && !m.ReturnType.IsGenericTypeDefinition ? returnType.GetGenericTypeDefinition() : m.ReturnType) == returnType - select m).Single().MakeGenericMethod(genericArgTypes); + var method = (from m in t.GetMethods(BindingFlags.Public | BindingFlags.Static) + where m.Name == name && + m.GetGenericArguments().Length == genericArgTypes.Length && + m.GetParameters().Select(pi => pi.ParameterType).SequenceEqual(argTypes) && + (m.ReturnType.IsGenericType && !m.ReturnType.IsGenericTypeDefinition ? returnType.GetGenericTypeDefinition() : m.ReturnType) == returnType + select m).SingleOrDefault(); + if (method != null) { + return method.MakeGenericMethod(genericArgTypes); + } + return null; } }