С Sitecore 7 требует VS 2012 и наша компания не собирается модернизировать в ближайшее время я вынужден был найти Sitecore 6.
Опираясь на this article и this one Я придумал это решение.
public class SCWTreeList : TreeList
{
protected override void OnLoad(EventArgs e)
{
if (!String.IsNullOrEmpty(Source))
this.Source = SourceQuery.Resolve(SContext.ContentDatabase.Items[ItemID], Source);
base.OnLoad(e);
}
}
Это создает пользовательский TreeList
контроль и передает это поле Source через к классу, чтобы справиться с этим. Все, что нужно сделать, это разрешить все, что у вас есть в поле Source, в путь запроса sitecore, который затем можно переназначить в поле источника. Затем это будет обрабатываться собственным механизмом запросов Sitecore.
Так что для нашего решения на несколько сайтов это позволило пути, таким как это:
{A588F1CE-3BB7-46FA-AFF1-3918E8925E09}/$sitename
постановить пути, такие, как это:
/sitecore/medialibrary/Product Images/Site2
Наших управления будут показывать только элементы для правильного сайт.
Это метод, который обрабатывает разрешения GUIDs и жетоны:
public static string Resolve(Item item, string query)
{
// Resolve tokens
if (query.Contains("$"))
{
MatchCollection matches = Regex.Matches(query, "\\$[a-z]+");
foreach (Match match in matches)
query = query.Replace(match.Value, ResolveToken(item, match.Value));
}
// Resolve GUIDs.
MatchCollection guidMatches = Regex.Matches(query, "^{[a-zA-Z0-9-]+}");
foreach (Match match in guidMatches)
{
Guid guid = Guid.Parse(match.Value);
Item queryItem = SContext.ContentDatabase.GetItem(new ID(guid));
if (item != null)
query = query.Replace(match.Value, queryItem.Paths.FullPath);
}
return query;
}
Токен обработки ниже, как вы можете видеть, что это требует, чтобы любой элемент, используя $siteref
маркер находится внутри Site Folder
элемента, который мы создали. Это позволяет нам использовать поле, содержащее имя, которое должно соответствовать всем нашим папкам с несколькими сайтами, - Site Reference
. До тех пор, пока это соглашение об именах соблюдается, оно позволяет нам ссылаться на папки в медиа-библиотеке или на любом другом общем содержимом в Sitecore.
static string ResolveToken(Item root, string token)
{
switch (token)
{
case "$siteref":
string sRef = string.Empty;
Item siteFolder = root.Axes.GetAncestors().First(x => x.TemplateID.Guid == TemplateKeys.CMS.SiteFolder);
if (siteFolder != null)
sRef = siteFolder.Fields["Site Reference"].Value;
return sRef;
}
throw new Exception("Token '" + token + "' is not recognised. Please disable wishful thinking and try again.");
}
До сих пор это работает для TreeLists, DropTrees и DropLists. Было бы неплохо заставить его работать с DropLinks, но этот метод, похоже, не работает.
Это похоже на царапину на поверхности, я уверен, что с этим подходом вы можете многое сделать.
Отличная статья, спасибо. Похоже, что Sitecore 7 стоит ждать в неделю, и это новая функциональность. – Jon
Если вы можете подождать Sitecore 7, это будет стоить того! –
Выйдет ли Sitecore 7 на следующей неделе !? Я думал, что это займет немного больше времени. – Younes