gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:17:41 24 4
gpt4 key购买 nike

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

我想根据它们是该 div 中的第一个组件还是最后一个组件来对这些组件演示文稿进行稍微不同的样式 - 基本上我想向每个组件添加“第一个”和“最后一个”CSS 类演示。

我正在尝试在模板构建 block 中动态地为组件演示设置“参数”。以下是我到目前为止所得到的(不起作用,但只是为了让您了解我正在尝试做什么):

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 类动态添加到页面上的最后一个组件呈现?

最佳答案

乔治这个问题一点也不坏。

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

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

在最后一个组件表示上设置一个类更有趣,有几种方法可以实现这一点:

  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"));
}
}
}

为此,您需要 Will 著名的 TemplateBase 类,您可以从 SDLTridionWorld 提供的他的“有用构建 block ”扩展中获取该类。显然,您需要调整我提供给您的架构名称等的代码。

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

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

关于tridion - 如何将参数传递给组件 (Dreamweaver) 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com