3

ページの下部にあるdivに3つのコンポーネントプレゼンテーションを出力するページテンプレートがあります。これら3つのコンポーネントプレゼンテーションはすべて、同じスキーマとDreamweaverコンポーネントテンプレートを使用します。

これらのコンポーネントプレゼンテーションのスタイルは、そのdivの最初のコンポーネントであるか、最後のコンポーネントであるかに基づいて少し異なります。基本的に、各コンポーネントプレゼンテーションに「最初」と「最後」のCSSクラスを追加します。

テンプレートビルディングブロックで、コンポーネントプレゼンテーションの「引数」を動的に設定しようとしています。以下は私がこれまでに得たものです(機能しませんが、私がやろうとしていることのアイデアをあなたに与えるためだけに):

public override void Transform(Engine engine, Package package)
{
    var page = GetPage();
    var wantComponents =
        from c in page.ComponentPresentations
        where c.ComponentTemplate.Title == "Content highlight"
        select c;
    if (wantComponents.Count() > 0)
    {
        // pseudocode - won't compile!
        wantComponents.First().ComponentTemplate.Parameters["myCssClass"] = "first";
        wantComponents.Last().ComponentTemplate.Parameters["myCssClass"] = "last";
    }
    ...

私のDreamweaverテンプレートでは(これも機能しません。私がやろうとしていることを理解するためだけに):

<div class="block @@Parameters.myCssClass@@">
    ...
</div>

「最初の」CSSクラスをページの最初のコンポーネントプレゼンテーションに動的に追加し、「最後の」CSSクラスをページの最後のコンポーネントプレゼンテーションに動的に追加するにはどうすればよいですか?

4

2 に答える 2

6

まったく悪い質問ではありません ジョージ。

コンポーネント テンプレートから div を取り出してページ テンプレートに配置する場合、引数をページ テンプレートからコンポーネント テンプレートに渡す必要はありません。次に、CSS クラスを最初のコンポーネント プレゼンテーションに設定するのは簡単です。

<div class="<!-- TemplateBeginIf cond="TemplateRepeatIndex==0" -->myFirstCssClass<!-- TemplateEndIf -->"></div>

最後のコンポーネント プレゼンテーションでクラスを設定するのは、もう少し楽しく、これを実現する方法がいくつかあります。

  1. TemplateRepeatCount() などのカスタム Dreamweaver 関数。次に、ページ テンプレート内で次のようなことを行うことができます <!-- TemplateBeginRepeat name="Components" --><div class="<!-- TemplateBeginIf cond="TemplateRepeatIndex==TemplateRepeatCount()-1" -->lastCssClass<!-- TemplateEndIf -->">@@RenderComponentPresentation()@@</div><!-- TemplateEndRepeat -->
  2. もう 1 つの方法は、コンポーネント プレゼンテーションをカウントアップし、合計数をパッケージにドロップする基本的な TBB を作成することです。これにより、TemplateRepeatIndex をこの数と比較できます。

上記の #1 と #2 の両方について、こちらの記事で説明しています: http://www.tridiondeveloper.com/more-fun-with-dreamweaver-templates-templaterepeatcount

最後に、コンポーネント テンプレートが実際にページのスコープを調べて、それがリスト内の最後のコンポーネント プレゼンテーションであるかどうかを判断する場所を具体的に求めていたものとより一致するアプローチを次に示します。TemplateBuilder でデバッグするのはそれほど簡単ではないため、私のお気に入りではありません (CT を実行しているときは PT がないため、コンポーネントのプレゼンテーション カウントはこのスコープに存在しません)。

public class IsLastCP : TemplateBase
{
    private string MY_SCHEMA = "My Component's Schema Title";

    public override void Transform(Engine engine, Package package)
    {
        this.Initialize(engine, package);

        //in the page template.
        Page page = this.GetPage();
        if (page == null)
        {
            //this TBB is being executed either in Template Builder or a dynamic component presentation.
            // so we just don't do anything.
        }
        else
        {
            IList<ComponentPresentation> cpList = page.ComponentPresentations;

            int cpCount = 0;
            int thisCPIndex = -1;

            Component thisComponent = this.GetComponent();

            foreach (ComponentPresentation cp in cpList)
            {
                Component comp = cp.Component;
                if (comp.Schema.Title == MY_SCHEMA)
                {
                    if (comp.Id.Equals(thisComponent.Id))
                        thisCPIndex = cpCount;
                    cpCount++;
                }
            }

            if (thisCPIndex == cpCount-1)
            {
                package.PushItem("IsLastCP", package.CreateStringItem(ContentType.Text, "true"));
            }
        }
    }

これには、Will の有名な TemplateBase クラスが必要です。これは、SDLTridionWorld から入手できる彼の「便利なビルディング ブロック」拡張機能から取得できます。明らかに、私が提供したコードをスキーマ名などに微調整する必要があります。

この TBB をコンポーネント テンプレートの Dreamweaver TBB の前にドロップし、その出力を次のように使用します。 <!-- TemplateBeginRepeat name="IsLastCP" -->class="myLastCSSClass"<!-- TemplateEndRepeat -->

注: ここで TemplateBeginIf を実行して、IsLastCP で true/false を明示的にチェックする必要はありません。問題の CP が最後にある場合、この変数はパッケージに存在し、TemplateBeginRepeat 句が入ります。

于 2012-06-25T04:20:51.360 に答える
0

コンテキスト変数を使用して、この種のことを行うこともできます。これを DWT から直接行うことはできないため、おそらく関数ソースを記述するか、DWT を出力に書き込むアセンブリ TBB に置き換えることを意味します。この種のアプローチが設計に適している場合はengine.PublishingContext.RenderContext.ContextVariables、ページ テンプレートから変数を書き込み、コンポーネント レンダリングが最初かどうかを示し、コンポーネント テンプレートにそれを読み取らせて、生成する出力を決定することができます。

一般に、ページ テンプレートに変数を記述し、コンポーネント テンプレートでそれらを読み取るという考え方です。コンポーネント テンプレートの懸念事項をページ テンプレートに移動することを回避するには、これで十分ですが、もちろん、配管の量があなたを先延ばしにする可能性があります。より極端なケースでは、コンポーネント テンプレートからページ テンプレートに値を取得することは可能ですが、その場合はさらに多くの配管が必要になるため、それをまったく行いたいというのは設計上の臭いになる可能性があります。

于 2012-11-20T19:20:52.493 に答える