2015-09-07 23:55:06 +01:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
2015-09-07 11:31:33 +01:00
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using Orchard.ContentManagement;
|
2015-09-07 23:55:06 +01:00
|
|
|
|
using Orchard.ContentManagement.Aspects;
|
2015-09-07 11:31:33 +01:00
|
|
|
|
using Orchard.ContentManagement.MetaData.Models;
|
2015-09-07 23:55:06 +01:00
|
|
|
|
using Orchard.Core.Contents.Settings;
|
2015-09-07 11:31:33 +01:00
|
|
|
|
using Orchard.Environment;
|
|
|
|
|
|
using Orchard.Layouts.Elements;
|
|
|
|
|
|
using Orchard.Layouts.Framework.Display;
|
|
|
|
|
|
using Orchard.Layouts.Framework.Drivers;
|
|
|
|
|
|
using Orchard.Layouts.Framework.Elements;
|
|
|
|
|
|
using Orchard.Layouts.Framework.Harvesters;
|
2015-09-07 23:55:06 +01:00
|
|
|
|
using Orchard.Layouts.Helpers;
|
2015-09-07 11:31:33 +01:00
|
|
|
|
using Orchard.Layouts.Settings;
|
2015-09-07 23:55:06 +01:00
|
|
|
|
using Orchard.Layouts.ViewModels;
|
2015-09-30 01:07:43 +01:00
|
|
|
|
using ContentItem = Orchard.ContentManagement.ContentItem;
|
2015-09-07 11:31:33 +01:00
|
|
|
|
|
|
|
|
|
|
namespace Orchard.Layouts.Providers {
|
|
|
|
|
|
public class PlaceableContentElementHarvester : Component, IElementHarvester {
|
|
|
|
|
|
private readonly Work<IContentManager> _contentManager;
|
|
|
|
|
|
|
|
|
|
|
|
public PlaceableContentElementHarvester(Work<IContentManager> contentManager) {
|
|
|
|
|
|
_contentManager = contentManager;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public IEnumerable<ElementDescriptor> HarvestElements(HarvestElementsContext context) {
|
|
|
|
|
|
var contentTypeDefinitions = GetPlaceableContentTypeDefinitions();
|
|
|
|
|
|
|
|
|
|
|
|
return contentTypeDefinitions.Select(contentTypeDefinition => {
|
|
|
|
|
|
var settings = contentTypeDefinition.Settings;
|
|
|
|
|
|
var description = settings.ContainsKey("Description") ? settings["Description"] : contentTypeDefinition.DisplayName;
|
2015-11-19 14:02:12 +01:00
|
|
|
|
return new ElementDescriptor(typeof (PlaceableContentItem), contentTypeDefinition.Name, T(contentTypeDefinition.DisplayName), T(description), category: "Content Items") {
|
2015-09-07 11:31:33 +01:00
|
|
|
|
Displaying = Displaying,
|
|
|
|
|
|
Editor = Editor,
|
|
|
|
|
|
UpdateEditor = UpdateEditor,
|
|
|
|
|
|
ToolboxIcon = "\uf1b2",
|
|
|
|
|
|
EnableEditorDialog = true,
|
2015-09-30 01:07:43 +01:00
|
|
|
|
Removing = RemoveContentItem,
|
2015-11-11 15:48:38 +01:00
|
|
|
|
Exporting = ExportElement,
|
|
|
|
|
|
Importing = ImportElement,
|
2015-09-07 11:31:33 +01:00
|
|
|
|
StateBag = new Dictionary<string, object> {
|
|
|
|
|
|
{ "ContentTypeName", contentTypeDefinition.Name }
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void Displaying(ElementDisplayingContext context) {
|
|
|
|
|
|
var contentTypeName = (string)context.Element.Descriptor.StateBag["ContentTypeName"];
|
|
|
|
|
|
var element = (PlaceableContentItem)context.Element;
|
|
|
|
|
|
var contentItemId = element.ContentItemId;
|
2015-09-07 23:55:06 +01:00
|
|
|
|
var versionOptions = context.DisplayType == "Design" ? VersionOptions.Latest : VersionOptions.Published;
|
2015-09-07 11:31:33 +01:00
|
|
|
|
var contentItem = contentItemId != null
|
2015-09-07 23:55:06 +01:00
|
|
|
|
? _contentManager.Value.Get(contentItemId.Value, versionOptions)
|
2015-09-07 11:31:33 +01:00
|
|
|
|
: _contentManager.Value.New(contentTypeName);
|
|
|
|
|
|
|
|
|
|
|
|
var contentShape = contentItem != null ? _contentManager.Value.BuildDisplay(contentItem) : default(dynamic);
|
|
|
|
|
|
context.ElementShape.ContentItem = contentItem;
|
|
|
|
|
|
context.ElementShape.ContentShape = contentShape;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void Editor(ElementEditorContext context) {
|
|
|
|
|
|
UpdateEditor(context);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void UpdateEditor(ElementEditorContext context) {
|
|
|
|
|
|
var contentTypeName = (string)context.Element.Descriptor.StateBag["ContentTypeName"];
|
|
|
|
|
|
var element = (PlaceableContentItem) context.Element;
|
2015-09-07 23:55:06 +01:00
|
|
|
|
var elementViewModel = new PlaceableContentItemViewModel {
|
|
|
|
|
|
ContentItemId = element.ContentItemId
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (context.Updater != null) {
|
|
|
|
|
|
context.Updater.TryUpdateModel(elementViewModel, context.Prefix, null, null);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var contentItemId = elementViewModel.ContentItemId;
|
2015-09-07 11:31:33 +01:00
|
|
|
|
var contentItem = contentItemId != null
|
|
|
|
|
|
? _contentManager.Value.Get(contentItemId.Value, VersionOptions.Latest)
|
|
|
|
|
|
: _contentManager.Value.New(contentTypeName);
|
|
|
|
|
|
|
|
|
|
|
|
dynamic contentEditorShape;
|
|
|
|
|
|
|
|
|
|
|
|
if (context.Updater != null) {
|
|
|
|
|
|
if (contentItem.Id == 0) {
|
|
|
|
|
|
_contentManager.Value.Create(contentItem, VersionOptions.Draft);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
2015-09-07 23:55:06 +01:00
|
|
|
|
var isDraftable = contentItem.TypeDefinition.Settings.GetModel<ContentTypeSettings>().Draftable;
|
|
|
|
|
|
var versionOptions = isDraftable ? VersionOptions.DraftRequired : VersionOptions.Latest;
|
|
|
|
|
|
contentItem = _contentManager.Value.Get(contentItem.Id, versionOptions);
|
2015-09-07 11:31:33 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-09-07 23:55:06 +01:00
|
|
|
|
element.ContentItemId = contentItem.Id;
|
|
|
|
|
|
|
|
|
|
|
|
// If the placed content item has the CommonPart attached, set its Container property to the Content (if any).
|
|
|
|
|
|
// This helps preventing widget types from appearing as orphans.
|
|
|
|
|
|
var commonPart = contentItem.As<ICommonPart>();
|
|
|
|
|
|
if (commonPart != null)
|
|
|
|
|
|
commonPart.Container = context.Content;
|
|
|
|
|
|
|
|
|
|
|
|
contentItem.IsPlaceableContent(true);
|
2015-09-07 11:31:33 +01:00
|
|
|
|
contentEditorShape = _contentManager.Value.UpdateEditor(contentItem, context.Updater);
|
2015-09-07 23:55:06 +01:00
|
|
|
|
|
|
|
|
|
|
_contentManager.Value.Publish(contentItem);
|
2015-09-07 11:31:33 +01:00
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
contentEditorShape = _contentManager.Value.BuildEditor(contentItem);
|
|
|
|
|
|
}
|
2015-09-07 23:55:06 +01:00
|
|
|
|
|
|
|
|
|
|
var elementEditorShape = context.ShapeFactory.EditorTemplate(TemplateName: "Elements.PlaceableContentItem", Model: elementViewModel, Prefix: context.Prefix);
|
2015-11-19 14:02:12 +01:00
|
|
|
|
|
2015-09-07 23:55:06 +01:00
|
|
|
|
elementEditorShape.Metadata.Position = "Properties:0";
|
2015-09-07 11:31:33 +01:00
|
|
|
|
contentEditorShape.Metadata.Position = "Properties:0";
|
2015-09-07 23:55:06 +01:00
|
|
|
|
context.EditorResult.Add(elementEditorShape);
|
2015-09-07 11:31:33 +01:00
|
|
|
|
context.EditorResult.Add(contentEditorShape);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-09-30 01:07:43 +01:00
|
|
|
|
private void RemoveContentItem(ElementRemovingContext context) {
|
|
|
|
|
|
var element = (PlaceableContentItem) context.Element;
|
|
|
|
|
|
var contentItemId = element.ContentItemId;
|
2015-11-12 20:25:35 +01:00
|
|
|
|
|
|
|
|
|
|
// Only remove the content item if no other elements are referencing this one.
|
|
|
|
|
|
// This can happen if the user cut an element and then pasted it back.
|
|
|
|
|
|
// That will delete the initial element and create a copy.
|
|
|
|
|
|
var placeableElements =
|
|
|
|
|
|
from e in context.Elements.Flatten()
|
|
|
|
|
|
let p = e as PlaceableContentItem
|
|
|
|
|
|
where p != null && p.ContentItemId == contentItemId
|
|
|
|
|
|
select p;
|
|
|
|
|
|
|
|
|
|
|
|
if (placeableElements.Any())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2015-09-30 01:07:43 +01:00
|
|
|
|
var contentItem = contentItemId != null ? _contentManager.Value.Get(contentItemId.Value, VersionOptions.Latest) : default(ContentItem);
|
|
|
|
|
|
|
|
|
|
|
|
if(contentItem != null)
|
|
|
|
|
|
_contentManager.Value.Remove(contentItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-11 15:48:38 +01:00
|
|
|
|
private void ExportElement(ExportElementContext context) {
|
|
|
|
|
|
var element = (PlaceableContentItem)context.Element;
|
|
|
|
|
|
var contentItemId = element.ContentItemId;
|
|
|
|
|
|
var contentItem = contentItemId != null ? _contentManager.Value.Get(contentItemId.Value, VersionOptions.Latest) : default(ContentItem);
|
|
|
|
|
|
var contentItemIdentity = contentItem != null ? _contentManager.Value.GetItemMetadata(contentItem).Identity.ToString() : default(string);
|
|
|
|
|
|
|
|
|
|
|
|
if (contentItemIdentity != null)
|
|
|
|
|
|
context.ExportableData["ContentItemId"] = contentItemIdentity;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void ImportElement(ImportElementContext context) {
|
|
|
|
|
|
var contentItemIdentity = context.ExportableData.Get("ContentItemId");
|
|
|
|
|
|
|
|
|
|
|
|
if (String.IsNullOrWhiteSpace(contentItemIdentity))
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
var contentItem = context.Session.GetItemFromSession(contentItemIdentity);
|
|
|
|
|
|
var element = (PlaceableContentItem)context.Element;
|
|
|
|
|
|
|
|
|
|
|
|
element.ContentItemId = contentItem != null ? contentItem.Id : default(int?);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-09-07 11:31:33 +01:00
|
|
|
|
private IEnumerable<ContentTypeDefinition> GetPlaceableContentTypeDefinitions() {
|
2015-11-19 14:02:12 +01:00
|
|
|
|
// Select all types that have either "Placeable" set to true.
|
2015-09-07 11:31:33 +01:00
|
|
|
|
var contentTypeDefinitionsQuery =
|
|
|
|
|
|
from contentTypeDefinition in _contentManager.Value.GetContentTypeDefinitions()
|
2015-11-19 14:02:12 +01:00
|
|
|
|
where contentTypeDefinition.Settings.GetModel<ContentTypeLayoutSettings>().Placeable
|
2015-09-07 11:31:33 +01:00
|
|
|
|
select contentTypeDefinition;
|
|
|
|
|
|
|
|
|
|
|
|
return contentTypeDefinitionsQuery.ToList();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|