Tridion 2009 SP1:Dreamweaver模板错误:ConvertURLToPath()无法解码URL:无效转义

时间:2012-04-24 17:39:40

标签: tridion dreamweaver-templates

我正在尝试在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()

2 个答案:

答案 0 :(得分:3)

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

要执行此映射,Tridion会在任何srchref属性(以及任何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解决方案。