1

複合テンプレート (Tridion 2011 SP1 用) のベスト プラクティスに関連するリンク/ブログ/ドキュメントはありますか?

具体的には、多くのハードコーディングを行わずに、ページ テンプレート内のコンポーネント テンプレートをより効率的に書き出す方法を知りたいです。

4

3 に答える 3

11

すぐに使える例

Tridion に付属するデフォルトの Dreamweaver ページ デザイン (DWT) は、コンポーネント プレゼンテーションを次のようにレンダリングします。

<!-- TemplateBeginRepeat name="Components" -->
  <div>@@RenderComponentPresentation()@@</div>
<!-- TemplateEndRepeat -->

それはおそらくあなたがそれを得ることができる最も簡単な方法です.

C# での分割

ただし、ほとんどの実装では、もう少し現実的なものがすぐに必要になり、2 段階のアプローチで動作します。

  1. コンポーネント プレゼンテーションを複数の配列に分割する C# TBB
  2. これらの各配列を順番に繰り返す DWT TBB

ステップ 1 の分割は、通常、コンポーネント テンプレートの名前に基づいて行われます。

var page = (Page)engine.GetObject(package.GetByName(Package.PageName));
var lists = new Dictionary<string, List<ComponentPresentation>>();

foreach (comm.ComponentPresentation cp in page.ComponentPresentations)
{
    var ct = cp.ComponentTemplate.Title.Replace(" ", "");
    if (!lists.ContainsKey(ct))
        lists.Add(ct, new List<ComponentPresentation>());
        lists[ct].Add(new ComponentPresentation(cp.Component.Id,
                                                cp.ComponentTemplate.Id));
    }

foreach (string token in lists.Keys)
{
    var item = package.CreateStringItem(ContentType.ComponentArray, 
                               ComponentPresentationList.ToXml(lists[token]));
    package.PushItem(token + "Components", item);
}

上記の C# は、Nuno Linhares によって提供された実装の簡略化されたバージョンです。

次に、DWT は各配列を順番に反復処理し、ページ HTML の適切な場所に配置します。

<div class='main'>
  <!-- TemplateBeginRepeat name="ArticleSummary" -->
    @@RenderComponentPresentation()@@
  <!-- TemplateEndRepeat -->
</div>

<byline>
  <!-- TemplateBeginRepeat name="SeeAlso" -->
    @@RenderComponentPresentation()@@
  <!-- TemplateEndRepeat -->
</byline>

しかし、コンポーネント テンプレートのメタデータ フィールドに基づいてコンポーネント プレゼンテーションを分割するケースは、おそらくより現実的です。これらのパーティショニング ルールは実装者の数と同じ数存在するようであり、それらの多くは同等に有効です。

ドミニクはここで素晴らしい実装例を提供しました: http://code.google.com/p/tridion-practice/wiki/PartitionComponentPresentations。彼の場合、各コンポーネント プレゼンテーションがどのパーティションに入るかを決定する単純な記述子言語があります。

DWT でのフィルタリング

C# TBB を書きたくない場合は、 を使用して DWT だけで同じことを行うこともできますTemplateBeginIf

<!-- TemplateBeginRepeat name="Components" -->
  <!-- TemplateBeginIf cond="ComponentTemplate.Title=='Promo Content'" -->
    @@RenderComponentPresentation()@@
  <!-- TemplateEndIf -->
<!-- TemplateEndRepeat -->

これは完全に正常に機能しますが、DWT により多くのロジックが含まれることになります。それがあなたが取ろうとしているルートである場合、 Razor Mediator (Ram S も言及) やXSLT Mediatorなど、レイアウトとロジックのそのような組み合わせをより自然にする Tridion で利用可能なテンプレート言語があります。

于 2012-08-24T12:55:39.497 に答える
4

リンクの下のRazorを使用している場合は役立つかもしれません

http://blog.building-blocks.com/razor-templating-sdl-tridion-2011

于 2012-08-24T11:00:22.880 に答える
3

コンポーネント プレゼンテーション コンテンツをページに出力する方法の高レベルの概念は、複合テンプレートと旧式の VBScript テンプレートで非常に似ています。

これを行う 1 つの方法は、ページ上のすべてのコンポーネント プレゼンテーション (CP) を取得し、それらを個別のコンポーネント プレゼンテーション コレクションにグループ化する .NET を使用して TBB を作成することです。これは、ページ領域ごとに DWT ページ レイアウトを使用して反復できます。 .

CP をグループ化するために作成する TBB では、グループを定義するために任意の基準を使用できます。個人的には、コンポーネント テンプレート (CT) のメタデータを使用して特定のページ領域のタグを付けていますが、CT またはスキーマ名、またはコンポーネントの他の値、またはコンポーネントが格納されているフォルダーのメタデータを同様に使用できます。

于 2012-08-24T12:31:20.797 に答える