【问题标题】:How to Insert Snippets via Component Link from Rich Text Fields in Tridion Razor Templates如何通过组件链接从 Tridion Razor 模板中的富文本字段插入片段
【发布时间】:2012-05-28 07:35:48
【问题描述】:

到目前为止,我的研究一直没有成功,但我正在寻找一种方法,让 Tridion 中富文本字段的内容编辑器能够从富文本字段中调用内容组件。我正在使用 Razor 模板。

也许一些内容的例子可以说明我的意思。如果下面是富文本,我希望在发布期间将文本“tcm:mytcm”识别并处理为命令,以从该富文本字段所在的另一个组件内部呈现该组件,而不是处理它作为文本。我用 { 将它分开来说明某种语法是合适的。

富文本: 这是富文本,这是我想从其中链接到的组件 {tcm:mytcm}。这是之后出现的一些更丰富的文本。

本质上,这样做的主要目的是提供一种将更复杂的 html 代码内联的“sn-ps”插入富文本的方法。要插入的内容的示例是具有各种参数的超链接,或对 Web 服务变量的调用等。该 sn-p 的标记/代码将由 tcm:mytcm 的组件模板生成并在发布期间处理调用它的富文本条目的位置。

如果这种通用方法是错误的方向,我愿意接受有关如何进行此插入的任何想法。任何建议或方向将不胜感激。到目前为止,我在文档或任何其他在线线程中都没有看到任何解决此问题的内容,但也许我的搜索词不是最好的。

【问题讨论】:

  • 请指定您的 SDL Tridion 版本

标签: templates razor tridion razor-mediator


【解决方案1】:

只是添加一个(希望有用的)代码示例来支持 Chris And Nuno 关于在 C# 中对其进行后处理的回答。它是部分伪代码。我在 RegEx 方面非常糟糕,所以你需要弄清楚这一点。同样在 ReplaceUrls() 方法中,您需要根据 {} 之间的某些代码添加您想要的任何内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.ContentManagement.Fields;

namespace TBB.Templates
{
    public class ReplaceString : TemplateBase
    {
        private static readonly Regex tcmReference = new Regex(@"{tcm:mytcm})", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.Compiled);
        private string _outputContent;

        public override void Transform(Engine engine, Package package)
        {
            this.Initialize(engine, package);
            Page page = this.GetPage();

            this._outputContent = package.GetByType(new ContentType("text/html")).GetAsString();

            ReplaceUrls();

            package.GetByType(new ContentType("text/html")).SetAsString(this._outputContent);
        }

        private void ReplaceUrls()
        {
            string[] textContainer = new string[] { this._outputContent };
            foreach (Match match in TemplateUtilities.GetRegexMatches(textContainer, tcmReference))
            {
                Group group = match.Groups["url"];
                if (group.Value.Contains("specific"))
                {
                    this._outputContent = this._outputContent.Replace("specificParam", "SnippetCode");
                }
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    克里斯和努诺说的是答案:

    Nuno描述了实际处理链接组件的逻辑

    Chris 提出了一个关键点,即最好在到达 Razor TBB 之前将其作为预处理步骤完成。您可以修改包中的 XML。

    【讨论】:

      【解决方案3】:

      前段时间我用“词汇表”链接做了一些类似的事情,编辑器可以创建一个链接到一个组件的链接,其中包含一个术语的扩展定义(链接的文本),我们必须在发布时时间,获取这个扩展定义并将其包含在 Javascript 中(这样,如果访问者将鼠标悬停在文本上,文本将显示在一个小气泡中)。

      它涉及以下步骤:

      1. 使用 XML 解析富文本字段
      2. 在 RTF 中查找所有指向 tcm URI 的锚点
      3. 查找目标组件是否基于词汇表架构
      4. 如果是,则将目标组件的“词汇表文本”读入锚的单独属性,并修改一些其他值。

      我认为在 Razor 模板中执行此操作将比在模板中作为后处理步骤复杂得多。

      【讨论】:

      • 当您建议使用 XML 解析富文本字段时,您是使用 C# TBB 还是使用 XSLT TBB?在这种情况下,我无法访问 C# TBB,因为 Tridion 解决方案与其他功能捆绑在一起,因此我目前只能访问 DWT、XSLT 和 Razor TBB。对于这次的倡议,我只能使用之前已经创建的 C# TBB。即使它更复杂或不是最好的方法,是否可以通过仅访问编辑/创建 DWT、XSLT 或 Razor TBB 来进行此处理?如果是这样,我该如何处理?
      • 是的,使用 c#。您可以在 Tridion 中拥有多个解决方案,并且可以在“c# 片段”而不是已编译的程序集中编写代码,尽管这会带来一些影响。我不认为它可以用 Razor 完成,因为这是一个 LAYOUT TBB,而不是真正的代码 TBB。
      【解决方案4】:

      我对 Razor Mediator 知之甚少,但这是 C#、XSLT 和 Dreamweaver 模板的常见挑战。我认为您最好的选择是使用 XSLT 或 C# 对组件进行预处理,并将喜欢的 TCMURI 替换为其他组件的 XML 或其他数据,然后它们继续使用传统的记录技术来访问包中的数据。

      【讨论】:

      • 我使用的是 Tridion 2011。Razor 中介需要这个版本。
      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 2013-02-07
      • 2014-03-18
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多