如何将参数传递给组件(Dreamweaver)模板?

Geo*_*rge 3 tridion

我有一个页面模板,在页面底部的div中输出三个组件演示文稿.所有这三个组件演示文稿都使用相同的模式和Dreamweaver组件模板.

我想根据它们是否是div中的第一个组件或者最后一个组件演示文稿来对这些组件演示文稿进行略微不同的设置 - 基本上我想为每个组件演示文稿添加"first"和"last"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";
    }
    ...
Run Code Online (Sandbox Code Playgroud)

在我的Dreamweaver模板中(再次,不起作用,只是为了让您了解我正在尝试做什么):

<div class="block @@Parameters.myCssClass@@">
    ...
</div>
Run Code Online (Sandbox Code Playgroud)

如何动态地将"第一"CSS类添加到页面上的第一个组件表示,将"最后"CSS类添加到页面上的最后一个组件表示?

Nic*_*kov 6

所有乔治都不是一个坏问题.

如果从组件模板中取出div并将它们放入页面模板,则无需将页面模板中的参数传递给组件模板.然后将CSS类设置为第一个组件演示很容易:

<div class="<!-- TemplateBeginIf cond="TemplateRepeatIndex==0" -->myFirstCssClass<!-- TemplateEndIf -->"></div>
Run Code Online (Sandbox Code Playgroud)

在最后一个Component Presentation上设置一个类更有趣,并且有几种方法可以实现:

  1. 自定义Dreamweaver函数,例如TemplateRepeatCount().然后你可以在你的页面模板中做这样的事情: <!-- TemplateBeginRepeat name="Components" --><div class="<!-- TemplateBeginIf cond="TemplateRepeatIndex==TemplateRepeatCount()-1" -->lastCssClass<!-- TemplateEndIf -->">@@RenderComponentPresentation()@@</div><!-- TemplateEndRepeat -->.
  2. 另一种方法是编写一个基本的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"));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

为此,您需要Will着名的TemplateBase类,您可以从SDLTridionWorld提供的"有用构建块"扩展中获得该类.显然,您需要调整我提供给您的模式名称等的代码.

在组件模板中将此TBB放在Dreamweaver TBB之前,然后使用其输出如下: <!-- TemplateBeginRepeat name="IsLastCP" -->class="myLastCSSClass"<!-- TemplateEndRepeat -->

注意:您不需要在此处执行TemplateBeginIf并在IsLastCP上明确检查true/false.如果有问题的CP是最后一个,那么该变量将出现在包中,并且TemplateBeginRepeat子句将进入.