mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-26 12:03:16 +08:00
* Squashed commit of the following: commit bd1e2bf3d386a1d6f12a5d062639929a17ba6c46 Author: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Thu Nov 10 12:02:09 2016 +0100 Added notifications about what the localization methods for ContentPickerField will do or have done. commit 04eb7074dcfef2c8beb65f0322821dc654902cfb Author: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Wed Nov 9 17:48:59 2016 +0100 Added the TryTranslate option and its suboptions commit fad9fa87f3f3a8c555d088e8971dd04a337cf4dc Author: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Wed Nov 9 15:31:44 2016 +0100 Added a new feature to the ContentPicker module. So far, it stops saving/publication when the items in the ContentPickerField are the "wrong" culture commitb90629dc3eMerge:578b21bc486355Author: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Tue Nov 8 09:37:30 2016 +0100 Merge remote-tracking branch 'remotes/OrchardCMS.Orchard/1.10.x' into Laser/1.10.x commit578b21b75eMerge:395976f3c53ffbAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Nov 4 13:45:51 2016 +0100 Merge branch 'feature/6688_RequestTokens_Chaintext' into Laser/1.10.x commit3c53ffb09aAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Nov 4 13:43:38 2016 +0100 - replaced Regex.Replace with String.Trim(char[]) as suggested - ran Orchard.Tokens.Tests: 66/66 passed commit395976fa60Merge:708ed79a15557eAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 28 16:34:50 2016 +0200 Merge branch 'Laser/1.10.x' of https://github.com/LaserSrl/Orchard into Laser/1.10.x commit708ed79ccbMerge:5fe0b6968acf26Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 28 16:32:52 2016 +0200 Merge branch '1.10.x' of https://github.com/LaserSrl/Orchard into Laser/1.10.x commit5fe0b69c6bMerge:0daad70e3a7059Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 28 16:32:31 2016 +0200 Merge branch 'feature/6196_SupportForAttachments' into Laser/1.10.x commite3a7059edfAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 28 15:22:48 2016 +0200 - Addition of an existing png (OrchardLogo.png) as attachment within "Test Smtp Settings" Section, in order to demonstrate functionality of support for attachments in email commitf095dea5e5Merge:7b0974768acf26Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 28 12:37:55 2016 +0200 Merge remote-tracking branch 'remotes/OrchardCMS.Orchard/1.10.x' into feature/6688_RequestTokens_Chaintext commita15557e5f3Merge:0daad70ce8a61eAuthor: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Thu Oct 27 17:10:53 2016 +0200 Merge branch 'issues/7346_WidgetsViewQueryString' into Laser/1.10.x commit0daad70219Merge:927d18b7b09747Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Thu Oct 27 09:07:58 2016 +0200 Merge remote-tracking branch 'remotes/Laser.Orchard/feature/6688_RequestTokens_Chaintext' into 1.10.x commit7b09747fc9Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Thu Oct 27 09:05:17 2016 +0200 inserted a better explanation on how to use the chains commit927d18b1c2Merge:f8cbc6317ebdd2Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 26 19:00:44 2016 +0200 Merge remote-tracking branch 'remotes/Laser.Orchard/feature/6688_RequestTokens_Chaintext' into 1.10.x commit17ebdd2bfcAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 26 18:57:48 2016 +0200 - typo commitf8cbc63fc0Merge:9f426641b511b2Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 26 18:53:11 2016 +0200 Merge branch 'feature/6688_RequestTokens_Chaintext' into 1.10.x commit1b511b2692Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 26 18:50:35 2016 +0200 - Implement what described in #6688 Supported Syntaxes for Request and Form tokens are: 1. QueryString:(param1) or Form:(param1) 2. QueryString:param1 or Form:param1 3. QueryString:(param1).SomeOtherTextToken or Form:(param1).SomeOtherTextToken If you want to Chain TextTokens you have to use the 3rd syntax the element (here param1) has been surrounded with brackets in order to preserve backward compatibility. commitce8a61ed86Author: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Wed Oct 26 11:46:24 2016 +0200 Fixes #7346 commit9f4266401aMerge:60aa1ccf6cfe32Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Tue Oct 25 09:20:57 2016 +0200 Merge branch '1.10.x' of https://github.com/LaserSrl/Orchard into 1.10.x commit60aa1cc2f4Merge:c1b1c4d7a16cf5Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Tue Oct 25 09:20:28 2016 +0200 Merge branch '1.10.x' of https://github.com/OrchardCMS/Orchard into 1.10.x commitc1b1c4dc06Merge:bf2201ce50bd60Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Tue Oct 25 09:19:54 2016 +0200 Merge remote-tracking branch 'remotes/Laser.Orchard/feature/6196_SupportForAttachments' into 1.10.x commite50bd607b7Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Tue Oct 25 09:18:24 2016 +0200 - Formatted Code (Rebracer) commitf6cfe324b1Merge:7a16cf5bf2201cAuthor: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Mon Oct 24 09:24:57 2016 +0200 Merge remote-tracking branch 'remotes/Laser.Orchard/1.10.x' into 1.10.x Ho fatto pull della 1.10 remota di Orchard commitbf2201c2a9Merge:67af300580b79cAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 18:40:21 2016 +0200 Merge branch 'feature/6196_SupportForAttachments' into 1.10.x # Conflicts: # src/Orchard.Web/Modules/Orchard.Email/Services/SmtpMessageChannel.cs commit580b79c24dAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 11:46:08 2016 +0200 - Added attachments logic commit67af300783Merge:d4d4a32a4c816bAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 11:56:13 2016 +0200 Merge branch 'feature/6196_SupportForAttachments' into 1.10.x commita4c816b291Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 11:55:38 2016 +0200 - missing Attachments Key fix commitd4d4a322bcMerge:297e5862bb81eeAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 11:46:40 2016 +0200 Merge branch 'feature/6196_SupportForAttachments' into 1.10.x commit2bb81eef31Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 11:46:08 2016 +0200 - Added attachments logic commit297e586a19Merge:54a1bdf548b5d7Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 09:39:11 2016 +0200 Merge branch 'feature/5790_partecipate_in_cache_key_generation' into 1.10.x commit548b5d7d8fAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Fri Oct 21 09:37:07 2016 +0200 - Method renamed - try catch removed commit54a1bdf03aMerge:b7ee130794b9b0Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 19 17:51:29 2016 +0200 Merge remote-tracking branch 'remotes/Laser.Orchard/feature/5790_partecipate_in_cache_key_generation' into 1.10.x commit794b9b0252Merge:1dcee8a350cbbdAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 19 17:44:35 2016 +0200 Merge branch 'feature/5790_partecipate_in_cache_key_generation' of https://github.com/LaserSrl/Orchard into feature/5790_partecipate_in_cache_key_generation commit1dcee8aae8Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 19 16:30:12 2016 +0200 - typo chaching > caching - added EventHandler in order to partecipate in cachekey generation commit350cbbd183Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 19 17:40:58 2016 +0200 - typo chaching > caching commitb7ee130847Merge:c9e14f958e59e2Author: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 19 16:32:13 2016 +0200 Merge remote-tracking branch 'remotes/Laser.Orchard/feature/5790_partecipate_in_cache_key_generation' into 1.10.x commit58e59e2fcaAuthor: HermesSbicego-Laser <hermes.sbicego@laser-group.com> Date: Wed Oct 19 16:30:12 2016 +0200 - added EventHandler in order to partecipate in cachekey generation commitc9e14f9b82Author: matteo.piovanelli <matteo.piovanelli@laser-group.com> Date: Mon Oct 17 12:54:53 2016 +0200 Modified the OutputCache Module based on the enhancement proposed in Issue 5811, by adding a VaryByRequestCookies property to the CacheSettingsPart to enable the generation of the Cache Key based on cookies * Changed the view as reccomended by @sebastienros in his comments * Added culture information to the contentpickerfield editor view * Fixed a bug in the handler (!= instead of ==) * showing displaytext in warnings and notifications rather than content item's id * Cleanup. I ContentPickerFieldLocalizationDriver Editor methods are executed correctly on validation errors, so they load the additional javascript correctly
This commit is contained in:
committed by
Sébastien Ros
parent
1254a11b8d
commit
f697fbb06a
@@ -0,0 +1,44 @@
|
||||
using System.Linq;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Drivers;
|
||||
using Orchard.ContentPicker.Fields;
|
||||
using Orchard.ContentPicker.ViewModels;
|
||||
using Orchard.Environment.Extensions;
|
||||
|
||||
namespace Orchard.ContentPicker.Drivers {
|
||||
[OrchardFeature("Orchard.ContentPicker.LocalizationExtensions")]
|
||||
public class ContentPickerFieldLocalizationDriver : ContentFieldDriver<Fields.ContentPickerField> {
|
||||
private readonly IContentManager _contentManager;
|
||||
|
||||
public ContentPickerFieldLocalizationDriver(IContentManager contentManager) {
|
||||
_contentManager = contentManager;
|
||||
}
|
||||
|
||||
private static string GetPrefix(Fields.ContentPickerField field, ContentPart part) {
|
||||
return part.PartDefinition.Name + "." + field.Name;
|
||||
}
|
||||
|
||||
private static string GetDifferentiator(Fields.ContentPickerField field, ContentPart part) {
|
||||
return field.Name;
|
||||
}
|
||||
|
||||
protected override DriverResult Editor(ContentPart part, Fields.ContentPickerField field, dynamic shapeHelper) {
|
||||
return ContentShape("Fields_ContentPickerLocalization_Edit", GetDifferentiator(field, part),
|
||||
() => {
|
||||
var model = new ContentPickerFieldViewModel {
|
||||
Field = field,
|
||||
Part = part,
|
||||
ContentItems = _contentManager.GetMany<ContentItem>(field.Ids, VersionOptions.Latest, QueryHints.Empty).ToList()
|
||||
};
|
||||
|
||||
model.SelectedIds = string.Join(",", field.Ids);
|
||||
|
||||
return shapeHelper.EditorTemplate(TemplateName: "Fields/ContentPickerLocalization.Edit", Model: model, Prefix: GetPrefix(field, part));
|
||||
});
|
||||
}
|
||||
|
||||
protected override DriverResult Editor(ContentPart part, ContentPickerField field, IUpdateModel updater, dynamic shapeHelper) {
|
||||
return Editor(part, field, shapeHelper);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.ContentPicker.Fields;
|
||||
using Orchard.ContentPicker.Settings;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Localization.Models;
|
||||
using Orchard.Localization.Services;
|
||||
using Orchard.UI.Notify;
|
||||
|
||||
namespace Orchard.ContentPicker.Handlers {
|
||||
[OrchardFeature("Orchard.ContentPicker.LocalizationExtensions")]
|
||||
public class ContentPickerFieldLocalizationExtensionHandler : ContentHandler {
|
||||
private readonly IOrchardServices _orchardServices;
|
||||
private readonly IContentManager _contentManager;
|
||||
private readonly ILocalizationService _localizationService;
|
||||
public Localizer T { get; set; }
|
||||
|
||||
public ContentPickerFieldLocalizationExtensionHandler(
|
||||
IOrchardServices orchardServices,
|
||||
IContentManager contentManager,
|
||||
ILocalizationService localizationService) {
|
||||
_orchardServices = orchardServices;
|
||||
_contentManager = contentManager;
|
||||
_localizationService = localizationService;
|
||||
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
protected override void UpdateEditorShape(UpdateEditorContext context) {
|
||||
base.UpdateEditorShape(context);
|
||||
//Here we implement the logic based on the settings introduced in ContentPickerFieldLocalizationSettings
|
||||
//These settings should only be active if the ContentItem that is being updated has a LocalizationPart
|
||||
if (context.ContentItem.Parts.Any(part => part is LocalizationPart)) {
|
||||
var lPart = (LocalizationPart)context.ContentItem.Parts.Single(part => part is LocalizationPart);
|
||||
var fields = context.ContentItem.Parts.SelectMany(x => x.Fields.Where(f => f.FieldDefinition.Name == typeof(ContentPickerField).Name)).Cast<ContentPickerField>();
|
||||
|
||||
foreach (var field in fields) {
|
||||
var settings = field.PartFieldDefinition.Settings.GetModel<ContentPickerFieldLocalizationSettings>();
|
||||
if (settings.TryToLocalizeItems) {
|
||||
//try to replace items in the field with their translation
|
||||
var itemsInField = _contentManager.GetMany<ContentItem>(field.Ids, VersionOptions.Published, QueryHints.Empty);
|
||||
if (settings.RemoveItemsWithNoLocalizationPart && itemsInField.Where(ci => !ci.Parts.Any(part => part is LocalizationPart)).Any()) {
|
||||
//keep only items that have a LocalizationPart
|
||||
_orchardServices.Notifier.Warning(T(
|
||||
"{0}: The following items could have no localization, so they were removed: {1}",
|
||||
field.DisplayName,
|
||||
string.Join(", ", itemsInField.Where(ci => !ci.Parts.Any(part => part is LocalizationPart)).Select(ci => _contentManager.GetItemMetadata(ci).DisplayText))
|
||||
));
|
||||
itemsInField = itemsInField.Where(ci => ci.Parts.Any(part => part is LocalizationPart));
|
||||
}
|
||||
//use an (int, int) tuple to track translations
|
||||
var newIds = itemsInField.Select(ci => {
|
||||
if (ci.Parts.Any(part => part is LocalizationPart)) {
|
||||
if (_localizationService.GetContentCulture(ci) == lPart.Culture.Culture)
|
||||
return new Tuple<int, int>(ci.Id, ci.Id); //this item is fine
|
||||
var localized = _localizationService.GetLocalizations(ci).FirstOrDefault(lp => lp.Culture == lPart.Culture);
|
||||
return localized == null ? new Tuple<int, int>(ci.Id, -ci.Id) : new Tuple<int, int>(ci.Id, localized.Id); //return negative id where we found no translation
|
||||
}
|
||||
else {
|
||||
//we only go here if RemoveItemsWithNoLocalizationPart == false
|
||||
return new Tuple<int, int>(ci.Id, ci.Id);
|
||||
}
|
||||
});
|
||||
if (newIds.Any(tup => tup.Item2 < 0)) {
|
||||
if (settings.RemoveItemsWithoutLocalization) {
|
||||
//remove the items for which we could not find a localization
|
||||
_orchardServices.Notifier.Warning(T(
|
||||
"{0}: We could not find a localization for the following items, so they were removed: {1}",
|
||||
field.DisplayName,
|
||||
string.Join(", ", newIds.Where(tup => tup.Item2 < 0).Select(tup => _contentManager.GetItemMetadata(_contentManager.GetLatest(tup.Item1)).DisplayText))
|
||||
));
|
||||
newIds = newIds.Where(tup => tup.Item2 > 0);
|
||||
}
|
||||
else {
|
||||
//negative Ids are made positive again
|
||||
newIds = newIds.Select(tup => tup = new Tuple<int, int>(tup.Item1, Math.Abs(tup.Item2)));
|
||||
}
|
||||
}
|
||||
if (newIds.Where(tup => tup.Item1 != tup.Item2).Any()) {
|
||||
_orchardServices.Notifier.Warning(T(
|
||||
"{0}: The following items were replaced by their correct localization: {1}",
|
||||
field.DisplayName,
|
||||
string.Join(", ", newIds.Where(tup => tup.Item1 != tup.Item2).Select(tup => _contentManager.GetItemMetadata(_contentManager.GetLatest(tup.Item1)).DisplayText))
|
||||
));
|
||||
}
|
||||
|
||||
field.Ids = newIds.Select(tup => tup.Item2).Distinct().ToArray();
|
||||
}
|
||||
if (settings.AssertItemsHaveSameCulture) {
|
||||
//verify that the items in the ContentPickerField are all in the culture of the ContentItem whose editor we are updating
|
||||
var itemsInField = _contentManager.GetMany<ContentItem>(field.Ids, VersionOptions.Published, QueryHints.Empty);
|
||||
var itemsWithoutLocalizationPart = itemsInField.Where(ci => !ci.Parts.Any(part => part is LocalizationPart));
|
||||
List<int> badItemIds = itemsInField.Where(ci => ci.Parts.Any(part => part is LocalizationPart && ((LocalizationPart)part).Culture != lPart.Culture)).Select(ci => ci.Id).ToList();
|
||||
if (itemsWithoutLocalizationPart.Count() > 0) {
|
||||
//Verify items from the ContentPickerField that cannot be localized
|
||||
_orchardServices.Notifier.Warning(T("{0}: Some of the selected items cannot be localized: {1}",
|
||||
field.DisplayName,
|
||||
string.Join(", ", itemsWithoutLocalizationPart.Select(ci => _contentManager.GetItemMetadata(ci).DisplayText))
|
||||
));
|
||||
if (settings.BlockForItemsWithNoLocalizationPart) {
|
||||
badItemIds.AddRange(itemsWithoutLocalizationPart.Select(ci => ci.Id));
|
||||
}
|
||||
}
|
||||
if (badItemIds.Count > 0) {
|
||||
context.Updater.AddModelError(field.DisplayName, T("Some of the items selected have the wrong localization: {0}",
|
||||
string.Join(", ", badItemIds.Select(id => _contentManager.GetItemMetadata(_contentManager.GetLatest(id)).DisplayText))
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -10,3 +10,8 @@ Features:
|
||||
Description: UI for selecting Content Items.
|
||||
Dependencies: Contents, Navigation
|
||||
Category: Input Editor
|
||||
Orchard.ContentPicker.LocalizationExtensions:
|
||||
Name: Orchard.ContentPicker.LocalizationExtensions
|
||||
Description: Provides settings to enable advanced localization behaviours for ContentPickerFields.
|
||||
Dependencies: Orchard.ContentPicker, Orchard.Localization, Orchard.Resources
|
||||
Category: Input Editor
|
||||
|
||||
@@ -98,6 +98,10 @@
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Drivers\ContentPickerFieldLocalizationDriver.cs" />
|
||||
<Compile Include="Handlers\ContentPickerFieldLocalizationExtensionHandler.cs" />
|
||||
<Compile Include="Settings\ContentPickerFieldLocalizationEditorEvents.cs" />
|
||||
<Compile Include="Settings\ContentPickerFieldLocalizationSettings.cs" />
|
||||
<Compile Include="ViewModels\NavigationPartViewModel.cs" />
|
||||
<Content Include="Scripts\ContentPicker.js" />
|
||||
<Content Include="Scripts\SelectableContentTab.js" />
|
||||
@@ -182,6 +186,10 @@
|
||||
<Name>Orchard.Core</Name>
|
||||
<Private>false</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Orchard.Localization\Orchard.Localization.csproj">
|
||||
<Project>{fbc8b571-ed50-49d8-8d9d-64ab7454a0d6}</Project>
|
||||
<Name>Orchard.Localization</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\ContentPicker.Edit.cshtml" />
|
||||
@@ -189,6 +197,12 @@
|
||||
<ItemGroup>
|
||||
<Content Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\DefinitionTemplates\ContentPickerFieldLocalizationSettings.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\EditorTemplates\Fields\ContentPickerLocalization.Edit.cshtml" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<Placement>
|
||||
<Place Fields_ContentPicker_Edit="Content:2.3"/>
|
||||
<Place Fields_ContentPickerLocalization_Edit="Content:2.3"/>
|
||||
<Place Parts_Navigation_Edit="Content:10"/>
|
||||
<Place Parts_ContentMenuItem_Edit="Content:10"/>
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.ContentManagement.MetaData;
|
||||
using Orchard.ContentManagement.MetaData.Builders;
|
||||
using Orchard.ContentManagement.MetaData.Models;
|
||||
using Orchard.ContentManagement.ViewModels;
|
||||
using Orchard.Environment.Extensions;
|
||||
|
||||
namespace Orchard.ContentPicker.Settings {
|
||||
[OrchardFeature("Orchard.ContentPicker.LocalizationExtensions")]
|
||||
public class ContentPickerFieldLocalizationEditorEvents : ContentDefinitionEditorEventsBase {
|
||||
|
||||
public override IEnumerable<TemplateViewModel> PartFieldEditor(ContentPartFieldDefinition definition) {
|
||||
if (definition.FieldDefinition.Name == "ContentPickerField") {
|
||||
var model = definition.Settings.GetModel<ContentPickerFieldLocalizationSettings>();
|
||||
yield return DefinitionTemplate(model);
|
||||
}
|
||||
}
|
||||
|
||||
public override IEnumerable<TemplateViewModel> PartFieldEditorUpdate(ContentPartFieldDefinitionBuilder builder, IUpdateModel updateModel) {
|
||||
if (builder.FieldType != "ContentPickerField") {
|
||||
yield break;
|
||||
}
|
||||
|
||||
var model = new ContentPickerFieldLocalizationSettings();
|
||||
if (updateModel.TryUpdateModel(model, "ContentPickerFieldLocalizationSettings", null, null)) {
|
||||
builder.WithSetting("ContentPickerFieldLocalizationSettings.TryToLocalizeItems", model.TryToLocalizeItems.ToString(CultureInfo.InvariantCulture));
|
||||
builder.WithSetting("ContentPickerFieldLocalizationSettings.RemoveItemsWithoutLocalization", model.RemoveItemsWithoutLocalization.ToString(CultureInfo.InvariantCulture));
|
||||
builder.WithSetting("ContentPickerFieldLocalizationSettings.RemoveItemsWithNoLocalizationPart", model.RemoveItemsWithNoLocalizationPart.ToString(CultureInfo.InvariantCulture));
|
||||
builder.WithSetting("ContentPickerFieldLocalizationSettings.AssertItemsHaveSameCulture", model.AssertItemsHaveSameCulture.ToString(CultureInfo.InvariantCulture));
|
||||
builder.WithSetting("ContentPickerFieldLocalizationSettings.BlockForItemsWithNoLocalizationPart", model.BlockForItemsWithNoLocalizationPart.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
yield return DefinitionTemplate(model);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using Orchard.Environment.Extensions;
|
||||
|
||||
namespace Orchard.ContentPicker.Settings {
|
||||
[OrchardFeature("Orchard.ContentPicker.LocalizationExtensions")]
|
||||
public class ContentPickerFieldLocalizationSettings {
|
||||
|
||||
public ContentPickerFieldLocalizationSettings() {
|
||||
TryToLocalizeItems = true;
|
||||
}
|
||||
public bool TryToLocalizeItems { get; set; }
|
||||
public bool RemoveItemsWithoutLocalization { get; set; }
|
||||
public bool RemoveItemsWithNoLocalizationPart { get; set; }
|
||||
public bool AssertItemsHaveSameCulture { get; set; }
|
||||
public bool BlockForItemsWithNoLocalizationPart { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
@model Orchard.ContentPicker.Settings.ContentPickerFieldLocalizationSettings
|
||||
|
||||
<fieldset>
|
||||
@Html.CheckBoxFor(m => m.TryToLocalizeItems)
|
||||
<label for="@Html.FieldIdFor(m => m.TryToLocalizeItems)" class="forcheckbox">@T("Try to replace selected items with their correct localization.")</label>
|
||||
<span class="hint">@T("Check to attempt to replace items selected in this field with their translation in the main ContentItem's culture. This only applies if the main ContentItem has a LocalizationPart.")</span>
|
||||
<div data-controllerid="@Html.FieldIdFor(m => m.TryToLocalizeItems)">
|
||||
@Html.CheckBoxFor(m => m.RemoveItemsWithoutLocalization)
|
||||
<label for="@Html.FieldIdFor(m => m.RemoveItemsWithoutLocalization)" class="forcheckbox">@T("Remove items that do not have the correct translation.")</label>
|
||||
<span class="hint">@T("Check to remove items from the ContentPickerField when the items selected do not have a version in the correct culture (they have a LocalizationPart, but not a translation in the main ContentItem's culture').")</span>
|
||||
@Html.CheckBoxFor(m => m.RemoveItemsWithNoLocalizationPart)
|
||||
<label for="@Html.FieldIdFor(m => m.RemoveItemsWithNoLocalizationPart)" class="forcheckbox">@T("Remove items that cannot be localized.")</label>
|
||||
<span class="hint">@T("Check to remove items from the ContentPickerField when the items selected cannot be localized (do not have a LocalizationPart).")</span>
|
||||
</div>
|
||||
|
||||
@Html.CheckBoxFor(m => m.AssertItemsHaveSameCulture)
|
||||
<label for="@Html.FieldIdFor(m => m.AssertItemsHaveSameCulture)" class="forcheckbox">@T("Verify culture of selected items.")</label>
|
||||
<span class="hint">@T("Check to prevent publication of contents when the items selected have a different culture. This only applies if the main ContentItem has a LocalizationPart.")</span>
|
||||
<div data-controllerid="@Html.FieldIdFor(m => m.AssertItemsHaveSameCulture)">
|
||||
@Html.CheckBoxFor(m => m.BlockForItemsWithNoLocalizationPart)
|
||||
<label for="@Html.FieldIdFor(m => m.BlockForItemsWithNoLocalizationPart)" class="forcheckbox">@T("Do not admit items that cannot be localized.")</label>
|
||||
<span class="hint">@T("Check to stop publication of contents when the items selected cannot be localized (do not have a LocalizationPart).")</span>
|
||||
</div>
|
||||
</fieldset>
|
||||
@@ -0,0 +1,39 @@
|
||||
@model Orchard.ContentPicker.ViewModels.ContentPickerFieldViewModel
|
||||
@using Orchard.ContentPicker.Settings;
|
||||
@using Orchard.Localization.Models;
|
||||
@using Orchard.ContentManagement;
|
||||
|
||||
@{
|
||||
Script.Require("jQuery").AtFoot();
|
||||
|
||||
var settings = Model.Field.PartFieldDefinition.Settings.GetModel<ContentPickerFieldLocalizationSettings>();
|
||||
|
||||
string tryTranslateMsg = T("Selected items with a localization different than the current one will be localized.").Text;
|
||||
string removeMissingMsg = T("Selected items for which there is no correct localization will be removed.").Text;
|
||||
string removeUnlocalizableMsg = T("Selected items that cannot have localizations will be removed.").Text;
|
||||
|
||||
if (settings.RemoveItemsWithoutLocalization) { tryTranslateMsg += " " + removeMissingMsg; }
|
||||
if (settings.RemoveItemsWithNoLocalizationPart) { tryTranslateMsg += " " + removeUnlocalizableMsg; }
|
||||
|
||||
//We will use a script to find the fieldset for the field we are currently processing.
|
||||
//The fieldset contains a span of class "hint". We will add tryTranslateMsg to it.
|
||||
string dataPartName = HttpUtility.JavaScriptStringEncode(Model.Part.PartDefinition.Name);
|
||||
string dataFieldName = HttpUtility.JavaScriptStringEncode(Model.Field.PartFieldDefinition.Name);
|
||||
}
|
||||
@using (Script.Foot()) {
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
$("fieldset[data-part-name='@dataPartName'][data-field-name='@dataFieldName']").find("span.hint")[0].innerText += "@tryTranslateMsg";
|
||||
});
|
||||
@foreach (var contentItem in Model.ContentItems) {
|
||||
var loc = contentItem.As<LocalizationPart>();
|
||||
if (loc != null && loc.Culture!=null && !string.IsNullOrWhiteSpace(loc.Culture.Culture)) {
|
||||
<text>
|
||||
$(function () {
|
||||
$("span[data-id='@contentItem.Id'][data-fieldid='@Html.FieldIdFor(m => m.Field.Ids)'].content-picker-item")[0].append(" (@loc.Culture.Culture)");
|
||||
})
|
||||
</text>
|
||||
}
|
||||
}
|
||||
</script>
|
||||
}
|
||||
Reference in New Issue
Block a user