繁体   English   中英

将Tridion Dreamweaver标识符写为输出包

[英]Write Tridion dreamweaver identifier as output package

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

JScriptException:表达式'“” [“ scopedTarget.personalia”]。“”!=“”'在Tridion.ContentManager.Templating的Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String语句)发生错误“ Expected identifier”。 Expression.JScriptEvaluator.EvaluateToString(String语句)

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

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

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

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

我通常使用此代码“在模板中启用JSTL”。 由于您无法将Tridion更改为使用其他代码标识符,因此需要更改标记。 在模板末尾运行此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);
        }
    }
}

如果您绝对不能更改Dreamweaver模板中的语法(如我所述,我不确定我是否完全理解/同意这样做的原因),那么也许可以改为使用Razor介体进行模板制作?

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

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

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

@@ RenderComponentPresentation()@@

<!-- TemplateEndRepeat -->

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

JScriptException:Expression'“”[“scopedTarget.personalia”]。“”!=“”'在Tridion.ContentManager.Templating的Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String语句)中出现错误'Expected identifier'。 Tridion的Tridion.ContentManager.Tempaging.Dreamweaver.DreamweaverMediator.TransformValueReferences(包包,StringReference templateReference,Regex startTagExpression,String endTag)中的Tridion.ContentManager.Templating.Package.EvaluateExpression(String表达式)中的Expression.JScriptEvaluator.EvaluateToString(String语句) .ContentManager.Templating.Dreamweaver.DreamweaverMediator.TransformRegions(包package,String dreamweaverTemplate)在Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(Engine engine,Template templateToTransform,Package package)的Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,打包程序包)位于Tridion.ContentManager.Templating.Engine.InvokeTemplate(P Tridion的Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包软件包)中的Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(Engine engine,Template templateToTransform,Package package)的ackage包,TemplateInvocation templateInvocation,Template template位于Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run()的Tridion.ContentManager.Templating.Engine.TransformPackage(模板模板,包软件包)中的.ContentManager.Templating.Engine.InvokeTemplate(包软件包,TemplateInvocation templateInvocation,模板模板) Tridion.ContentManager.Templating.Debugging.DebugSession.Run()---引起:预期的标识符eval代码:第1行 - 错误:预期的标识符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM