#5407: Layout elements now evaluate tokens.

This commit is contained in:
Sipke Schoorstra
2015-06-29 14:01:58 +03:00
parent e10ba8126a
commit 5b40567b6d
73 changed files with 406 additions and 217 deletions

View File

@@ -6,6 +6,7 @@ using Orchard.DynamicForms.Services;
using Orchard.Layouts.Services;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Tokens;
using Orchard.UI.Notify;
using IController = Orchard.DynamicForms.Services.IController;
@@ -14,15 +15,18 @@ namespace Orchard.DynamicForms.Controllers {
private readonly INotifier _notifier;
private readonly ILayoutManager _layoutManager;
private readonly IFormService _formService;
private readonly ITokenizer _tokenizer;
public FormController(
INotifier notifier,
ILayoutManager layoutManager,
IFormService formService) {
IFormService formService,
ITokenizer tokenizer) {
_notifier = notifier;
_layoutManager = layoutManager;
_formService = formService;
_tokenizer = tokenizer;
T = NullLocalizer.Instance;
Logger = NullLogger.Instance;
}
@@ -34,7 +38,7 @@ namespace Orchard.DynamicForms.Controllers {
public ActionResult Submit(int contentId, string formName) {
var layoutPart = _layoutManager.GetLayout(contentId);
var form = _formService.FindForm(layoutPart, formName);
var urlReferrer = Request.UrlReferrer != null ? Request.UrlReferrer.ToString() : "~/";
var urlReferrer = Request.UrlReferrer != null && Url.IsLocalUrl(Request.UrlReferrer.ToString()) ? Request.UrlReferrer.ToString() : "~/";
if (form == null) {
Logger.Warning("The specified form \"{0}\" could not be found.", formName);
@@ -42,7 +46,7 @@ namespace Orchard.DynamicForms.Controllers {
return Redirect(urlReferrer);
}
var values = _formService.SubmitForm(form, ValueProvider, ModelState, this);
var values = _formService.SubmitForm(layoutPart, form, ValueProvider, ModelState, this);
this.TransferFormSubmission(form, values);
if (!ModelState.IsValid)
@@ -51,7 +55,7 @@ namespace Orchard.DynamicForms.Controllers {
if(Response.IsRequestBeingRedirected)
return new EmptyResult();
var redirectUrl = !String.IsNullOrWhiteSpace(form.RedirectUrl) ? form.RedirectUrl : urlReferrer;
var redirectUrl = !String.IsNullOrWhiteSpace(form.RedirectUrl) ? _tokenizer.Replace(form.RedirectUrl, new { Content = layoutPart.ContentItem }) : urlReferrer;
return Redirect(redirectUrl);
}

View File

@@ -1,11 +1,19 @@
using System.Collections.Generic;
using Orchard.DynamicForms.Elements;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class ButtonElementDriver : FormsElementDriver<Button> {
public ButtonElementDriver(IFormManager formManager) : base(formManager) { }
private readonly ITokenizer _tokenizer;
public ButtonElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}
protected override IEnumerable<string> FormNames {
get { yield return "Button"; }
@@ -21,11 +29,16 @@ namespace Orchard.DynamicForms.Drivers {
Name: "Text",
Title: "Text",
Value: "Submit",
Classes: new[] { "text", "medium" },
Classes: new[] { "text", "medium", "tokenized" },
Description: T("The button text.")));
return form;
});
}
protected override void OnDisplaying(Button element, ElementDisplayContext context) {
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedText = _tokenizer.Replace(element.Text, context.GetTokenData());
}
}
}

View File

@@ -2,6 +2,7 @@
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
@@ -65,7 +66,9 @@ namespace Orchard.DynamicForms.Drivers {
}
protected override void OnDisplaying(CheckBox element, ElementDisplayContext context) {
context.ElementShape.TokenizedValue = _tokenizer.Replace(element.RuntimeValue, null);
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData());
context.ElementShape.ProcessedValue = _tokenizer.Replace(element.RuntimeValue, context.GetTokenData());
}
}
}

View File

@@ -2,6 +2,7 @@
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
@@ -76,7 +77,9 @@ namespace Orchard.DynamicForms.Drivers {
}
protected override void OnDisplaying(EmailField element, ElementDisplayContext context) {
context.ElementShape.TokenizedValue = _tokenizer.Replace(element.RuntimeValue, null);
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData());
context.ElementShape.ProcessedValue = _tokenizer.Replace(element.RuntimeValue, context.GetTokenData());
}
}
}

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Orchard.DynamicForms.Elements;
@@ -7,8 +6,8 @@ using Orchard.DynamicForms.Helpers;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using Orchard.Utility.Extensions;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
@@ -80,11 +79,13 @@ namespace Orchard.DynamicForms.Drivers {
}
protected override void OnDisplaying(Enumeration element, ElementDisplayContext context) {
var tokenizedOptions = _tokenizer.Replace(element.Options).ToArray();
var typeName = element.GetType().Name;
var displayType = context.DisplayType;
var tokenData = context.GetTokenData();
context.ElementShape.TokenizedOptions = tokenizedOptions;
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData);
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData);
context.ElementShape.ProcessedOptions = _tokenizer.Replace(element.Options, tokenData).ToArray();
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}__{1}", typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}_{1}__{2}", typeName, displayType, element.InputType));
}

View File

@@ -1,7 +1,19 @@
using Orchard.DynamicForms.Elements;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
namespace Orchard.DynamicForms.Drivers {
public class FieldsetElementDriver : ElementDriver<Fieldset> {
private readonly ITokenizer _tokenizer;
public FieldsetElementDriver(ITokenizer tokenizer) {
_tokenizer = tokenizer;
}
protected override void OnDisplaying(Fieldset element, ElementDisplayContext context) {
context.ElementShape.ProcessedLegend = _tokenizer.Replace(element.Legend, context.GetTokenData());
}
}
}

View File

