1

Is there any way to parametise the Datasource for the 'source' field in the Template Builder?

We have a multisite setup. As part of this it would save a lot of time and irritation if we could point our Droptrees and Treelists point at the appropriate locations rather than common parents.

For instance:

Content
  --Site1
    --Data
  --Site2
    --Data

Instead of having to point our site at the root Content folder I want to point it at the individual data folders, so I want to do something like:

DataSource=/sitecore/content/$sitename/Data

I can't find any articles on this. Is it something that's possible?

4

4 回答 4

2

默认情况下不是,但您可以使用此技术对数据源进行编码:http: //newguid.net/sitecore/2013/coded-field-datasources-in-sitecore/

于 2013-05-17T09:47:43.140 回答
1

如果它适合您的站点结构的其余部分,您可以使用相对路径。它可能很简单:

./Data

但是,如果这些字段在整个树上的随机项上,那可能没有帮助。

否则尝试查看:

如何在数据源位置使用 sitecore 查询?(动态数据源)

于 2013-05-17T10:10:24.870 回答
1

您可能希望查看使用可查询数据源位置并插入getRenderingDatasource管道。

这实际上取决于您的用例。我喜欢这个解决方案的一点是不需要创建一大堆控件来有效地执行与默认 Sitecore 相同的操作,并且您不必单独编写所需的每个数据源 - 只需设置查询你需要获取数据。您也可以__standard values在模板中设置数据源查询。

这与 Holger 的建议非常相似,我只是觉得这段代码更整洁:)

于 2013-05-17T19:52:17.863 回答
0

由于 Sitecore 7 需要 VS 2012,而且我们公司不会很快升级,我不得不为此寻找 Sitecore 6 解决方案。

根据这篇文章这篇文章,我想出了这个解决方案。

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 自己的查询引擎处理。

因此,对于我们的多站点解决方案,它启用了如下路径:

{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-23T18:24:00.790 回答