2

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

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

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

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

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

4

4 回答 4

3

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

它涉及以下步骤:

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

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

于 2012-05-21T22:15:53.397 回答
2

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

于 2012-05-21T19:51:58.160 回答
1

Just to add a (hopefully useful) Code Sample to support Chris And Nuno's answer about post processing it in C#. It is partially pseudo code. I am very bad at RegEx, so this you need to figure out. Also in the ReplaceUrls() Method you need to add whatever it is you want based on certain code between the {}:

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");
                }
            }
        }
    }
}
于 2012-05-22T19:07:35.453 回答
0

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

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

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

于 2012-05-22T06:12:45.940 回答