【问题标题】:Sitecore Multisite Manager and 'source' field in template builderSitecore 多站点管理器和模板生成器中的“源”字段
【发布时间】:2013-05-17 09:45:06
【问题描述】:

有没有办法在模板生成器中为“源”字段参数化数据源?

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

例如:

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

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

DataSource=/sitecore/content/$sitename/Data

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

【问题讨论】:

    标签: sitecore sitecore6


    【解决方案1】:

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

    【讨论】:

    • 很棒的文章,谢谢。看起来 Sitecore 7 和它的新功能可能值得等待一周。
    • 如果您可以等待 Sitecore 7,那将是非常值得的!
    • Sitecore 7 下周会发布吗!?我认为这需要更长的时间。
    • 我在几周前就预料到了 CTP。我想不能再等太久了!
    • 我们昨天看了他们的 Google Hangout,他们说是 5 月 21 日。
    【解决方案2】:

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

    ./Data
    

    但是,如果字段位于树上的随机项目上,那可能没有帮助。

    否则试试看:

    How to use sitecore query in datasource location? (dynamic datasouce)

    【讨论】:

      【解决方案3】:

      您可能想看看使用Querable Datasource Location 并插入getRenderingDatasource 管道。

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        这感觉像是在摸索表面,我相信你可以用这种方法做更多的事情。

        【讨论】:

          猜你喜欢
          • 2012-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多