将Tridion Dreamweaver标识符写为输出包

时间:2013-01-22 08:29:53

标签: tridion tridion-2011

在处理复合页面模板项目时,我发现了非常有趣的问题。客户在其自定义开发的应用程序中使用 $ {stringvalue-session-or-something-specific} ,这些应用程序使用XSLT在组件模板中保存和呈现。当尝试渲染包含保留的Tridion Dreamweaver标识符($ {})的组件演示文稿时,我遇到类似于

的模板生成器错误
  

JScriptException:Expression'“”[“scopedTarget.personalia”]。“”!=“”'有错误'预期标识符'      在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement)      在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToString(String statement)

删除和替换此标识符不是客户可接受的解决方案。 我想知道什么是应对这个问题的最佳解决方案?使用C#代码渲染组件演示文稿,可能会创建一些自定义重写(如果可能,因为我从组件演示中得到错误)。

5 个答案:

答案 0 :(得分:4)

如果客户在其应用程序中使用JSP EL,并使用相同的${...}语法,并希望将其封装在模板中,则会发生类似情况。

最常见的解决方案是使用Dreamweaver模板中的$[...]替换此语法,并在使用字符串替换或正则表达式转换的Dreamweaver模板之后使用.Net TBB

请参阅我的gist以获取执行此操作的TBB示例。

答案 1 :(得分:2)

我通常使用此代码“在模板中启用JSTL”。由于您无法将Tridion更改为使用其他代码标识符,因此需要更改标记。在模板的END处运行此TBB,将$[expression]转换为${expression}

using System;
using System.Text.RegularExpressions;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;

namespace TridionTemplates
{
    [TcmTemplateTitle("Enable JSTL")]
    public class EnableJSTL : ITemplate
    {
        private static readonly Regex JstlRegex = new Regex(@"\$\[.*\]");
        public void Transform(Engine engine, Package package)
        {
            Item outputItem = package.GetByName(Package.OutputName);
            string outputText = outputItem.GetAsString();
            Match match = JstlRegex.Match(outputText);
            while (match.Success)
            {
                String replaceJstl = match.Value.Replace("[", "{");
                replaceJstl = replaceJstl.Replace("]", "}");
                outputText = outputText.Replace(match.Value, replaceJstl);
                match = match.NextMatch();
            }
            outputItem.SetAsString(outputText);
            package.Remove(outputItem);
            package.PushItem(Package.OutputName, outputItem);
        }
    }
}

答案 2 :(得分:1)

如果您绝对无法更改Dreamweaver模板中的语法(正如我所说,我不确定我是否完全理解/同意其原因)那么您可以转而使用Razor Mediator你的模板反而是吗?

答案 3 :(得分:0)

正如我所说,替换语法不是解决方案。我已经通过在Dreamweaver模板之前在单独的C#tbb中呈现组件表示来解决这个问题。当然,如果允许您更改语法,David建议很有用。

答案 4 :(得分:0)

我使用SDL Tridion 2011 SP1 HR1。 TemplateBuilder版本6.1 Build 6.1.0.73。 从下面的DWT代码之前执行的页面中提取组件。

<!-- TemplateBeginRepeat name="Components" --> 

@@ RenderComponentPresentation()@@

<!-- TemplateEndRepeat -->

如果组件演示文稿包含$ {sometext},则从“模板”构建器记录输出错误。

  

JScriptException:Expression'“”[“scopedTarget.personalia”]。“”!=“”'有错误'预期标识符'      在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement)      在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToString(String statement)      at Tridion.ContentManager.Templating.Package.EvaluateExpression(String expression)      at Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.TransformValueReferences(Package package,StringReference templateReference,Regex startTagExpression,String endTag)      at Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.TransformRegions(Package package,String dreamweaverTemplate)      在Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(引擎引擎,模板templateToTransform,包包)      在Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包裹包)      在Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,TemplateInvocation templateInvocation,模板模板)      在Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(引擎引擎,模板templateToTransform,包包)      在Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包裹包)      在Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,TemplateInvocation templateInvocation,模板模板)      在Tridion.ContentManager.Templating.Engine.TransformPackage(模板模板,包裹包)      在Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run()      在Tridion.ContentManager.Templating.Debugging.DebugSession.Run()   ---引起:   预期的标识符   eval代码:第1行 - 错误:预期标识符