簡體   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