我正在尝试在Dreamweaver模板中使用Get Label TBB,该模板解析%%LabelKey%%
之类的表达式,并使用存储在发布元数据中的Component中的值替换它们。
我正在尝试使用标签来存储绝对网址(例如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)at Tridion.ContentManager.Session.GetObject(String uri)at Tridion.ContentManager.Session.IsExistingObject(String uri)at Tridion.ContentManager.Templating.Engine.GetObject(会话会话, String itemUriOrWebDavUrl)at Tridion.ContentManager.Templating.Engine.GetObject(字符串 itemUriOrWebDavUrl)at Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveWebDavUrl(字符串 urlToResolve,String webDavBaseUrl,Engine engine)at Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveTemplateBinaries(发动机 引擎,包装包,TcmUri baseItemTcmUri, ExtractBinariesContentWrapper contentWrapper)at Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.Transform(发动机 引擎,包装) Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.RegisterTemplateBinaries(包 package,String baseItemTcmUri,String templateString)at Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(发动机 引擎,模板templateToTransform,包装)at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板 模板,包装) Tridion.ContentManager.Templating.Engine.InvokeTemplate(包 包,TemplateInvocation templateInvocation,模板模板)
在 Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(发动机 引擎,模板templateToTransform,包装)at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板 模板,包装) Tridion.ContentManager.Templating.Engine.InvokeTemplate(包 包,TemplateInvocation templateInvocation,模板模板)
在Tridion.ContentManager.Templating.Engine.TransformPackage(模板 模板,包装) Tridion.ContentManager.Templating.Engine.TransformItem(模板 模板,IdentifiableObject itemToRender)at Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run()
在Tridion.ContentManager.Templating.Debugging.DebugSession.Run()
答案 0 :(得分:3)
上传DWT时,Tridion会尝试将DWT中的<img src=...
映射到多媒体组件。需要执行此步骤以确保DWT与BluePrinting一起正常工作(需要将值存储为TCM URI) AND 始终可在Dreamweaver中查看(需要文件路径)。
要执行此映射,Tridion会在任何src
或href
属性(以及任何CSS导入或url()
构造)中获取路径,并在该位置查找多媒体组件相对于DWT。
因此,如果存储在/Building Blocks/System/Designs/My Page Design
下的DWT并且它包含:
<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后将该转义序列转换回%%。在您的情况下,只选择一个非冲突的转义语法就足够了。
答案 1 :(得分: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>
也许有一个原因你没有这样做,在这种情况下请使用Franks解决方案。