Skip to content

Commit

Permalink
Added support for language by domain
Browse files Browse the repository at this point in the history
Bugfix: correct handling of base templates
  • Loading branch information
gtryf committed Sep 18, 2015
1 parent 9b963f1 commit d79a363
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 34 deletions.
10 changes: 9 additions & 1 deletion Sitemap.Xml/App_Config/Include/Sitemap.xml.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@
<sitecore>
<sitemap>
<!-- Define all of your managed sites here -->
<site name="website">
<!--
If the "embedLanguage" attribute is set to false, then it's assumed that
the managed site specifies its language by its domain name, therefore the
installed languages are not iterated, and no language code is embedded in
the final produced URL.

Default value is "true"
-->
<site name="website" embedLanguage="false">
<includeBaseTemplates>
<!-- List the base templates to be included in sitemap.xml -->
<!--
Expand Down
13 changes: 12 additions & 1 deletion Sitemap.Xml/Pipelines/CreateSitemapXmlProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,19 @@ protected Dictionary<string, SiteDefinition> Configuration
IncludedBaseTemplates = new List<string>(),
IncludedTemplates = new List<string>(),
ExcludedItems = new List<string>(),
};

EmbedLanguage = true,
SiteName = XmlUtil.GetAttribute("name", node),
};
var embed = XmlUtil.GetAttribute("embedLanguage", node);
if (!string.IsNullOrEmpty(embed))
{
bool embedVal;
if (!bool.TryParse(embed, out embedVal))
embedVal = true;
def.EmbedLanguage = embedVal;
}

var baseTemplates = XmlUtil.FindChildNode("includeBaseTemplates", node, false);
var includeTemplates = XmlUtil.FindChildNode("includeTemplates", node, false);
var excludeItems = XmlUtil.FindChildNode("excludeItems", node, false);
Expand Down
86 changes: 54 additions & 32 deletions Sitemap.Xml/Pipelines/DefaultSitemapXmlProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Sitecore.ContentSearch.Linq.Utilities;
using Sitecore.ContentSearch.SearchTypes;
using Sitecore.Sites;
using System.Collections.Generic;
using System.Linq;
using System.Text;

Expand All @@ -16,11 +17,8 @@ public DefaultSitemapXmlProcessor(string indexName)
this.indexName = indexName;
}

