1

私はサイトコア 7.2 を使用しています & 以下のように単一行のテキストのタグを囲むためのパイプラインを作成しました。

public class SingleLineFieldEnclosingTags
    {
        public void Process(RenderFieldArgs args)
        {
            if (args.FieldTypeKey != "single-line text" && args.FieldTypeKey != "multi-line text")
                return;

            args.Result.FirstPart = Helper.WrapInTags(args);            
        }
    }

public static string WrapInTags(RenderFieldArgs args)
        {
            string keyInParam = args.Parameters.Where(x => x.Key.Contains("enclosingTag")).FirstOrDefault().Key;
            string wrappedText = args.Result.FirstPart;

            if (IsPageEditorMode)
            {
                return wrappedText;
            }

            if (keyInParam != null && keyInParam.Trim().Equals("enclosingTag"))
            {
                if (args.Parameters.ContainsKey(keyInParam))
                {
                    string[] paramTags = args.Parameters[keyInParam].Split('|').Reverse().ToArray();

                    foreach (string tag in paramTags)
                    {
                        wrappedText = string.Concat("<", tag.Trim(), ">", wrappedText, "</", tag.Trim().Split(' ')[0], ">");
                    }

                    if (wrappedText.Contains("enclosingTag"))
                    {                            
                        // remove enclosing tag attribute from tags
                        wrappedText = Regex.Replace(wrappedText, @"enclosingTag\s*=\""\s*?.*\""", string.Empty, RegexOptions.IgnoreCase);
                    }
                    return wrappedText;
                }
            }
            return wrappedText;
        }

正常に動作していますが、フィールドを編集または保存すると問題が発生し、それを次のように保存します

<p class="intro">Do you need something specific?</p>

囲みタグも含めて。パブリッシュ モードでは、次のように 2 回、3 回と表示されます。

<p class="intro"></p>
<p class="intro"></p>
<p class="intro"></p>
<p class="intro">Do you need something specific?</p>
<p></p>
<p></p>
<p></p>
4

1 に答える 1

1

このパイプラインを に追加したと思いますItem:Saved。おわかりのように、公開すると実際には Web データベースにアイテムが作成/保存されます。そのサーバーで同じイベントが発生するため、繰り返しタグが表示されます。processメソッドの master データベースで実行していることを確認するチェックを追加します。

public void Process(RenderFieldArgs args)
{
    if (!args.Item.Database.Name.Equals("master", StringComparison.InvariantCultureIgnoreCase))
        return;

    if (args.FieldTypeKey != "single-line text" && args.FieldTypeKey != "multi-line text")
        return;

    args.Result.FirstPart = Helper.WrapInTags(args);            
}

ただし、囲んでいるタグでテキストが既にラップされているかどうかを確認したい場合があります (同様に) -正規表現をいじる代わりに、HTMLAgilityPackまたはCsQueryを使用してください。フィールドなどの単純なシナリオでは、代わりにチェックを実行するだけで済みます。single-line textStartsWith()

代わりに、コードをrenderFieldパイプラインに移動することを検討する必要があります (詳細については、このブログ投稿またはこれを参照してください)。またはEnclosingTagFieldRenderer. このように、タグはコンテンツ エディターに表示されるのではなく、レンダリング時に追加されます。以前に投稿したこのSOの回答には、cssクラスを渡すために使用できるコードがいくつかあります。

于 2015-04-13T08:54:50.177 に答える