@@ -10,9 +10,10 @@ using Orchard.DynamicForms.Services;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Framework.Elements;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Services;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class FormElementDriver : FormsElementDriver<Form> {
@@ -20,19 +21,22 @@ namespace Orchard.DynamicForms.Drivers {
private readonly IFormService _formService;
private readonly ICurrentControllerAccessor _currentControllerAccessor;
private readonly ICultureAccessor _cultureAccessor;
private readonly ITokenizer _tokenizer;
public FormElementDriver(
IFormManager formManager,
IContentDefinitionManager contentDefinitionManager,
IFormService formService,
ICurrentControllerAccessor currentControllerAccessor,
ICultureAccessor cultureAccessor)
ICultureAccessor cultureAccessor,
ITokenizer tokenizer)
: base(formManager) {
_contentDefinitionManager = contentDefinitionManager;
_formService = formService;
_currentControllerAccessor = currentControllerAccessor;
_cultureAccessor = cultureAccessor;
_tokenizer = tokenizer;
}
protected override IEnumerable<string> FormNames {
@@ -145,6 +149,10 @@ namespace Orchard.DynamicForms.Drivers {
foreach (var child in element.Elements.Flatten().Where(x => x is FormElement).Cast<FormElement>()) {
child.FormBindingContentType = element.CreateContent == true ? element.FormBindingContentType : default(string);
}
// Set tokenized properties.
var tokenData = context.GetTokenData();
context.ElementShape.ProcessedAction = _tokenizer.Replace(element.Action, tokenData);
}
private static bool IsFormBindingContentType(ContentTypeDefinition contentTypeDefinition) {

View File

@@ -3,6 +3,7 @@ using Orchard.DynamicForms.Elements;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
@@ -34,7 +35,8 @@ namespace Orchard.DynamicForms.Drivers {
}
protected override void OnDisplaying(HiddenField element, ElementDisplayContext context) {
context.ElementShape.TokenizedValue = _tokenizer.Replace(element.Value, null);
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedValue = _tokenizer.Replace(element.Value, context.GetTokenData());
}
}
}

View File

@@ -1,11 +1,19 @@
using System.Collections.Generic;
using Orchard.DynamicForms.Elements;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class LabelElementDriver : FormsElementDriver<Label> {
public LabelElementDriver(IFormManager formManager) : base(formManager) {}
private readonly ITokenizer _tokenizer;
public LabelElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}
protected override IEnumerable<string> FormNames {
get { yield return "Label"; }
@@ -20,17 +28,22 @@ namespace Orchard.DynamicForms.Drivers {
Id: "LabelText",
Name: "LabelText",
Title: "Text",
Classes: new[] { "text", "large" },
Classes: new[] { "text", "large", "tokenized" },
Description: T("The label text.")),
_LabelFor: shape.Textbox(
Id: "LabelFor",
Name: "LabelFor",
Title: "For",
Classes: new[] { "text", "large" },
Classes: new[] { "text", "large", "tokenized" },
Description: T("The name of the field this label is for.")));
return form;
});
}
protected override void OnDisplaying(Label element, ElementDisplayContext context) {
context.ElementShape.ProcessedText = _tokenizer.Replace(element.Text, context.GetTokenData());
context.ElementShape.ProcessedFor = _tokenizer.Replace(element.For, context.GetTokenData());
}
}
}

View File

@@ -1,11 +1,18 @@
using Orchard.DynamicForms.Elements;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class PasswordFieldElementDriver : FormsElementDriver<PasswordField>{
public PasswordFieldElementDriver(IFormManager formManager) : base(formManager) {}
private readonly ITokenizer _tokenizer;
public PasswordFieldElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}
protected override EditorResult OnBuildEditor(PasswordField element, ElementEditorContext context) {
var autoLabelEditor = BuildForm(context, "AutoLabel");
@@ -65,5 +72,10 @@ namespace Orchard.DynamicForms.Drivers {
return form;
});
}
protected override void OnDisplaying(PasswordField element, ElementDisplayContext context) {
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData());
}
}
}

View File

@@ -6,10 +6,12 @@ using System.Web.Mvc;
using Orchard.ContentManagement;
using Orchard.Core.Title.Models;
using Orchard.DynamicForms.Elements;
using Orchard.DynamicForms.Helpers;
using Orchard.Environment.Extensions;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Projections.Models;
using Orchard.Projections.Services;
using Orchard.Tokens;
@@ -119,19 +121,21 @@ namespace Orchard.DynamicForms.Drivers {
protected override void OnDisplaying(Query element, ElementDisplayContext context) {
var queryId = element.QueryId;
var typeName = element.GetType().Name;
var category = element.Category.ToSafeName();
var displayType = context.DisplayType;
var tokenData = context.GetTokenData();
context.ElementShape.Options = GetOptions(element, queryId).ToArray();
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();
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}__{1}", typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}_{1}__{2}", typeName, displayType, element.InputType));
}
private IEnumerable<SelectListItem> GetOptions(Query element, int? queryId) {
private IEnumerable<SelectListItem> GetOptions(Query element, string displayType, int? queryId, IDictionary<string, object> tokenData) {
var optionLabel = element.OptionLabel;
if (!String.IsNullOrWhiteSpace(optionLabel)) {
yield return new SelectListItem { Text = optionLabel };
yield return new SelectListItem { Text = displayType != "Design" ? _tokenizer.Replace(optionLabel, tokenData) : optionLabel };
}
if (queryId == null)

View File

@@ -3,6 +3,7 @@ using Orchard.DynamicForms.Elements;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
@@ -40,7 +41,9 @@ namespace Orchard.DynamicForms.Drivers {
}
protected override void OnDisplaying(RadioButton element, ElementDisplayContext context) {
context.ElementShape.TokenizedValue = _tokenizer.Replace(element.Value, null);
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData());
context.ElementShape.ProcessedValue = _tokenizer.Replace(element.Value, context.GetTokenData());
}
}
}

View File

@@ -5,14 +5,19 @@ using Orchard.Environment.Extensions;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
[OrchardFeature("Orchard.DynamicForms.AntiSpam")]
public class ReCaptchaElementDriver : FormsElementDriver<ReCaptcha>{
private readonly IOrchardServices _services;
private readonly ITokenizer _tokenizer;
public ReCaptchaElementDriver(IFormManager formManager, IOrchardServices services) : base(formManager) {
public ReCaptchaElementDriver(IFormManager formManager, IOrchardServices services, ITokenizer tokenizer) : base(formManager) {
_services = services;
_tokenizer = tokenizer;
}
protected override EditorResult OnBuildEditor(ReCaptcha element, ElementEditorContext context) {
@@ -51,6 +56,7 @@ namespace Orchard.DynamicForms.Drivers {
return;
}
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.PublicKey = settings.PublicKey;
}
}

View File

@@ -8,9 +8,9 @@ using Orchard.Environment.Extensions;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Taxonomies.Services;
using Orchard.Tokens;
using Orchard.Utility.Extensions;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
@@ -124,17 +124,20 @@ namespace Orchard.DynamicForms.Drivers {
var taxonomyId = element.TaxonomyId;
var typeName = element.GetType().Name;
var displayType = context.DisplayType;
var tokenData = context.GetTokenData();
context.ElementShape.TermOptions = GetTermOptions(element, taxonomyId).ToArray();
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, tokenData);
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, tokenData);
context.ElementShape.TermOptions = GetTermOptions(element, context.DisplayType, taxonomyId, tokenData).ToArray();
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}__{1}", typeName, element.InputType));
context.ElementShape.Metadata.Alternates.Add(String.Format("Elements_{0}_{1}__{2}", typeName, displayType, element.InputType));
}
private IEnumerable<SelectListItem> GetTermOptions(Taxonomy element, int? taxonomyId) {
private IEnumerable<SelectListItem> GetTermOptions(Taxonomy element, string displayType, int? taxonomyId, IDictionary<string, object> tokenData) {
var optionLabel = element.OptionLabel;
if (!String.IsNullOrWhiteSpace(optionLabel)) {
yield return new SelectListItem { Text = optionLabel };
yield return new SelectListItem { Text = displayType != "Design" ? _tokenizer.Replace(optionLabel, tokenData) : optionLabel };
}
if (taxonomyId == null)

View File

@@ -3,6 +3,7 @@ using Orchard.DynamicForms.Elements;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
@@ -88,7 +89,9 @@ namespace Orchard.DynamicForms.Drivers {
}
protected override void OnDisplaying(TextArea element, ElementDisplayContext context) {
context.ElementShape.TokenizedValue = _tokenizer.Replace(element.RuntimeValue, null);
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData());
context.ElementShape.ProcessedValue = _tokenizer.Replace(element.RuntimeValue, context.GetTokenData());
}
}
}

