我正在尝试在 Dreamweaver 模板中使用获取标签 TBB,该模板解析%%LabelKey%%
等表达式,并将其替换为存储在出版物元数据中的组件中的值。
我正在尝试使用标签来存储绝对 URL(例如 http://www.example.com),但在尝试运行模板时在模板生成器中收到以下内容
错误:转换网址路径() 无法解码网址:无效转义
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
它才会尝试解决它.
任何帮助表示赞赏。
全栈跟踪:
引擎:引擎中的错误。转换错误:转换URLToPath() 无法 解码网址:在以下位置无效转义 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(Session session, String itemUriOrWebDavUrl) at Tridion.ContentManager.Templating.Engine.GetObject(String itemUriOrWebDavUrl) at Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveWebDavUrl(String urlToResolve, String webDavBaseUrl, Engine engine) at Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveTemplateBinaries(Engine 引擎, 包包, TcmUri baseItemTcmUri, ExtractBinariesContentWrapper contentWrapper) at Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.Transform(Engine 引擎,包包)在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.RegisterTemplateBinaries(Package package, String baseItemTcmUri, String templateString) at Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(Engine 引擎, 模板模板到转换, 包包) at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template 模板,包包)在 Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package 包, 模板调用模板调用, 模板模板)
在 Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(Engine 引擎, 模板模板到转换, 包包) at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template 模板,包包)在 Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package 包, 模板调用模板调用, 模板模板)
at Tridion.ContentManager.Templating.Engine.TransformPackage(Template 模板,包包)在 Tridion.ContentManager.Templating.Engine.TransformItem(Template 模板,IdentifiableObject itemToRender) at Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run()
at Tridion.ContentManager.Templating.Debugging.DebugSession.Run()
当您上传 DWT 时,Tridion 会尝试将 DWT 中的<img src=...
映射到多媒体组件。需要执行此步骤来确保 DWT 在蓝图(需要将值存储为 TCM URI)中正常工作,并且始终可在 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 后将该转义序列转换回 %%。在您的情况下,只需选择一个不冲突的转义语法就足够了。
@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 解决方案。