2

これまでの調査ではうまくいきませんでしたが、Tridion のリッチ テキスト フィールドのコンテンツ エディターがリッチ テキスト フィールド内からコンテンツ コンポーネントを呼び出せるようにする方法を探しています。Razor テンプレートを使用しています。

おそらく、いくつかのコンテンツの例は、私の言いたいことを明らかにするかもしれません. 以下がリッチ テキストである場合、「tcm:mytcm」というテキストを識別し、公開中にコマンドとして処理して、このリッチ テキスト フィールドを処理するのではなく、このリッチ テキスト フィールドが含まれる他のコンポーネント内からそのコンポーネントをレンダリングする方法が必要です。テキストとして。{ で区別して、ある種の構文が適切であることを示しています。

リッチ テキスト: これはリッチ テキストです。これは、{tcm:mytcm} 内からリンクしたいコンポーネントです。そして、これはその後に続く、よりリッチなテキストです。

基本的に、これの主な目的は、より複雑な HTML コードの「スニペット」をインラインでリッチ テキストに挿入する方法を提供することです。挿入するものの例としては、さまざまなパラメーターを含むハイパーリンク、または Web サービス変数への呼び出しなどがあります。そのスニペットのマークアップ/コードは、tcm:mytcm のコンポーネント テンプレートによって生成され、発行時に代わりに処理されます。それを呼び出したリッチ テキスト エントリ。

この一般的な方法論が間違った方向である場合、この挿入を行う方法についてのアイデアを受け入れます。アドバイスや指示をいただければ幸いです。これまでのところ、この問題に対処するドキュメントやオンラインの他のスレッドには何も表示されていませんが、おそらく私の検索用語は最適ではありません。

4

4 に答える 4

3

少し前に「用語集」リンクで似たようなことをしました。編集者は、用語の拡張された定義 (リンクのテキスト) を含むコンポーネントへのリンクを作成でき、公開時に取得する必要がありました。この拡張された定義を Javascript に含めます (これにより、訪問者がテキストの上にマウスを置いた場合にテキストが小さな吹き出しで表示されます)。

それには次の手順が含まれていました。

  1. XML でリッチ テキスト フィールドを解析する
  2. tcm URI を指す RTF 内のすべてのアンカーを見つける
  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

C#での後処理に関するChris And Nunoの回答をサポートする(うまくいけば便利な)コードサンプルを追加するだけです。部分的に擬似コードです。私は正規表現がとても苦手なので、これを理解する必要があります。また、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");
                }
            }
        }
    }
}
于 2012-05-22T19:07:35.453 に答える
0

クリスとヌーノが言ったことは答えです:

Nunoは、リンクされたコンポーネントを実際に処理するロジックについて説明しています

クリスは、Razor TBBに到達する前に、これを前処理ステップとして実行するのが最適であるという重要なポイントを示しています。パッケージ内のXMLを変更できます。

于 2012-05-22T06:12:45.940 に答える