View File

@@ -2,6 +2,7 @@
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
@@ -50,13 +51,13 @@ namespace Orchard.DynamicForms.Drivers {
Id: "MinimumLength",
Name: "MinimumLength",
Title: "Minimum Length",
Classes: new[] { "text", "medium", "tokenized" },
Classes: new[] { "text", "medium" },
Description: T("The minimum length required.")),
_MaximumLength: shape.Textbox(
Id: "MaximumLength",
Name: "MaximumLength",
Title: "Maximum Length",
Classes: new[] { "text", "medium", "tokenized" },
Classes: new[] { "text", "medium" },
Description: T("The maximum length allowed.")),
_CustomValidationMessage: shape.Textbox(
Id: "CustomValidationMessage",
@@ -76,7 +77,9 @@ namespace Orchard.DynamicForms.Drivers {
}
protected override void OnDisplaying(TextField element, ElementDisplayContext context) {
context.ElementShape.TokenizedValue = _tokenizer.Replace(element.RuntimeValue, null);
context.ElementShape.ProcessedName = _tokenizer.Replace(element.Name, context.GetTokenData());
context.ElementShape.ProcessedLabel = _tokenizer.Replace(element.Label, context.GetTokenData());
context.ElementShape.ProcessedValue = _tokenizer.Replace(element.RuntimeValue, context.GetTokenData());
}
}
}

View File

@@ -1,11 +1,19 @@
using System.Collections.Generic;
using Orchard.DynamicForms.Elements;
using Orchard.Forms.Services;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Tokens;
using DescribeContext = Orchard.Forms.Services.DescribeContext;
namespace Orchard.DynamicForms.Drivers {
public class ValidationMessageElementDriver : FormsElementDriver<ValidationMessage> {
public ValidationMessageElementDriver(IFormManager formManager) : base(formManager) {}
private readonly ITokenizer _tokenizer;
public ValidationMessageElementDriver(IFormManager formManager, ITokenizer tokenizer) : base(formManager) {
_tokenizer = tokenizer;
}
protected override IEnumerable<string> FormNames {
get { yield return "ValidationMessage"; }
@@ -20,11 +28,15 @@ namespace Orchard.DynamicForms.Drivers {
Id: "For",
Name: "For",
Title: "For",
Classes: new[] { "text", "large" },
Classes: new[] { "text", "large", "tokenized" },
Description: T("The name of the field this validation message is for.")));
return form;
});
}
protected override void OnDisplaying(ValidationMessage element, ElementDisplayContext context) {
context.ElementShape.ProcessedFor = _tokenizer.Replace(element.For, context.GetTokenData());
}
}
}

View File

