Sitecore Multisite Manager和模板构建器中的“源”字段

时间:2013-05-17 09:45:06

标签: sitecore sitecore6

有没有办法在Template Builder中为'source'字段设置数据源参数?

我们有多站点设置。作为其中的一部分,如果我们可以指出我们的Droptrees和Treelists指向适当的位置而不是普通的父母,那么它将节省大量的时间和烦恼。

例如:

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

我不想将我们的网站指向根Content文件夹,而是将其指向各个数据文件夹,所以我想做类似的事情:

DataSource=/sitecore/content/$sitename/Data

我找不到任何关于此的文章。这是可能的吗?

4 个答案:

答案 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 articlethis 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一起使用会很好,但这种方法似乎不起作用。

这感觉就像刮擦表面,我相信你可以用这种方法做更多的事情。