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

Templates 如何通过Tridion Razor模板中的富文本字段的组件链接插入代码段,templates,razor,tridion,razor-mediator,Templates,Razor,Tridion,Razor Mediator,到目前为止,我的研究还没有成功,但我正在寻找一种方法,使Tridion中的富文本字段的内容编辑器能够从富文本字段内部调用内容组件。我正在使用剃须刀模板 也许一些内容的例子可以说明我的意思。如果下面是富格文本,我希望文本“tcm:mytcm”在发布期间作为命令进行识别和处理,以从富格文本字段所在的其他组件内部呈现该组件,而不是将其视为文本。我用{来说明某种语法是合适的 富文本: 这是富文本,这是我想从它的内部链接到的组件{tcm:mytcm},这是后面的一些更富文本 基本上,这项工作的主要目的是提

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

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

富文本: 这是富文本,这是我想从它的内部链接到的组件{tcm:mytcm},这是后面的一些更富文本

基本上,这项工作的主要目的是提供一种插入“片段”的方法将更复杂的html代码内联到富文本中。要插入的内容的一个示例是带有各种参数的超链接,或对web服务变量的调用等。该代码段的标记/代码将由tcm:mytcm的组件模板生成,并在发布过程中处理,以代替调用它


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

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

I h不久前,我在“词汇表”链接上做了一些类似的事情,编辑器可以创建一个指向包含术语扩展定义(链接文本)的组件的链接,我们必须在发布时获得该扩展定义并将其包含在Javascript中(因此,如果访问者将鼠标移到文本上,文本将显示为一个小气泡)

它涉及以下步骤:

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

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

    Chris和Nuno说的是答案:

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

    关键的一点是,这最好在到达Razor TBB之前作为预处理步骤完成。您可以修改包中的XML。

    只需添加一个(希望有用)代码示例,用于支持Chris和Nuno关于在C#中对其进行后期处理的回答。这部分是伪代码。我对正则表达式非常不擅长,因此您需要弄清楚这一点。此外,在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");
                    }
                }
            }
        }
    }
    

    请指定您使用Tridion 2011的SDL TridionI版本。Razor mediator需要此版本。当您建议使用XML解析富文本字段时,您是使用C#TBB还是使用XSLT TBB?在这种情况下,我无法访问C#TBB,因为Tridion解决方案与其他功能有关,所以我只有访问权限现在将ss转换为DWT、XSLT和Razor TBB。对于目前的计划,我只能使用以前已经创建的C#TBB。即使它更复杂或不是最好的方法,是否可以仅通过访问编辑/创建DWT、XSLT或Razor TBB来进行此处理?如果是,我可以如何处理?是的,使用C#。你可以在Tridion中有多个解决方案,你可以用“c#fragments”来编写代码,而不是用编译的程序集,尽管这会产生一些影响。我不认为用Razor可以做到这一点,因为这是一个布局TBB,而不是真正的代码TBB。