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.

Другие вопросы по тегам