Implemented layout zones caching and changed zone harvesting to collect zones from all layouts.

This commit is contained in:
Sipke Schoorstra
2015-04-04 15:08:29 +02:00
parent ffd68ec5d6
commit 42d7eeec18
5 changed files with 62 additions and 14 deletions

View File

@@ -1,4 +1,5 @@
using Orchard.ContentManagement;
using Orchard.Caching;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.Data;
using Orchard.DisplayManagement;
@@ -12,6 +13,7 @@ namespace Orchard.Layouts.Handlers {
private readonly IContentPartDisplay _contentPartDisplay;
private readonly IShapeDisplay _shapeDisplay;
private readonly ILayoutSerializer _serializer;
private readonly ISignals _signals;
public LayoutPartHandler(
IRepository<LayoutPartRecord> repository,
@@ -19,16 +21,19 @@ namespace Orchard.Layouts.Handlers {
IContentManager contentManager,
IContentPartDisplay contentPartDisplay,
IShapeDisplay shapeDisplay,
ILayoutSerializer serializer) {
ILayoutSerializer serializer,
ISignals signals) {
_layoutManager = layoutManager;
_contentManager = contentManager;
_contentPartDisplay = contentPartDisplay;
_shapeDisplay = shapeDisplay;
_serializer = serializer;
_signals = signals;
Filters.Add(StorageFilter.For(repository));
OnPublished<LayoutPart>(UpdateTemplateClients);
OnPublished<LayoutPart>(InvalidateLayoutZones);
OnIndexing<LayoutPart>(IndexLayout);
}
@@ -45,6 +50,10 @@ namespace Orchard.Layouts.Handlers {
UpdateTemplateClients(part);
}
private void InvalidateLayoutZones(PublishContentContext context, LayoutPart part) {
_signals.Trigger(Signals.LayoutZones);
}
/// <summary>
/// Recursively updates all layouts that use the specified layout as its template.
/// </summary>

View File

@@ -46,7 +46,11 @@ namespace Orchard.Layouts.Services {
element.IsTemplated = (bool)(node["isTemplated"] ?? false);
}
protected bool? ParseBoolean(string value) {
protected bool? ReadBoolean(JToken node) {
if (node == null)
return null;
var value = node.Value<string>();
if (String.IsNullOrWhiteSpace(value))
return null;
@@ -69,7 +73,7 @@ namespace Orchard.Layouts.Services {
element.Width = (int?)node["width"];
element.Offset = (int?)node["offset"];
element.ZoneName = (string) node["zoneName"];
element.Collapsible = ParseBoolean(node["collapsible"].Value<string>());
element.Collapsible = ReadBoolean(node["collapsible"]);
}
public override void FromElement(Column element, DescribeElementsContext describeContext, JToken node) {

View File

@@ -6,7 +6,16 @@ using Orchard.Layouts.Models;
namespace Orchard.Layouts.Services {
public interface ILayoutManager : IDependency {
/// <summary>
/// Returns all content items with a LayoutPart whose IsTemplate setting is set to true.
/// </summary>
IEnumerable<LayoutPart> GetTemplates();
/// <summary>
/// Returns all content items with a LayoutPart.
/// </summary>
IEnumerable<LayoutPart> GetLayouts();
LayoutPart GetLayout(int id);
IEnumerable<Element> LoadElements(ILayoutAspect layout);

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Orchard.Caching;
using Orchard.ContentManagement;
using Orchard.Layouts.Elements;
using Orchard.Layouts.Framework.Display;
@@ -16,12 +17,23 @@ namespace Orchard.Layouts.Services {
private readonly ILayoutSerializer _serializer;
private readonly IElementDisplay _elementDisplay;
private readonly IElementManager _elementManager;
private readonly ICacheManager _cacheManager;
private readonly ISignals _signals;
public LayoutManager(
IContentManager contentManager,
ILayoutSerializer serializer,
IElementDisplay elementDisplay,
IElementManager elementManager,
ICacheManager cacheManager,
ISignals signals) {
public LayoutManager(IContentManager contentManager, ILayoutSerializer serializer, IElementDisplay elementDisplay, IElementManager elementManager) {
_contentManager = contentManager;
_serializer = serializer;
_elementDisplay = elementDisplay;
_elementManager = elementManager;
_cacheManager = cacheManager;
_signals = signals;
}
public IEnumerable<LayoutPart> GetTemplates() {
@@ -35,6 +47,16 @@ namespace Orchard.Layouts.Services {
return _contentManager.Query<LayoutPart>(templateTypeNames).List();
}
public IEnumerable<LayoutPart> GetLayouts() {
var templateTypeNamesQuery = from typeDefinition in _contentManager.GetContentTypeDefinitions()
from typePartDefinition in typeDefinition.Parts
where typePartDefinition.PartDefinition.Name == "LayoutPart"
select typeDefinition.Name;
var templateTypeNames = templateTypeNamesQuery.ToArray();
return _contentManager.Query<LayoutPart>(templateTypeNames).List();
}
public LayoutPart GetLayout(int id) {
return _contentManager.Get<LayoutPart>(id);
}
@@ -61,18 +83,21 @@ namespace Orchard.Layouts.Services {
}
public IEnumerable<string> GetZones() {
var layouts = GetTemplates().ToList();
var zoneNames = new HashSet<string>();
return _cacheManager.Get("LayoutZones", context => {
var layouts = GetLayouts().ToList();
var zoneNames = new HashSet<string>();
foreach (var layoutPart in layouts) {
var elements = LoadElements(layoutPart).Flatten();
var columns = elements.Where(x => x is Column).Cast<Column>().Where(x => !String.IsNullOrWhiteSpace(x.ZoneName)).ToList();
foreach (var layoutPart in layouts) {
var elements = LoadElements(layoutPart).Flatten();
var columns = elements.Where(x => x is Column).Cast<Column>().Where(x => !String.IsNullOrWhiteSpace(x.ZoneName)).ToList();
foreach (var column in columns)
zoneNames.Add(column.ZoneName);
}
foreach (var column in columns)
zoneNames.Add(column.ZoneName);
}
return zoneNames;
context.Monitor(_signals.When(Signals.LayoutZones));
return zoneNames;
});
}
public dynamic RenderLayout(string data, string displayType = null, IContent content = null) {

View File

@@ -1,5 +1,6 @@
namespace Orchard.Layouts {
public static class Signals {
public static readonly object ElementDescriptors = new object();
public static readonly object LayoutZones = new object();
}
}