【问题标题】:Executing an item in the package as a Dreamweaver Template将包中的项目作为 Dreamweaver 模板执行
【发布时间】:2012-06-16 12:11:00
【问题描述】:

有谁知道是否可以在复合模板中使用包中的字符串项并像dreamweaver 模板一样执行它?以及您是否将相同的方法应用于其他中介(如剃刀)?

谢谢 标记

【问题讨论】:

  • Package 类有一个方法package.EvaluateExpression(string expression) 可能值得研究。

标签: tridion tridion-2011 tridion2009


【解决方案1】:

恐怕Package 中的任何项目都无法做到这一点,因为Engine 预计Templates 将基于 Tridion 项目。

如果您的模板项基于 Tridion 项,您可能可以从 Engine.GetMediator 方法开始走得很远。如果不是,你必须想办法把它变成一个有效的Template 对象。

Template template = ...
IMediator mediator = engine.GetMediator(template);
mediator.Transform(engine, template, package);

当我必须从包中基于 Tridion 的项目创建 Component 对象时,我通常会这样做:

Component component = new Component(item.GetAsXmlDocument().DocumentElement, 
                                    engine.GetSession);

我还没有尝试过,但希望您可以对Template 执行相同的操作 - 假设您从包中代表模板的有效项目开始。您可能可以从现有项目中克隆 XML 或找到其他方法来伪造它。

如果你让它工作,它将适用于所有注册的模板类型。 Engine 没有为 Tridion 附带的类型提供特殊处理。

【讨论】:

  • 我今天发现engine.GetMediator 不公开,所以你联系不上。我最终只是在我的 TBB 中实例化 DreamweaverMediator 并传入我预先构建的 TemplateBuildingBlock 对象。如果更多人觉得有用,我会更新上面的代码。
【解决方案2】:

我怀疑这是不可能的。

Package.EvaluateExpression 可能有用,但顾名思义,它只适用于表达式,而不适用于嵌入表达式(即 TEL)的大型 sn-ps 代码

Engine.GetMediator 需要 Template 并为其返回适当的 Mediator。那么你的问题是IMediator 接口只定义了Transform 方法,它需要EngineTemplatePackage

我想不出任何优雅的方法来解决这些问题。也许编写自己的 Mediator,但仍然需要一个 Package,而不是字符串,因此您必须首先存储来自另一个 TBB 的基于字符串的 Item。

我的建议:听起来您需要重新设计并找到解决问题的替代方案。

【讨论】:

  • 我假设 Mark 想要从现有的 ITemplate 或 Mediator 中调用“字符串作为 DWT”,因为他指的是它是包中的一个项目。如果是这种情况,他可以简单地将他现有的 Engine 和 Package 对象传递给 Mediator.Transform 方法。我可以看到的主要问题是将字符串 Item 转换为 Template 实例。但这是一个很好的观点,所以我会更新我的答案来详细说明。
  • 我认为可以创建一个新的 ComponentTemplate 或 PageTemplate 对象并传入模板的有效 XML 表示形式。但这仍然无法让您获得任何结果 - 我认为您必须创建一个新的TBB 从您的字符串项中添加到新模板的 XML 中。我预计需要保存 TBB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多