3

我正在尝试在 Dreamweaver 模板中使用 Get Label TBB 来解析表达式,%%LabelKey%%并将其替换为存储在发布元数据中的组件中的值。

我正在尝试使用标签来存储绝对 URL(例如http://www.example.com)但是在尝试运行模板时在模板生成器中得到以下内容

错误:ConvertURLToPath() 无法解码 URL:无效转义

DWT 代码类似于:

<a href="%%LogoLink%%" target="_blank" title="%%LogoLinkTitle%%" class="logo">
    <img src="@@Page.Publication.Metadata.parent_logo@@" width="95" height="24"
         alt="@@parent_logo0.alt@@">
</a>

问题是由%%LogoLink%%. 如果我删除该模板可以正常工作。为什么 Tridion 试图用这个值做一些事情?我认为它只会尝试解决它,如果它是tridion:href

任何帮助表示赞赏。

完整的堆栈跟踪:

引擎:Engine.Transform 中的错误 错误:ConvertURLToPath() 无法解码 URL:Tridion.ContentManager.Session.GetTcmUri(String uri) 在 Tridion.ContentManager.Session.GetObject(String uri) 在 Tridion.ContentManager.Session 的无效转义.IsExistingObject(String uri) 在 Tridion.ContentManager.Templating.Engine.GetObject(Session session, String itemUriOrWebDavUrl) 在 Tridion.ContentManager.Templating.Engine.GetObject(String itemUriOrWebDavUrl) 在 Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveWebDavUrl( Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveTemplateBinaries(Engine engine, Package package, TcmUri baseItemTcmUri, String urlToResolve, String webDavBaseUrl, Engine engine)ExtractBinariesContentWrapper contentWrapper) 在 Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.Transform(Engine engine, Package package) 在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.RegisterTemplateBinaries(Package package, String baseItemTcmUri, String templateString) 在 Tridion.ContentManager.Templating .Dreamweaver.DreamweaverMediator.Transform(Engine engine, Template templateToTransform, Package package) at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package) at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package, TemplateInvocation templateInvocation,模板模板)包包)在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.RegisterTemplateBinaries(包包,字符串 baseItemTcmUri,字符串模板字符串)在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(引擎引擎,模板 templateToTransform,包包)在 Tridion。 Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,TemplateInvocation templateInvocation,模板模板)的 ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包包)包包)在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.RegisterTemplateBinaries(包包,字符串 baseItemTcmUri,字符串模板字符串)在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(引擎引擎,模板 templateToTransform,包包)在 Tridion。 Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,TemplateInvocation templateInvocation,模板模板)的 ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包包)Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包包)处的模板 templateToTransform,包包) Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,模板调用模板调用,模板模板)Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包包)处的模板 templateToTransform,包包) Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,模板调用模板调用,模板模板)
在 Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(引擎引擎,模板 templateToTransform,包包)在 Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包包)在 Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,TemplateInvocation templateInvocation,模板模板)
在 Tridion.ContentManager.Templating.Engine.TransformPackage(模板模板,包包)在 Tridion.ContentManager.Templating.Engine.TransformItem(模板模板,IdentifiableObject itemToRender)在 Tridion.ContentManager.Templating。
Tridion.ContentManager.Templating.Debugging.DebugSession.Run() 上的 Debugging.DebuggingEngine.Run( )

4

2 回答 2

3

当您上传 DWT 时,Tridion 会尝试将<img src=...DWT 中的内容映射到多媒体组件。需要此步骤以确保 DWT 与 BluePrinting(需要将值存储为 TCM URI)一起正常工作并且在 Dreamweaver(需要文件路径)中始终可见。

为了进行这种映射,Tridion 采用任何属性(以及任何 CSS 导入或src构造)中的路径,并在该位置相对于 DWT 查找多媒体组件。hrefurl()

因此,如果存储在 DWT 下/Building Blocks/System/Designs/My Page Design并且它包含:

<img src="../Images/MyHeader.jpg"></img>

然后 Tridion 将查找一个名为的多媒体组件,如果找到匹配项,则/Building Blocks/System/Images/MyHeader.jpg替换该值:src

<img src="tcm:1-23"></img>

在您的 DWT 中,这%%LogoLink%%会导致问题,因为它看起来像是经过 URL 编码的(% 符号在 URL 中用作转义字符),但实际上并非如此。

大多数遇到类似问题的人最终会在他们的 DWT 中使用备用转义序列,并编写一个小的后处理 TBB,在 DWT 执行后将该转义序列转换回 %%。在您的情况下,只需选择一个不冲突的转义语法就足够了。

于 2012-04-24T17:49:27.533 回答
3

@Puf 给出的答案很好地解释了代码失败的原因。作为一种替代方法,您可以考虑编写一个 C# TBB,将 StringItems 插入名为“LogoLink”和“LogoLinkTitle”的包中,其中包含您的 URL 和文本。然后,您可以在管道中的 DWT 之前使用新的 TBB,然后使用标准 DWT 语法插入值,如下所示:

 <a href="@@LogoLink@@" target="_blank" title="@@LogoLinkTitle@@" class="logo">
     <img src="@@Page.Publication.Metadata.parent_logo@@" width="95" height="24" alt="@@parent_logo0.alt@@">
 </a>

Perhaps there is a reason you have not done this, in which case go with Franks solution.

于 2012-04-24T18:22:46.693 回答