【发布时间】:2012-06-16 12:11:00
【问题描述】:
有谁知道是否可以在复合模板中使用包中的字符串项并像dreamweaver 模板一样执行它?以及您是否将相同的方法应用于其他中介(如剃刀)?
谢谢 标记
【问题讨论】:
-
Package 类有一个方法
package.EvaluateExpression(string expression)可能值得研究。
标签: tridion tridion-2011 tridion2009
有谁知道是否可以在复合模板中使用包中的字符串项并像dreamweaver 模板一样执行它?以及您是否将相同的方法应用于其他中介(如剃刀)?
谢谢 标记
【问题讨论】:
package.EvaluateExpression(string expression) 可能值得研究。
标签: tridion tridion-2011 tridion2009
恐怕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 对象。如果更多人觉得有用,我会更新上面的代码。
我怀疑这是不可能的。
Package.EvaluateExpression 可能有用,但顾名思义,它只适用于表达式,而不适用于嵌入表达式(即 TEL)的大型 sn-ps 代码
Engine.GetMediator 需要 Template 并为其返回适当的 Mediator。那么你的问题是IMediator 接口只定义了Transform 方法,它需要Engine、Template 和Package。
我想不出任何优雅的方法来解决这些问题。也许编写自己的 Mediator,但仍然需要一个 Package,而不是字符串,因此您必须首先存储来自另一个 TBB 的基于字符串的 Item。
我的建议:听起来您需要重新设计并找到解决问题的替代方案。
【讨论】: