如何通过Tridion Razor模板中的富文本字段的组件链接插入片段

时间:2012-05-21 19:30:30

标签: templates razor tridion razor-mediator

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

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

富文字: 这是富文本,这是我要从其中链接到的组件{tcm:mytcm}。这是一些更丰富的文字。

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

如果这种一般方法是错误的方向,我会对如何进行此插入的任何想法持开放态度。任何建议或方向将不胜感激。到目前为止,我没有在文档或任何其他在线线程中看到任何解决此问题的内容,但也许我的搜索字词不是最好的。

4 个答案:

答案 0 :(得分:3)

我前段时间使用“词汇表”链接做了一些类似的事情,其中​​编辑器可以创建指向包含术语扩展定义(链接文本)的组件的链接,我们必须在发布时时间,获得这个扩展的定义,并将其包含在Javascript中(如果访问者将其覆盖在文本中,那么文本将显示在一个小小的泡泡中)。

它涉及以下步骤:

  1. 使用XML解析富文本字段
  2. 查找RTF中指向tcm URI
  3. 的所有锚点
  4. 查找目标组件是否基于词汇表架构
  5. 如果是,请将目标组件的“词汇表文本”读入锚的单独属性,并修改其他值。
  6. 我认为在Razor模板中执行此操作将比在模板中作为后处理步骤执行此操作要复杂得多。

答案 1 :(得分:2)

我对Razor Mediator知之甚少,但这是C#,XSLT和Dreamweaver模板的常见挑战。我认为最好的办法是使用XSLT或C#预处理Component,并将喜欢的TCMURI替换为其他组件或其他数据的XML,然后继续使用传统的文档技术从包中访问数据。

答案 2 :(得分: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");
                }
            }
        }
    }
}

答案 3 :(得分:0)

Chris和Nuno说的是答案:

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

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