有没有办法在Template Builder中为'source'字段设置数据源参数?
我们有多站点设置。作为其中的一部分,如果我们可以指出我们的Droptrees和Treelists指向适当的位置而不是普通的父母,那么它将节省大量的时间和烦恼。
例如:
Content
--Site1
--Data
--Site2
--Data
我不想将我们的网站指向根Content文件夹,而是将其指向各个数据文件夹,所以我想做类似的事情:
DataSource=/sitecore/content/$sitename/Data
我找不到任何关于此的文章。这是可能的吗?
答案 0 :(得分:2)
不是默认情况下,但您可以使用此技术来编码数据源: http://newguid.net/sitecore/2013/coded-field-datasources-in-sitecore/
答案 1 :(得分:1)
如果它适合您的网站结构的其余部分,则可以使用相对路径。它可以很简单:
./Data
但如果字段在整个树上的随机项目上,那可能不是帮助。
否则请尝试查看:
How to use sitecore query in datasource location? (dynamic datasouce)
答案 2 :(得分:1)
您可能希望查看使用Querable Datasource Location并插入getRenderingDatasource
管道。
这真的取决于你的用例。我喜欢这个解决方案的是没有必要创建一大堆控件,它们可以有效地执行与默认Sitecore相同的操作,并且您不必单独编写所需的每个数据源 - 只需设置查询你需要获取数据。您也可以在__standard values
中为模板设置数据源查询。
这与Holger的建议非常相似,我只是认为这段代码更整洁:)
答案 3 :(得分:0)
由于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字段中的任何内容解析为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一起使用会很好,但这种方法似乎不起作用。
这感觉就像刮擦表面,我相信你可以用这种方法做更多的事情。