Tridion 2009 SP1: ошибка шаблона Dreamweaver: ConvertURLToPath() не может декодировать URL: недопустимый escape
Я пытаюсь использовать TBB Get Label в шаблоне Dreamweaver, который анализирует такие выражения, как %%LabelKey%%
и заменяет их значением из компонента, которое хранится в метаданных публикации.
Я пытаюсь использовать метку для хранения абсолютного URL (например, http://www.example.com/), но получаю следующее в Template Builder при попытке запустить шаблон
Ошибка: ConvertURLToPath() не может декодировать URL: неверный escape
Код 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: Ошибка в Engine.Transform Ошибка: ConvertURLToPath() не может декодировать URL: недопустимый escape в Tridion.ContentManager.Session.GetTcmUri(String uri) в Tridion.ContentManager.Session.GetObject(String uri) в Tridion.ContentManager.Session.IsExistingObject(String uri) в Tridion.ContentManager. Строка urlToResolve, String webDavBaseUrl, Engine Engine) в Tridion.ContentManager.Templating.Templates.ExtractBinariesFromHtmlTemplate.ResolveTemplateBinaries (Engine Engine, Пакетный пакет, TcmUri baseItemTcmUri, engineBlate_ThereTempTempTempTempTempTempTempTempTempTeRTeTeRTTentTempent Пакет пакет) в Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Regis terTemplateBinaries (Package package, String baseItemTcmUri, String templateString) в Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform (Механизм ядра, Template templateToTransform, Package package) в Tridion.ContentManager.Templating.Engine.Template.E в Tridion.ContentManager.Templating.Engine.InvokeTemplate (пакет пакета, TemplateInvocation templateInvocation, шаблон шаблона)
в Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform (механизм ядра, Template templateToTransform, пакет Package) в Tridion.ContentManager.Templating.Engine.ExecuteTemplate (шаблон шаблона, пакет Package) в Tridion.ContentManager.Template Пакет пакета, TemplateInvocation templateInvocation, Шаблон шаблона)
в Tridion.ContentManager.Templating.Engine.TransformPackage (шаблон шаблона, пакетный пакет) в Tridion.ContentManager.Templating.Engine.TransformItem (шаблон шаблона, IdentifiableObject itemToRender) в Tridion.ContentManager.Templating.Debugging.Debun().
в Tridion.ContentManager.Templating.Debugging.DebugSession.Run()
2 ответа
Когда вы загружаете DWT Tridion пытается сопоставить это <img src=...
в вашем DWT для мультимедийного компонента. Этот шаг необходим, чтобы убедиться, что DWT отлично работает с BluePrinting (для которого требуются значения, которые хранятся в виде URI TCM) И всегда доступен для просмотра в Dreamweaver (для которого требуются пути к файлам).
Чтобы сделать это отображение, Tridion берет путь в любом src
или же href
атрибуты (а также любой импорт CSS или url()
конструировать) и ищет мультимедийный компонент в этом месте относительно DWT.
Так что, если 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 (знак% используется в качестве escape-символа в URL), но на самом деле это не так.
Большинство людей, сталкивающихся с подобными проблемами, заканчивают тем, что используют альтернативную escape-последовательность в своем DWT и пишут небольшой TBB постобработки, который преобразует эту escape-последовательность обратно в %% после выполнения DWT. В вашем случае достаточно выбрать неконфликтующий escape-синтаксис.
Ответ @Puf объясняет, почему код очень неудачный. В качестве альтернативного подхода вы можете написать CB TBB, который вставит StringItems в пакет под названием "LogoLink" и "LogoLinkTitle", содержащий ваш URL и текст. Затем вы можете использовать новый TBB перед DWT в конвейере, а затем вставить значения, используя стандартный синтаксис 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.