【问题标题】:Tridion 2009 SP1: Dreamweaver Template Error: ConvertURLToPath() can't decode URL: invalid escapeTridion 2009 SP1:Dreamweaver 模板错误:ConvertURLToPath() 无法解码 URL:无效转义
【发布时间】:2012-05-05 09:31:04
【问题描述】:

我正在尝试在 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(会话会话, 字符串 itemUriOrWebDavUrl) 在 Tridion.ContentManager.Templating.Engine.GetObject(字符串 itemUriOrWebDavUrl) 在 Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveWebDavUrl(字符串 urlToResolve,字符串 webDavBaseUrl,引擎引擎)在 Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveTemplateBinaries(引擎 engine, Package package, TcmUri baseItemTcmUri, ExtractBinariesContentWrapper contentWrapper) 在 Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.Transform(引擎 引擎,包包)在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.RegisterTemplateBinaries(包 包,字符串 baseItemTcmUri,字符串模板字符串)在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(引擎 引擎,模板templateToTransform,包包)在 Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板 模板,包包)在 Tridion.ContentManager.Templating.Engine.InvokeTemplate(包 包,模板调用模板调用,模板模板)
在 Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(引擎 引擎,模板templateToTransform,包包)在 Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板 模板,包包)在 Tridion.ContentManager.Templating.Engine.InvokeTemplate(包 包,模板调用模板调用,模板模板)
在 Tridion.ContentManager.Templating.Engine.TransformPackage(模板 模板,包包)在 Tridion.ContentManager.Templating.Engine.TransformItem(模板 模板,IdentifiableObject itemToRender) 在 Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run()
在 Tridion.ContentManager.Templating.Debugging.DebugSession.Run()

【问题讨论】:

    标签: tridion dreamweaver-templates


    【解决方案1】:

    当您上传 DWT 时,Tridion 会尝试将您的 DWT 中的 &lt;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 执行后将该转义序列转换回 %%。在您的情况下,只需选择不冲突的转义语法就足够了。

    【讨论】:

    • 感谢您的回复。我假设您的意思是 src= 和 href=?我将着眼于创建看似明智的解决方案的小型 TBB。
    • 对不起,我有发布我的答案然后改进它的习惯。 ;-) Tridion 确实处理了所有srchref 属性、CSS 导入和CSS url()s。我会更新我的答案。
    • 谢谢@Puf 我已经实现了一个 5 行 TBB 来完成这项工作。
    【解决方案2】:

    @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 解决方案。

    【讨论】:

    • 我没有这样做的唯一原因是因为我认为我的解决方案只适用于标签,这听起来像是另一个合理的解决方案。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2012-05-01
    相关资源
    最近更新 更多