mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Adding Query form element.
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Core.Title.Models;
|
||||
using Orchard.DynamicForms.Elements;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Forms.Services;
|
||||
using Orchard.Layouts.Framework.Display;
|
||||
using Orchard.Layouts.Framework.Drivers;
|
||||
using Orchard.Projections.Models;
|
||||
using Orchard.Projections.Services;
|
||||
using Orchard.Tokens;
|
||||
using Orchard.Utility.Extensions;
|
||||
using DescribeContext = Orchard.Forms.Services.DescribeContext;
|
||||
|
||||
namespace Orchard.DynamicForms.Drivers {
|
||||
[OrchardFeature("Orchard.DynamicForms.Projections")]
|
||||
public class QueryDriver : FormsElementDriver<Query> {
|
||||
private readonly IProjectionManager _projectionManager;
|
||||
private readonly IContentManager _contentManager;
|
||||
private readonly ITokenizer _tokenizer;
|
||||
|
||||
public QueryDriver(IFormManager formManager, IProjectionManager projectionManager, IContentManager contentManager, ITokenizer tokenizer)
|
||||
: base(formManager) {
|
||||
_projectionManager = projectionManager;
|
||||
_contentManager = contentManager;
|
||||
_tokenizer = tokenizer;
|
||||
}
|
||||
|
||||
protected override IEnumerable<string> FormNames {
|
||||
get {
|
||||
yield return "AutoLabel";
|
||||
yield return "QueryForm";
|
||||
}
|
||||
}
|
||||
|
||||
protected override void DescribeForm(DescribeContext context) {
|
||||
context.Form("QueryForm", factory => {
|
||||
var shape = (dynamic)factory;
|
||||
var form = shape.Fieldset(
|
||||
Id: "QueryForm",
|
||||
_OptionLabel: shape.Textbox(
|
||||
Id: "OptionLabel",
|
||||
Name: "OptionLabel",
|
||||
Title: "Option Label",
|
||||
Description: T("Optionally specify a label for the first option. If no label is specified, no empty option will be rendered."),
|
||||
Classes: new[]{"text", "large", "tokenized"}),
|
||||
_Query: shape.SelectList(
|
||||
Id: "QueryId",
|
||||
Name: "QueryId",
|
||||
Title: "Query",
|
||||
Description: T("Select the query to use as a source for the list.")),
|
||||
_TextExpression: shape.Textbox(
|
||||
Id: "TextExpression",
|
||||
Name: "TextExpression",
|
||||
Title: "Text Expression",
|
||||
Value: "{Content.DisplayText}",
|
||||
Description: T("Specify the expression to get the display text of each option."),
|
||||
Classes: new[]{"text", "large", "tokenized"}),
|
||||
_ValueExpression: shape.Textbox(
|
||||
Id: "ValueExpression",
|
||||
Name: "ValueExpression",
|
||||
Title: "Value Expression",
|
||||
Value: "{Content.Id}",
|
||||
Description: T("Specify the expression to get the value of each option."),
|
||||
Classes: new[]{"text", "large", "tokenized"}),
|
||||
_InputType: shape.SelectList(
|
||||
Id: "InputType",
|
||||
Name: "InputType",
|
||||
Title: "Input Type",
|
||||
Description: T("The control to render when presenting the list of options.")));
|
||||
|
||||
// Query
|
||||
var queries = _contentManager.Query<QueryPart, QueryPartRecord>().Join<TitlePartRecord>().OrderBy(x => x.Title).List().ToArray();
|
||||
foreach (var query in queries) {
|
||||
form._Query.Items.Add(new SelectListItem {Text = query.Name, Value = query.Id.ToString(CultureInfo.InvariantCulture)});
|
||||
}
|
||||
|
||||
// Input Type
|
||||
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" });
|
||||
form._InputType.Items.Add(new SelectListItem { Text = T("Radio List").Text, Value = "RadioList" });
|
||||
form._InputType.Items.Add(new SelectListItem { Text = T("Check List").Text, Value = "CheckList" });
|
||||
|
||||
return form;
|
||||
});
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
context.ElementShape.Options = GetOptions(element, queryId).ToArray();
|
||||
context.ElementShape.Metadata.Alternates.Add(String.Format("Element__{0}__{1}__{2}", category, typeName, element.InputType));
|
||||
context.ElementShape.Metadata.Alternates.Add(String.Format("Element_{0}__{1}__{2}__{3}", displayType, category, typeName, element.InputType));
|
||||
}
|
||||
|
||||
private IEnumerable<SelectListItem> GetOptions(Query element, int? queryId) {
|
||||
var optionLabel = element.OptionLabel;
|
||||
|
||||
if (!String.IsNullOrWhiteSpace(optionLabel)) {
|
||||
yield return new SelectListItem { Text = optionLabel };
|
||||
}
|
||||
|
||||
if (queryId == null)
|
||||
yield break;
|
||||
|
||||
|
||||
var contentItems = _projectionManager.GetContentItems(queryId.Value).ToArray();
|
||||
var valueExpression = !String.IsNullOrWhiteSpace(element.ValueExpression) ? element.ValueExpression : "{Content.Id}";
|
||||
var textExpression = !String.IsNullOrWhiteSpace(element.TextExpression) ? element.TextExpression : "{Content.DisplayText}";
|
||||
|
||||
foreach (var contentItem in contentItems) {
|
||||
var data = new {Content = contentItem};
|
||||
var value = _tokenizer.Replace(valueExpression, data);
|
||||
var text = _tokenizer.Replace(textExpression, data);
|
||||
|
||||
yield return new SelectListItem {
|
||||
Text = text,
|
||||
Value = value
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,29 @@
|
||||
using Orchard.Layouts.Helpers;
|
||||
|
||||
namespace Orchard.DynamicForms.Elements {
|
||||
public class Query : LabeledFormElement {
|
||||
|
||||
public string InputType {
|
||||
get { return State.Get("InputType", "SelectList"); }
|
||||
set { State["InputType"] = value; }
|
||||
}
|
||||
|
||||
public int? QueryId {
|
||||
get { return State.Get("QueryId").ToInt32(); }
|
||||
set { State["QueryId"] = value.ToString(); }
|
||||
}
|
||||
|
||||
public string OptionLabel {
|
||||
get { return State.Get("OptionLabel"); }
|
||||
set { State["OptionLabel"] = value; }
|
||||
}
|
||||
|
||||
public string TextExpression {
|
||||
get { return State.Get("TextExpression", "{Content.Title}"); }
|
||||
}
|
||||
|
||||
public string ValueExpression {
|
||||
get { return State.Get("ValueExpression", "{Content.Id}"); }
|
||||
}
|
||||
}
|
||||
}
|
@@ -19,11 +19,9 @@ namespace Orchard.DynamicForms.Handlers {
|
||||
if (items == null)
|
||||
return;
|
||||
|
||||
foreach (var item in items) {
|
||||
context.Output[key] = item;
|
||||
}
|
||||
|
||||
element.RuntimeValue = String.Join(",", items);
|
||||
var combinedValues = String.Join(",", items);
|
||||
context.Output[key] = combinedValues;
|
||||
element.RuntimeValue = combinedValues;
|
||||
}
|
||||
}
|
||||
}
|
@@ -13,9 +13,14 @@ Features:
|
||||
Dependencies: Orchard.Layouts, Orchard.Tokens, Orchard.Workflows, Orchard.Users, Orchard.AuditTrail, Common
|
||||
Orchard.DynamicForms.Taxonomies:
|
||||
Name: Taxonomy Element
|
||||
Description: Adds a Taxonomy foem element to the sytem.
|
||||
Description: Adds a Taxonomy form element to the sytem.
|
||||
Category: Forms
|
||||
Dependencies: Orchard.DynamicForms, Orchard.Taxonomies
|
||||
Orchard.DynamicForms.Projections:
|
||||
Name: Query Element
|
||||
Description: Adds a Query form element to the sytem.
|
||||
Category: Forms
|
||||
Dependencies: Orchard.DynamicForms, Orchard.Projections
|
||||
Orchard.DynamicForms.ImportExport:
|
||||
Name: Dynamic Forms Import Export
|
||||
Description: Enables the import and export of form submissions.
|
||||
|
@@ -111,6 +111,10 @@
|
||||
<Project>{6bd8b2fa-f2e3-4ac8-a4c3-2925a653889a}</Project>
|
||||
<Name>Orchard.Layouts</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Orchard.Projections\Orchard.Projections.csproj">
|
||||
<Project>{5531e894-d259-45a3-aa61-26dbe720c1ce}</Project>
|
||||
<Name>Orchard.Projections</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Orchard.Taxonomies\Orchard.Taxonomies.csproj">
|
||||
<Project>{e649ea64-d213-461b-87f7-d67035801443}</Project>
|
||||
<Name>Orchard.Taxonomies</Name>
|
||||
@@ -138,9 +142,11 @@
|
||||
<Compile Include="Controllers\AdminController.cs" />
|
||||
<Compile Include="Controllers\FormController.cs" />
|
||||
<Compile Include="Drivers\PasswordFieldDriver.cs" />
|
||||
<Compile Include="Drivers\QueryDriver.cs" />
|
||||
<Compile Include="Drivers\ValidationMessageDriver.cs" />
|
||||
<Compile Include="Drivers\ValidationSummaryDriver.cs" />
|
||||
<Compile Include="Elements\PasswordField.cs" />
|
||||
<Compile Include="Elements\Query.cs" />
|
||||
<Compile Include="Elements\ValidationMessage.cs" />
|
||||
<Compile Include="Elements\ValidationSummary.cs" />
|
||||
<Compile Include="Handlers\ClientValidationRegistrationCoordinator.cs" />
|
||||
@@ -366,6 +372,18 @@
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Element-Form-PasswordField.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Element-Form-Query-SelectList.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Element-Form-Query-CheckList.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Element-Form-Query-MultiSelectList.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Element-Form-Query-RadioList.cshtml" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
|
@@ -0,0 +1,20 @@
|
||||
@using Orchard.DisplayManagement.Shapes
|
||||
@using Orchard.DynamicForms.Elements
|
||||
@using Orchard.Layouts.Helpers
|
||||
@{
|
||||
var element = (Query)Model.Element;
|
||||
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.AddCommonElementAttributes(new OrchardTagBuilder("ol"), Model);
|
||||
}
|
||||
@if (element.ShowLabel) {
|
||||
<label>@Html.Raw(element.Label)</label>
|
||||
}
|
||||
@tagBuilder.StartElement
|
||||
@foreach (var option in Model.Options) {
|
||||
<li>
|
||||
<label>
|
||||
<input type="checkbox" name="@element.Name" value="@option.Value" />
|
||||
@option.Text
|
||||
</label>
|
||||
</li>
|
||||
}
|
||||
@tagBuilder.EndElement
|
@@ -0,0 +1,14 @@
|
||||
@using Orchard.DynamicForms.Elements
|
||||
@using Orchard.Layouts.Helpers
|
||||
@using Orchard.Layouts.Settings
|
||||
@{
|
||||
var element = (Query)Model.Element;
|
||||
var commonSettings = element.State.GetModel<CommonElementSettings>();
|
||||
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
|
||||
var name = String.IsNullOrWhiteSpace(element.Name) ? "MultiSelectList1" : element.Name;
|
||||
var options = (IEnumerable<SelectListItem>)Model.Options;
|
||||
}
|
||||
@if (element.ShowLabel) {
|
||||
<label for="@commonSettings.Id">@Html.Raw(element.Label)</label>
|
||||
}
|
||||
@Html.ListBox(name, options, attributes)
|
@@ -0,0 +1,20 @@
|
||||
@using Orchard.DisplayManagement.Shapes
|
||||
@using Orchard.DynamicForms.Elements
|
||||
@using Orchard.Layouts.Helpers
|
||||
@{
|
||||
var element = (Query)Model.Element;
|
||||
var tagBuilder = (OrchardTagBuilder)TagBuilderExtensions.AddCommonElementAttributes(new OrchardTagBuilder("ol"), Model);
|
||||
}
|
||||
@if (element.ShowLabel) {
|
||||
<label>@Html.Raw(element.Label)</label>
|
||||
}
|
||||
@tagBuilder.StartElement
|
||||
@foreach (var option in Model.Options) {
|
||||
<li>
|
||||
<label>
|
||||
<input type="radio" name="@element.Name" value="@option.Value" />
|
||||
@option.Text
|
||||
</label>
|
||||
</li>
|
||||
}
|
||||
@tagBuilder.EndElement
|
@@ -0,0 +1,14 @@
|
||||
@using Orchard.DynamicForms.Elements
|
||||
@using Orchard.Layouts.Helpers
|
||||
@using Orchard.Layouts.Settings
|
||||
@{
|
||||
var element = (Query)Model.Element;
|
||||
var commonSettings = element.State.GetModel<CommonElementSettings>();
|
||||
var attributes = (IDictionary<string, object>)TagBuilderExtensions.GetCommonElementAttributes(Model);
|
||||
var name = String.IsNullOrWhiteSpace(element.Name) ? "SelectList1" : element.Name;
|
||||
var options = (IEnumerable<SelectListItem>)Model.Options;
|
||||
}
|
||||
@if (element.ShowLabel) {
|
||||
<label for="@commonSettings.Id">@Html.Raw(element.Label)</label>
|
||||
}
|
||||
@Html.DropDownList(name, options, attributes)
|
Reference in New Issue
Block a user