public override void Process(CreateSitemapXmlArgs args)
private IEnumerable<UrlDefinition> ProcessSite(Sitecore.Data.Items.Item homeItem, SiteDefinition def, Sitecore.Globalization.Language language)
{
var langs = Sitecore.Data.Managers.LanguageManager.GetLanguages(Sitecore.Context.Database);
var homeItem = Sitecore.Context.Database.GetItem(args.Site.RootPath + args.Site.StartItem);

IProviderSearchContext ctx;
if (string.IsNullOrEmpty(this.indexName))
ctx = ContentSearchManager.GetIndex((SitecoreIndexableItem)homeItem).CreateSearchContext();
Expand All @@ -29,41 +27,65 @@ public override void Process(CreateSitemapXmlArgs args)

try
{
foreach (var lang in langs)
{
var results = ctx.GetQueryable<SearchResultItem>()
.Where(i => i.Paths.Contains(homeItem.ID) && i.Language == lang.Name);
var tmplPred = PredicateBuilder.False<SearchResultItem>();
foreach (var tmpl in Configuration[args.Site.Name].IncludedBaseTemplates)
tmplPred = tmplPred.Or(i => i["_templates"] == tmpl);
foreach (var tmpl in Configuration[args.Site.Name].IncludedTemplates.Select(i => Sitecore.Data.ID.Parse(i)))
tmplPred = tmplPred.Or(i => i.TemplateId == tmpl);
var itemPred = PredicateBuilder.True<SearchResultItem>();
foreach (var id in Configuration[args.Site.Name].ExcludedItems.Select(i => Sitecore.Data.ID.Parse(i)))
itemPred = itemPred.And(i => i.ItemId != id);
results = results.Where(tmplPred.And(itemPred));

var items = results
.Select(i => Sitecore.Configuration.Factory.GetDatabase(i.DatabaseName).GetItem(i.ItemId, Sitecore.Globalization.Language.Parse(i.Language), Sitecore.Data.Version.Latest))
.ToList();
var results = ctx.GetQueryable<SitemapResultItem>()
.Where(i => i.Paths.Contains(homeItem.ID) && i.Language == language.Name);
var tmplPred = PredicateBuilder.False<SitemapResultItem>();
foreach (var tmpl in def.IncludedBaseTemplates.Select(i => Sitecore.Data.ID.Parse(i)))
tmplPred = tmplPred.Or(i => i.AllTemplates.Contains(tmpl));
foreach (var tmpl in def.IncludedTemplates.Select(i => Sitecore.Data.ID.Parse(i)))
tmplPred = tmplPred.Or(i => i.TemplateId == tmpl);
var itemPred = PredicateBuilder.True<SitemapResultItem>();
foreach (var id in def.ExcludedItems.Select(i => Sitecore.Data.ID.Parse(i)))
itemPred = itemPred.And(i => i.ItemId != id);
results = results.Where(tmplPred.And(itemPred));

var sb = new StringBuilder();
var options = Sitecore.Links.UrlOptions.DefaultOptions;
options.SiteResolving = Sitecore.Configuration.Settings.Rendering.SiteResolving;
options.Site = SiteContext.GetSite(args.Site.Name);
options.AlwaysIncludeServerUrl = true;
options.Language = lang;
foreach (var item in items)
{
if (item.Versions.Count > 0)
args.Nodes.Add(new UrlDefinition(Sitecore.Links.LinkManager.GetItemUrl(item, options), item.Statistics.Updated));
}
var items = results
.Select(i => Sitecore.Configuration.Factory.GetDatabase(i.DatabaseName).GetItem(i.ItemId, Sitecore.Globalization.Language.Parse(i.Language), Sitecore.Data.Version.Latest))
.ToList();

var sb = new StringBuilder();
var options = Sitecore.Links.UrlOptions.DefaultOptions;
options.SiteResolving = Sitecore.Configuration.Settings.Rendering.SiteResolving;
options.Site = SiteContext.GetSite(def.SiteName);
if (def.EmbedLanguage)
options.LanguageEmbedding = Sitecore.Links.LanguageEmbedding.Always;
else
options.LanguageEmbedding = Sitecore.Links.LanguageEmbedding.Never;
options.AlwaysIncludeServerUrl = true;
options.Language = language;
foreach (var item in items)
{
if (item.Versions.Count > 0)
yield return new UrlDefinition(Sitecore.Links.LinkManager.GetItemUrl(item, options), item.Statistics.Updated);
}
}
finally
{
ctx.Dispose();
}
}

public override void Process(CreateSitemapXmlArgs args)
{
var langs = Sitecore.Data.Managers.LanguageManager.GetLanguages(Sitecore.Context.Database);
var homeItem = Sitecore.Context.Database.GetItem(args.Site.RootPath + args.Site.StartItem);

var def = this.Configuration[args.Site.Name];
if (def.EmbedLanguage)
{
foreach (var lang in langs)
args.Nodes.AddRange(ProcessSite(homeItem, def, lang));
}
else
{
args.Nodes.AddRange(ProcessSite(homeItem, def, Sitecore.Context.Language));
}
}
}

class SitemapResultItem : SearchResultItem
{
[IndexField("_templates")]
public IEnumerable<Sitecore.Data.ID> AllTemplates { get; set; }
}
}
3 changes: 3 additions & 0 deletions Sitemap.Xml/SiteDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,8 @@ public sealed class SiteDefinition
public List<string> IncludedBaseTemplates { get; set; }
public List<string> IncludedTemplates { get; set; }
public List<string> ExcludedItems { get; set; }

public bool EmbedLanguage { get; set; }
public string SiteName { get; set; }
}
}

0 comments on commit d79a363

Please sign in to comment.