@@ -34,7 +34,7 @@ namespace Orchard.DynamicForms.Handlers {
FieldName = element.Name
};
if (element.Form != null && element.Form.EnableClientValidation == true) {
if (element.Form != null && element.Form.EnableClientValidation == true) {
_formService.RegisterClientValidationAttributes(element, registrationContext);
if (registrationContext.ClientAttributes.Any()) {

View File

@@ -35,9 +35,10 @@ namespace Orchard.DynamicForms.Handlers {
ModelState = context.ModelState,
PostedValues = values
};
var tokensData = new Dictionary<string, object>(formValuesDictionary) {
var tokenData = new Dictionary<string, object>(formValuesDictionary) {
{"Updater", context.Updater},
{"FormSubmission", formTokenContext},
{"Content", context.Content }
};
// Store the submission.
@@ -53,10 +54,10 @@ namespace Orchard.DynamicForms.Handlers {
// Notifiy.
if (!String.IsNullOrWhiteSpace(form.Notification))
_notifier.Information(T(_tokenizer.Replace(T(form.Notification).Text, tokensData)));
_notifier.Information(T(_tokenizer.Replace(T(form.Notification).Text, tokenData)));
// Trigger workflow event.
_workflowManager.TriggerEvent(DynamicFormSubmittedActivity.EventName, contentItem, () => tokensData);
_workflowManager.TriggerEvent(DynamicFormSubmittedActivity.EventName, contentItem, () => tokenData);
}
}
}

View File

@@ -5,9 +5,9 @@ using Orchard.Tokens;
namespace Orchard.DynamicForms.Helpers {
public static class TokenizerExtensions {
public static IEnumerable<SelectListItem> Replace(this ITokenizer tokenizer, IEnumerable<SelectListItem> items) {
public static IEnumerable<SelectListItem> Replace(this ITokenizer tokenizer, IEnumerable<SelectListItem> items, IDictionary<string, object> data) {
return items.Select(item => new SelectListItem {
Text = tokenizer.Replace(item.Text, null),
Text = tokenizer.Replace(item.Text, data),
Value = item.Value,
Disabled = item.Disabled,
Group = item.Group,

View File

@@ -513,6 +513,12 @@
<ItemGroup>
<Content Include="package.json" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Elements\Button.Design.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Elements\Label.Design.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@@ -77,10 +77,11 @@ namespace Orchard.DynamicForms.Services {
return GetFormElements(form).Select(x => x.Name).Where(x => !String.IsNullOrWhiteSpace(x)).Distinct();
}
public NameValueCollection SubmitForm(Form form, IValueProvider valueProvider, ModelStateDictionary modelState, IUpdateModel updater) {
public NameValueCollection SubmitForm(IContent content, Form form, IValueProvider valueProvider, ModelStateDictionary modelState, IUpdateModel updater) {
var values = ReadElementValues(form, valueProvider);
_formEventHandler.Submitted(new FormSubmittedEventContext {
Content = content,
Form = form,
FormService = this,
ValueProvider = valueProvider,
@@ -89,6 +90,7 @@ namespace Orchard.DynamicForms.Services {
});
_formEventHandler.Validating(new FormValidatingEventContext {
Content = content,
Form = form,
FormService = this,
Values = values,
@@ -98,6 +100,7 @@ namespace Orchard.DynamicForms.Services {
});
_formEventHandler.Validated(new FormValidatedEventContext {
Content = content,
Form = form,
FormService = this,
Values = values,

View File

@@ -15,7 +15,7 @@ namespace Orchard.DynamicForms.Services {
Form FindForm(LayoutPart layoutPart, string formName = null);
IEnumerable<FormElement> GetFormElements(Form form);
IEnumerable<string> GetFormElementNames(Form form);
NameValueCollection SubmitForm(Form form, IValueProvider valueProvider, ModelStateDictionary modelState, IUpdateModel updater);
NameValueCollection SubmitForm(IContent content, Form form, IValueProvider valueProvider, ModelStateDictionary modelState, IUpdateModel updater);
Submission CreateSubmission(string formName, NameValueCollection values);
Submission CreateSubmission(Submission submission);
Submission GetSubmission(int id);

View File

@@ -5,6 +5,7 @@ using Orchard.DynamicForms.Elements;
namespace Orchard.DynamicForms.Services.Models {
public class FormEventContext {
public IContent Content { get; set; }
public Form Form { get; set; }
public NameValueCollection Values { get; set; }
public IFormService FormService { get; set; }

View File

@@ -0,0 +1,11 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@{
var element = (Button)Model.Element;
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "button");
tagBuilder.Attributes["type"] = "submit";
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.SetInnerText(element.Text);
}
@tagBuilder.ToHtmlString()

View File

@@ -1,11 +1,9 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Helpers
@{
var element = (Button)Model.Element;
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "button");
tagBuilder.Attributes["type"] = "submit";
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.SetInnerText(element.Text);
tagBuilder.Attributes["name"] = Model.ProcessedName;
tagBuilder.SetInnerText(Model.ProcessedText);
}
@tagBuilder.ToHtmlString()

View File

@@ -6,8 +6,8 @@
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.CreateElementTagBuilder(Model, "input");
tagBuilder.Attributes["type"] = "checkbox";
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.Attributes["value"] = Model.TokenizedValue;
tagBuilder.Attributes["name"] = Model.ProcessedName;
tagBuilder.Attributes["value"] = Model.ProcessedValue;
tagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
if (!String.IsNullOrWhiteSpace(element.PostedValue)) {
@@ -17,12 +17,12 @@
@if (element.ShowLabel) {
<label>
@tagBuilder.ToHtmlString(TagRenderMode.SelfClosing)
@Html.Raw(element.Label)
@Html.Raw(Model.ProcessedLabel)
</label>
}
else {
@tagBuilder.ToHtmlString(TagRenderMode.SelfClosing)
}
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage((string)Model.ProcessedName)
}

View File

@@ -7,19 +7,19 @@
tagBuilder.AddCssClass("text");
tagBuilder.Attributes["type"] = "email";
tagBuilder.Attributes["value"] = Model.TokenizedValue;
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.Attributes["value"] = Model.ProcessedValue;
tagBuilder.Attributes["name"] = Model.ProcessedName;
tagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
if (!ViewData.ModelState.IsValidField(element.Name)) {
if (!ViewData.ModelState.IsValidField(Model.ProcessedName)) {
tagBuilder.AddCssClass("input-validation-error");
}
}
@if (element.ShowLabel) {
<label for="@element.HtmlId">@element.Label</label>
<label for="@element.HtmlId">@Model.ProcessedLabel</label>
}
@tagBuilder.ToHtmlString(TagRenderMode.SelfClosing)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage((string)Model.ProcessedName)
}

View File

@@ -8,7 +8,7 @@
<label>@Html.Raw(element.Label)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.TokenizedOptions) {
@foreach (var option in element.Options) {
<li>
<label>
<input type="checkbox" name="@element.Name" value="@option.Value" />

View File

@@ -7,13 +7,13 @@
var index = 0;
}
@if (element.ShowLabel) {
<label>@Html.Raw(element.Label)</label>
<label>@Html.Raw(Model.ProcessedLabel)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.TokenizedOptions) {
@foreach (var option in Model.ProcessedOptions) {
var inputTagBuilder = new OrchardTagBuilder("input");
inputTagBuilder.Attributes["type"] = "checkbox";
inputTagBuilder.Attributes["name"] = element.Name;
inputTagBuilder.Attributes["name"] = Model.ProcessedName;
inputTagBuilder.Attributes["value"] = option.Value;
if (element.ValidationSettings.Required == true && index == 0) {
inputTagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
@@ -28,5 +28,5 @@
}
@tagBuilder.EndElement
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage((string)Model.ProcessedName)
}

View File

@@ -4,7 +4,7 @@
var element = (Enumeration)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "MultiSelectList1" : element.Name;
var options = (IEnumerable<SelectListItem>)Model.TokenizedOptions;
var options = element.Options;
}
@if (element.ShowLabel) {
<label for="@element.HtmlId">@Html.Raw(element.Label)</label>

View File

@@ -3,8 +3,8 @@
@{
var element = (Enumeration)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "MultiSelectList1" : element.Name;
var options = (IEnumerable<SelectListItem>)Model.TokenizedOptions;
var name = (string)(String.IsNullOrWhiteSpace(Model.ProcessedName) ? "MultiSelectList1" : Model.ProcessedName);
var options = (IEnumerable<SelectListItem>)Model.ProcessedOptions;
var clientValidationAttributes = (IDictionary<string, string>)Model.ClientValidationAttributes;
var htmlId = !String.IsNullOrWhiteSpace(element.HtmlId) ? element.HtmlId : name;
@@ -13,9 +13,9 @@
}
}
@if (element.ShowLabel) {
<label for="@htmlId">@Html.Raw(element.Label)</label>
<label for="@htmlId">@Html.Raw(Model.ProcessedLabel)</label>
}
@Html.ListBox(name, options, attributes)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage((string)Model.ProcessedName)
}

View File

@@ -8,7 +8,7 @@
<label>@Html.Raw(element.Label)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.TokenizedOptions) {
@foreach (var option in element.Options) {
<li>
<label>
<input type="radio" name="@element.Name" value="@option.Value" />

View File

@@ -7,13 +7,13 @@
var index = 0;
}
@if (element.ShowLabel) {
<label>@Html.Raw(element.Label)</label>
<label>@Html.Raw(Model.ProcessedLabel)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.TokenizedOptions) {
@foreach (var option in Model.ProcessedOptions) {
var inputTagBuilder = new OrchardTagBuilder("input");
inputTagBuilder.Attributes["type"] = "radio";
inputTagBuilder.Attributes["name"] = element.Name;
inputTagBuilder.Attributes["name"] = Model.ProcessedName;
inputTagBuilder.Attributes["value"] = option.Value;
if (element.ValidationSettings.Required == true && index == 0) {
inputTagBuilder.AddClientValidationAttributes((IDictionary<string, string>) Model.ClientValidationAttributes);
@@ -28,5 +28,5 @@
}
@tagBuilder.EndElement
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage((string)Model.ProcessedName)
}

View File

@@ -4,7 +4,7 @@
var element = (Enumeration)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "SelectList1" : element.Name;
var options = (IEnumerable<SelectListItem>)Model.TokenizedOptions;
var options = element.Options;
}
@if (element.ShowLabel) {
<label for="@element.HtmlId">@Html.Raw(element.Label)</label>

View File

@@ -3,8 +3,8 @@
@{
var element = (Enumeration)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "SelectList1" : element.Name;
var options = (IEnumerable<SelectListItem>)Model.TokenizedOptions;
var name = (String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "SelectList1" : (string)Model.ProcessedName);
var options = (IEnumerable<SelectListItem>)Model.ProcessedOptions;
var clientValidationAttributes = (IDictionary<string, string>)Model.ClientValidationAttributes;
var htmlId = !String.IsNullOrWhiteSpace(element.HtmlId) ? element.HtmlId : name;
@@ -13,9 +13,9 @@
}
}
@if (element.ShowLabel) {
<label for="@htmlId">@Html.Raw(element.Label)</label>
<label for="@htmlId">@Html.Raw(Model.ProcessedLabel)</label>
}
@Html.DropDownList(name, options, attributes)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -3,7 +3,7 @@
@{
var element = (Fieldset) Model.Element;
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "fieldset");
var legend = element.Legend;
var legend = Model.ProcessedLegend;
}
@tagBuilder.StartElement
<legend>@legend</legend>

View File

@@ -9,7 +9,8 @@
var element = (Form) Model.Element;
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model);
var formName = element.Name;
var formAction = String.IsNullOrWhiteSpace(element.Action) ? Url.Action("Submit", "Form", new { area = "Orchard.DynamicForms"}) : element.Action;
var processedAction = (string)Model.ProcessedAction;
var formAction = String.IsNullOrWhiteSpace(processedAction) ? Url.Action("Submit", "Form", new { area = "Orchard.DynamicForms"}) : processedAction;
var formMethod = !String.IsNullOrWhiteSpace(element.Method) ? element.Method : "POST";
tagBuilder.AddCssClass("dynamic-form");

View File

@@ -1,13 +1,10 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Helpers
@{
var element = (HiddenField) Model.Element;
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "input");
tagBuilder.AddCssClass("text");
tagBuilder.Attributes["type"] = "hidden";
tagBuilder.Attributes["value"] = Model.TokenizedValue;
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.Attributes["value"] = Model.ProcessedValue;
tagBuilder.Attributes["name"] = Model.ProcessedName;
}
@tagBuilder.ToHtmlString(TagRenderMode.SelfClosing)

View File

@@ -0,0 +1,11 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "label");
var label = (Label)Model.Element;
tagBuilder.Attributes["for"] = label.For;
tagBuilder.InnerHtml = label.Text;
}
@tagBuilder.ToHtmlString(TagRenderMode.Normal)

View File

@@ -1,11 +1,9 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "label");
var label = (Label) Model.Element;
tagBuilder.Attributes["for"] = label.For;
tagBuilder.InnerHtml = label.Text;
tagBuilder.Attributes["for"] = Model.ProcessedFor;
tagBuilder.InnerHtml = Model.ProcessedText;
}
@tagBuilder.ToHtmlString(TagRenderMode.Normal)

View File

@@ -7,7 +7,7 @@
tagBuilder.AddCssClass("text");
tagBuilder.Attributes["type"] = "password";
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.Attributes["name"] = Model.ProcessedName;
tagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
if (!ViewData.ModelState.IsValidField(element.Name)) {
@@ -16,9 +16,9 @@
}
@if (element.ShowLabel) {
<label for="@element.HtmlId">@element.Label</label>
<label for="@element.HtmlId">@Model.ProcessedLabel</label>
}
@tagBuilder.ToHtmlString(TagRenderMode.SelfClosing)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage((string)Model.ProcessedName)
}

View File

@@ -3,17 +3,18 @@
@using Orchard.Layouts.Helpers
@{
var element = (Query)Model.Element;
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "CheckList1" : (string)Model.ProcessedName;
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.CreateElementTagBuilder(Model, "ol");
var index = 0;
}
@if (element.ShowLabel) {
<label>@Html.Raw(element.Label)</label>
<label>@Html.Raw(Model.ProcessedLabel)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.Options) {
var inputTagBuilder = new OrchardTagBuilder("input");
inputTagBuilder.Attributes["type"] = "checkbox";
inputTagBuilder.Attributes["name"] = element.Name;
inputTagBuilder.Attributes["name"] = name;
inputTagBuilder.Attributes["value"] = option.Value;
if (element.ValidationSettings.Required == true && index == 0) {
inputTagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
@@ -28,5 +29,5 @@
}
@tagBuilder.EndElement
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -3,7 +3,7 @@
@{
var element = (Query)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "MultiSelectList1" : element.Name;
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "MultiSelectList1" : (string)Model.ProcessedName;
var options = (IEnumerable<SelectListItem>)Model.Options;
var clientValidationAttributes = (IDictionary<string, string>)Model.ClientValidationAttributes;
var htmlId = !String.IsNullOrWhiteSpace(element.HtmlId) ? element.HtmlId : name;
@@ -13,9 +13,9 @@
}
}
@if (element.ShowLabel) {
<label for="@htmlId">@Html.Raw(element.Label)</label>
<label for="@htmlId">@Html.Raw(Model.ProcessedLabel)</label>
}
@Html.ListBox(name, options, attributes)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -4,16 +4,17 @@
@{
var element = (Query)Model.Element;
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.CreateElementTagBuilder(Model, "ol");
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "RadioList1" : (string)Model.ProcessedName;
var index = 0;
}
@if (element.ShowLabel) {
<label>@Html.Raw(element.Label)</label>
<label>@Html.Raw(Model.ProcessedLabel)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.Options) {
var inputTagBuilder = new OrchardTagBuilder("input");
inputTagBuilder.Attributes["type"] = "radio";
inputTagBuilder.Attributes["name"] = element.Name;
inputTagBuilder.Attributes["name"] = name;
inputTagBuilder.Attributes["value"] = option.Value;
if (element.ValidationSettings.Required == true && index == 0) {
inputTagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
@@ -28,5 +29,5 @@
}
@tagBuilder.EndElement
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -3,7 +3,7 @@
@{
var element = (Query)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "SelectList1" : element.Name;
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "SelectList1" : (string)Model.ProcessedName;
var options = (IEnumerable<SelectListItem>)Model.Options;
var clientValidationAttributes = (IDictionary<string, string>)Model.ClientValidationAttributes;
var htmlId = !String.IsNullOrWhiteSpace(element.HtmlId) ? element.HtmlId : name;
@@ -13,9 +13,9 @@
}
}
@if (element.ShowLabel) {
<label for="@htmlId">@Html.Raw(element.Label)</label>
<label for="@htmlId">@Html.Raw(Model.ProcessedLabel)</label>
}
@Html.DropDownList(name, options, attributes)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -5,13 +5,13 @@
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "input");
tagBuilder.Attributes["type"] = "radio";
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.Attributes["value"] = Model.TokenizedValue;
tagBuilder.Attributes["name"] = Model.ProcessedName;
tagBuilder.Attributes["value"] = Model.ProcessedValue;
}
@if (element.ShowLabel) {
<label>
@tagBuilder.ToHtmlString(TagRenderMode.SelfClosing)
@Html.Raw(element.Label)
@Html.Raw(Model.ProcessedLabel)
</label>
}
else {

View File

@@ -3,11 +3,12 @@
@using Orchard.Layouts.Helpers
@{
var element = (Taxonomy)Model.Element;
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "CheckList1" : (string)Model.ProcessedName;
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.CreateElementTagBuilder(Model, "ol");
var index = 0;
}
@if (element.ShowLabel) {
<label>@Html.Raw(element.Label)</label>
<label>@Html.Raw(Model.ProcessedLabel)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.TermOptions) {
@@ -28,5 +29,5 @@
}
@tagBuilder.EndElement
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -3,7 +3,7 @@
@{
var element = (Taxonomy)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "MultiSelectList1" : element.Name;
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "MultiSelectList1" : (string)Model.ProcessedName;
var options = (IEnumerable<SelectListItem>)Model.TermOptions;
var clientValidationAttributes = (IDictionary<string, string>)Model.ClientValidationAttributes;
var htmlId = !String.IsNullOrWhiteSpace(element.HtmlId) ? element.HtmlId : name;
@@ -13,9 +13,9 @@
}
}
@if (element.ShowLabel) {
<label for="@htmlId">@Html.Raw(element.Label)</label>
<label for="@htmlId">@Html.Raw(Model.ProcessedLabel)</label>
}
@Html.ListBox(name, options, attributes)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -4,16 +4,17 @@
@{
var element = (Taxonomy)Model.Element;
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.CreateElementTagBuilder(Model, "ol");
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "RadioList1" : (string)Model.ProcessedName;
var index = 0;
}
@if (element.ShowLabel) {
<label>@Html.Raw(element.Label)</label>
<label>@Html.Raw(Model.ProcessedLabel)</label>
}
@tagBuilder.StartElement
@foreach (var option in Model.TermOptions) {
var inputTagBuilder = new OrchardTagBuilder("input");
inputTagBuilder.Attributes["type"] = "radio";
inputTagBuilder.Attributes["name"] = element.Name;
inputTagBuilder.Attributes["name"] = name;
inputTagBuilder.Attributes["value"] = option.Value;
if (element.ValidationSettings.Required == true && index == 0) {
inputTagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
@@ -28,5 +29,5 @@
}
@tagBuilder.EndElement
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -3,7 +3,7 @@
@{
var element = (Taxonomy)Model.Element;
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
var name = String.IsNullOrWhiteSpace(element.Name) ? "SelectList1" : element.Name;
var name = String.IsNullOrWhiteSpace((string)Model.ProcessedName) ? "SelectList1" : (string)Model.ProcessedName;
var options = (IEnumerable<SelectListItem>)Model.TermOptions;
var clientValidationAttributes = (IDictionary<string, string>)Model.ClientValidationAttributes;
var htmlId = !String.IsNullOrWhiteSpace(element.HtmlId) ? element.HtmlId : name;
@@ -13,9 +13,9 @@
}
}
@if (element.ShowLabel) {
<label for="@htmlId">@Html.Raw(element.Label)</label>
<label for="@htmlId">@Html.Raw(Model.ProcessedLabel)</label>
}
@Html.DropDownList(name, options, attributes)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -4,9 +4,10 @@
@{
var element = (TextArea)Model.Element;
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.CreateElementTagBuilder(Model, "textarea");
var name = !String.IsNullOrWhiteSpace((string) Model.ProcessedName) ? (string)Model.ProcessedName : "TextArea1";
tagBuilder.AddCssClass("text");
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.Attributes["name"] = name;
tagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
if (element.Rows != null) {
@@ -17,17 +18,17 @@
tagBuilder.Attributes["cols"] = element.Columns.ToString();
}
if (!ViewData.ModelState.IsValidField(element.Name)) {
if (!ViewData.ModelState.IsValidField(name)) {
tagBuilder.AddCssClass("input-validation-error");
}
tagBuilder.SetInnerText(Model.TokenizedValue);
tagBuilder.SetInnerText(Model.ProcessedValue);
}
@if (element.ShowLabel) {
<label for="@element.HtmlId">@element.Label</label>
<label for="@element.HtmlId">@Model.ProcessedLabel</label>
}
@tagBuilder.ToHtmlString(TagRenderMode.Normal)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage(name)
}

View File

@@ -7,19 +7,19 @@
tagBuilder.AddCssClass("text");
tagBuilder.Attributes["type"] = "text";
tagBuilder.Attributes["value"] = Model.TokenizedValue;
tagBuilder.Attributes["name"] = element.Name;
tagBuilder.Attributes["value"] = Model.ProcessedValue;
tagBuilder.Attributes["name"] = Model.ProcessedName;
tagBuilder.AddClientValidationAttributes((IDictionary<string, string>)Model.ClientValidationAttributes);
if (!ViewData.ModelState.IsValidField(element.Name)) {
if (!ViewData.ModelState.IsValidField(Model.ProcessedName)) {
tagBuilder.AddCssClass("input-validation-error");
}
}
@if (element.ShowLabel) {
<label for="@element.HtmlId">@element.Label</label>
<label for="@element.HtmlId">@Model.ProcessedLabel</label>
}
@tagBuilder.ToHtmlString(TagRenderMode.SelfClosing)
@if (element.ValidationSettings.ShowValidationMessage == true) {
@Html.ValidationMessage(element.Name)
@Html.ValidationMessage((string)Model.ProcessedName)
}

View File

@@ -1,11 +1,10 @@
@using Orchard.DynamicForms.Elements
@using Orchard.Layouts.Helpers
@using Orchard.Layouts.Helpers
@{
var element = (ValidationMessage)Model.Element;
var commonAttributes = (IDictionary<string, object>) TagBuilderExtensions.GetCommonElementAttributes(Model);
var forField = (string) Model.ProcessedFor;
}
@if (!String.IsNullOrWhiteSpace(element.For)) {
@Html.ValidationMessage(element.For, commonAttributes)
@if (!String.IsNullOrWhiteSpace(forField)) {
@Html.ValidationMessage(forField, commonAttributes)
}
else {
<!--@T("ValidationMessage (target not specified)")-->

View File

@@ -1,16 +1,16 @@
using System.Collections.Generic;
using System.Linq;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
using Orchard.Services;
namespace Orchard.Layouts.Drivers {
public class HeadingElementDriver : ElementDriver<Heading> {
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
public HeadingElementDriver(IEnumerable<IHtmlFilter> htmlFilters) {
_htmlFilters = htmlFilters;
private readonly IElementFilterProcessor _processor;
public HeadingElementDriver(IElementFilterProcessor processor) {
_processor = processor;
}
protected override EditorResult OnBuildEditor(Heading element, ElementEditorContext context) {
@@ -30,16 +30,8 @@ namespace Orchard.Layouts.Drivers {
}
protected override void OnDisplaying(Heading element, ElementDisplayContext context) {
var text = element.Content;
var flavor = "html";
var processedText = ApplyHtmlFilters(text, flavor);
context.ElementShape.ProcessedText = processedText;
context.ElementShape.ProcessedContent = _processor.ProcessContent(element.Content, "html", context.GetTokenData());
context.ElementShape.Level = element.Level;
}
private string ApplyHtmlFilters(string content, string flavor) {
return _htmlFilters.Aggregate(content, (t, filter) => filter.ProcessContent(t, flavor));
}
}
}

View File

@@ -1,16 +1,16 @@
using System.Collections.Generic;
using System.Linq;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
using Orchard.Services;
namespace Orchard.Layouts.Drivers {
public class HtmlElementDriver : ElementDriver<Html> {
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
public HtmlElementDriver(IEnumerable<IHtmlFilter> htmlFilters) {
_htmlFilters = htmlFilters;
private readonly IElementFilterProcessor _processor;
public HtmlElementDriver(IElementFilterProcessor processor) {
_processor = processor;
}
protected override EditorResult OnBuildEditor(Html element, ElementEditorContext context) {
@@ -28,15 +28,7 @@ namespace Orchard.Layouts.Drivers {
}
protected override void OnDisplaying(Html element, ElementDisplayContext context) {
var text = element.Content;
var flavor = "html";
var processedText = ApplyHtmlFilters(text, flavor);
context.ElementShape.ProcessedText = processedText;
}
private string ApplyHtmlFilters(string content, string flavor) {
return _htmlFilters.Aggregate(content, (t, filter) => filter.ProcessContent(t, flavor));
context.ElementShape.ProcessedContent = _processor.ProcessContent(element.Content, "html", context.GetTokenData());
}
}
}

View File

@@ -1,12 +1,18 @@
using Orchard.Environment.Extensions;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
using MarkdownElement = Orchard.Layouts.Elements.Markdown;
namespace Orchard.Layouts.Drivers {
[OrchardFeature("Orchard.Layouts.Markdown")]
public class MarkdownElementDriver : ElementDriver<MarkdownElement> {
private readonly IElementFilterProcessor _processor;
public MarkdownElementDriver(IElementFilterProcessor processor) {
_processor = processor;
}
protected override EditorResult OnBuildEditor(MarkdownElement element, ElementEditorContext context) {
var viewModel = new MarkdownEditorViewModel {
@@ -23,11 +29,7 @@ namespace Orchard.Layouts.Drivers {
}
protected override void OnDisplaying(MarkdownElement element, ElementDisplayContext context) {
context.ElementShape.ProcessedContent = ToHtml(element.Content);
}
private string ToHtml(string markdown) {
return new MarkdownSharp.Markdown().Transform(markdown);
context.ElementShape.ProcessedContent = _processor.ProcessContent(element.Content, "markdown", context.GetTokenData());
}
}
}

View File

@@ -3,11 +3,19 @@ using System.Linq;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
using Orchard.Services;
namespace Orchard.Layouts.Drivers {
public class ParagraphElementDriver : ElementDriver<Paragraph> {
private readonly IElementFilterProcessor _processor;
public ParagraphElementDriver(IElementFilterProcessor processor) {
_processor = processor;
}
protected override EditorResult OnBuildEditor(Paragraph element, ElementEditorContext context) {
var viewModel = new ParagraphEditorViewModel {
Text = element.Content
@@ -18,8 +26,12 @@ namespace Orchard.Layouts.Drivers {
context.Updater.TryUpdateModel(viewModel, context.Prefix, null, null);
element.Content = viewModel.Text;
}
return Editor(context, editor);
}
protected override void OnDisplaying(Paragraph element, ElementDisplayContext context) {
context.ElementShape.ProcessedContent = _processor.ProcessContent(element.Content, "html", context.GetTokenData());
}
}
}

View File

@@ -233,27 +233,27 @@ namespace Orchard.Layouts.Drivers {
Title: T("Items to display"),
Value: "0",
Description: T("The number of items to display. Enter 0 for no limit. When using pagination, this is the number of items per page."),
Classes: new[] { "text", "medium", "tokenized" }),
Classes: new[] { "text", "medium" }),
_Skip: shape.Textbox(
Id: "Skip",
Name: "Skip",
Title: T("Offset"),
Value: "0",
Description: T("The number of items to skip (e.g., if 2 is entered, the first 2 items won't be diplayed)."),
Classes: new[] { "text", "medium", "tokenized" }),
Classes: new[] { "text", "medium" }),
_MaxItems: shape.Textbox(
Id: "MaxItems",
Name: "MaxItems",
Title: T("MaxItems items"),
Value: "20",
Description: T("Maximum number of items which can be queried at once. Use 0 for unlimited. This is only used as a failsafe when the number of items comes from a user-provided source such as the query string."),
Classes: new[] { "text", "medium", "tokenized" }),
Classes: new[] { "text", "medium" }),
_PagerSuffix: shape.Textbox(
Id: "PagerSuffix",
Name: "PagerSuffix",
Title: T("Suffix"),
Description: T("Optional. Provide a suffix to use when multiple pagers are displayed on the same page, e.g., when using multiple Projection Widgets, or to define alternates."),
Classes: new[] { "text", "medium", "tokenized" }),
Classes: new[] { "text", "medium" }),
_DisplayPager: shape.Checkbox(
Id: "DisplayPager",
Name: "DisplayPager",

View File

@@ -1,16 +1,16 @@
using System.Collections.Generic;
using System.Linq;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Display;
using Orchard.Layouts.Framework.Drivers;
using Orchard.Layouts.Helpers;
using Orchard.Layouts.Services;
using Orchard.Layouts.ViewModels;
using Orchard.Services;
namespace Orchard.Layouts.Drivers {
public class TextElementDriver : ElementDriver<Text> {
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
public TextElementDriver(IEnumerable<IHtmlFilter> htmlFilters) {
_htmlFilters = htmlFilters;
private readonly IElementFilterProcessor _processor;
public TextElementDriver(IElementFilterProcessor processor) {
_processor = processor;
}
protected override EditorResult OnBuildEditor(Text element, ElementEditorContext context) {
@@ -28,15 +28,7 @@ namespace Orchard.Layouts.Drivers {
}
protected override void OnDisplaying(Text element, ElementDisplayContext context) {
var text = element.Content;
var flavor = "textarea";
var processedText = ApplyHtmlFilters(text, flavor);
context.ElementShape.ProcessedText = processedText;
}
private string ApplyHtmlFilters(string content, string flavor) {
return _htmlFilters.Aggregate(content, (t, filter) => filter.ProcessContent(t, flavor));
context.ElementShape.ProcessedContent = _processor.ProcessContent(element.Content, "textarea", context.GetTokenData());
}
}
}

View File

@@ -1,13 +1,12 @@
using System;
using System.Collections.Generic;
using Orchard.Environment.Extensions;
using Orchard.Services;
using Orchard.Layouts.Services;
using Orchard.Tokens;
namespace Orchard.Layouts.Filters {
// TODO: Fix the version that lives in Orchard.Tokens.Filters.
[OrchardFeature("Orchard.Layouts.Tokens")]
public class TokensFilter : IHtmlFilter {
public class TokensFilter : IElementFilter {
private readonly ITokenizer _tokenizer;
@@ -16,20 +15,18 @@ namespace Orchard.Layouts.Filters {
}
public string ProcessContent(string text, string flavor) {
return TokensReplace(text);
return ProcessContent(text, flavor, new Dictionary<string, object>());
}
private string TokensReplace(string text) {
public string ProcessContent(string text, string flavor, IDictionary<string, object> context) {
if (String.IsNullOrEmpty(text))
return "";
if (!text.Contains("#{")) {
return text;
}
var data = new Dictionary<string, object>();
text = _tokenizer.Replace(text, data, new ReplaceOptions {Encoding = ReplaceOptions.NoEncode});
text = _tokenizer.Replace(text, context, new ReplaceOptions { Encoding = ReplaceOptions.NoEncode });
return text;
}

View File

@@ -0,0 +1,16 @@
using System.Collections.Generic;
using Orchard.Layouts.Framework.Display;
namespace Orchard.Layouts.Helpers {
public static class ElementDisplayContextHelper {
public static IDictionary<string, object> GetTokenData(this ElementDisplayContext context) {
var data = new Dictionary<string, object>();
if (context.Content != null)
data["Content"] = context.Content.ContentItem;
return data;
}
}
}

View File

@@ -341,6 +341,7 @@
<Compile Include="Handlers\ElementDriversCoordinator.cs" />
<Compile Include="Helpers\DictionaryExtensions.cs" />
<Compile Include="Helpers\EditorResultExtensions.cs" />
<Compile Include="Helpers\ElementDisplayContextHelper.cs" />
<Compile Include="Helpers\ObjectStoreHelper.cs" />
<Compile Include="Helpers\PrefixHelper.cs" />
<Compile Include="Helpers\JsonHelper.cs" />
@@ -354,6 +355,9 @@
<Compile Include="Services\ElementEventContext.cs" />
<Compile Include="Services\ElementEventHandlerBase.cs" />
<Compile Include="Models\ElementSessionState.cs" />
<Compile Include="Services\ElementFilterProcessor.cs" />
<Compile Include="Services\IElementFilterProcessor.cs" />
<Compile Include="Services\IElementFilter.cs" />
<Compile Include="Services\ICurrentControllerAccessor.cs" />
<Compile Include="Services\IElementEventHandler.cs" />
<Compile Include="Services\ILayoutEditorFactory.cs" />
@@ -548,6 +552,9 @@
<ItemGroup>
<Content Include="Views\EditorTemplates\Elements.Heading.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\Elements\Heading.Design.cshtml" />
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

View File

@@ -0,0 +1,19 @@
using System.Collections.Generic;
using Orchard.Services;
namespace Orchard.Layouts.Services {
public class ElementFilterProcessor : IElementFilterProcessor {
private readonly IEnumerable<IHtmlFilter> _filters;
public ElementFilterProcessor(IEnumerable<IHtmlFilter> filters) {
_filters = filters;
}
public string ProcessContent(string text, string flavor, IDictionary<string, object> context) {
foreach (var htmlFilter in _filters) {
var elementFilter = htmlFilter as IElementFilter;
text = elementFilter != null ? elementFilter.ProcessContent(text, flavor, context) : htmlFilter.ProcessContent(text, flavor);
}
return text;
}
}
}

View File

@@ -0,0 +1,8 @@
using System.Collections.Generic;
using Orchard.Services;
namespace Orchard.Layouts.Services {
public interface IElementFilter : IHtmlFilter {
string ProcessContent(string text, string flavor, IDictionary<string, object> context);
}
}

View File

@@ -0,0 +1,8 @@
using System.Collections.Generic;
using Orchard.Services;
namespace Orchard.Layouts.Services {
public interface IElementFilterProcessor : IDependency {
string ProcessContent(string text, string flavor, IDictionary<string, object> context);
}
}

View File

@@ -0,0 +1,6 @@
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "h" + (Model.Level >= 1 && Model.Level <= 6 ? Model.Level : 1));
tagBuilder.InnerHtml = Model.Element.Content;
}
@tagBuilder.ToHtmlString()

View File

@@ -1,6 +1,6 @@
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "h" + (Model.Level >= 1 && Model.Level <= 6 ? Model.Level : 1));
tagBuilder.InnerHtml = Model.ProcessedText;
tagBuilder.InnerHtml = Model.ProcessedContent;
}
@tagBuilder.ToHtmlString()

View File

@@ -1,6 +1,6 @@
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model);
tagBuilder.InnerHtml = Model.ProcessedText;
tagBuilder.InnerHtml = Model.ProcessedContent;
}
@tagBuilder.ToHtmlString()

View File

@@ -1 +1,6 @@
<p>@Html.Raw((string)Model.Element.Content)</p>
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model, "p");
tagBuilder.InnerHtml = Model.ProcessedContent;
}
@tagBuilder.ToHtmlString()

View File

@@ -1,6 +1,6 @@
@using Orchard.Layouts.Helpers
@{
var tagBuilder = TagBuilderExtensions.CreateElementTagBuilder(Model);
tagBuilder.InnerHtml = Model.ProcessedText;
tagBuilder.InnerHtml = Model.ProcessedContent;
}
@tagBuilder.ToHtmlString()

View File

@@ -15,7 +15,7 @@
Orchard.jQuery,Orchard.Widgets,Orchard.ContentTypes,
Orchard.Scripting,Orchard.Scripting.Lightweight,PackagingServices,Orchard.Packaging,
Orchard.Projections,Orchard.Fields,Orchard.OutputCache,Orchard.Taxonomies,Orchard.Workflows,
Orchard.Layouts,
Orchard.Layouts,Orchard.Layouts.Tokens,
TheThemeMachine" />
<Metadata>

View File

@@ -1,13 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.Environment.Extensions;
using Orchard.Services;
namespace Orchard.Tokens.Filters.Services {
namespace Orchard.Tokens.Filters {
[OrchardFeature("Orchard.Tokens.HtmlFilter")]
public class TokensFilter : ContentHandler, IHtmlFilter {
@@ -28,19 +26,18 @@ namespace Orchard.Tokens.Filters.Services {
}
private string TokensReplace(string text) {
if (_displayed == null) {
return text;
}
if (String.IsNullOrEmpty(text))
return String.Empty;
if (string.IsNullOrEmpty(text))
return string.Empty;
// optimize code path if nothing to do
// Optimize code path if nothing to do.
if (!text.Contains("#{")) {
return text;
}
Dictionary<string, object> data = new Dictionary<string, object>() { { "Content", _displayed } };
var data = new Dictionary<string, object>();
if (_displayed != null)
data["Content"] = _displayed;
text = _tokenizer.Replace(text, data);