由於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
控制,並將它通過對一個類來處理它的源字段。該類需要做的就是將源字段中的所有內容解析爲sitecore查詢路徑,然後將其重新分配給源字段。這將繼續由Sitecore自己的查詢引擎處理。
所以對於我們的多站點解決方案啓用它的路徑像這樣:
{A588F1CE-3BB7-46FA-AFF1-3918E8925E09}/$sitename
要解決到路徑,如這樣的:那麼
/sitecore/medialibrary/Product Images/Site2
我們的控件將只顯示正確的項目現場。
這是處理解決的GUID和令牌的方法:
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工作,但這種方法似乎並沒有工作。
這感覺就像抓表面,我敢肯定還有很多你可以用這種方法做。
來源
2013-05-23 18:24:00
Jon
偉大的文章,謝謝。看起來像Sitecore 7可能需要等待一週時間,這是新功能。 – Jon
如果您可以等待Sitecore 7,那將是非常值得的! –
Sitecore 7將於下週發佈!?我認爲這會花一點時間。 – Younes