2013-01-22 21 views
2

在處理複合頁面模板項目時,我發現了非常有趣的問題。客戶在自定義開發的應用程序中使用$ {stringvalue-session-or-something-specific},這些應用程序使用XSLT保存並呈現在組件模板中。當嘗試呈現含有保留外表套上的Dreamweaver標識符的組件演示($ {})我已經得到了類似的模板生成器誤差編寫Tridion Dreamweaver標識符作爲輸出包

JScriptException: Expression '""["scopedTarget.personalia"]."" != ""' had error 'Expected identifier' at Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement) at Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToString(String statement)

卸下和更換這種標識符不是溶液由顧客接受的。 我想知道什麼是解決這個問題的最佳解決方案?使用C#代碼來呈現組件演示文稿,可能會創建一些自定義重寫(如果可能是因爲組件演示文稿中有錯誤)。

回答

4

如果客戶在其應用程序中使用JSP EL,並使用相同的${...}語法,並希望將其封裝在其模板中,則會發生類似的情況。

最常見的解決方案是在Dreamweaver模板類似$[...]替換此語法和使用的.Net TBB 後使用字符串替換或正則表達式將其轉換Dreamweaver的模板。

請參閱我的gist瞭解如何實現TBB的示例。

0

正如我所提到的替換語法不是解決方案。我已經通過在Dreamweaver模板之前在單獨的C#tbb中呈現組件呈現來解決此問題。當然,如果允許更改語法,David的建議很有用。

+0

我明白你的問題,即在應用程序中替換標識符是不可接受的,但是確實只需在Dreamweaver TBB中替換它們即可。我不明白爲什麼這會成爲您的客戶的問題,因爲它是最終發佈的模板輸出。 我會重申,這個問題在JSP應用程序中經歷了很多,我的解決方案通常被認爲是最佳實踐。我強烈建議不要在c#TBB中渲染布局。 –

+0

組件模板通過XSLT呈現,並且所有標識符都使用XSLT模板編寫,而不是與Dreamweaver一起編寫。僅僅爲了改變這一點,所有現有的應用程序都需要花費大量的時間和精力,這些都不是客戶端支持的。我正在研究頁面模板級別,我必須根據複合原理開發新模板。所以我有問題如何使用複合模板呈現組件呈現,其中CT基於XSLT。你是對的,在C#中渲染布局並不是很好的做法,但現在可以使用... –

1

如果您完全無法更改Dreamweaver模板中的語法(正如我所說的,我不確定是否完全理解/同意其原因),那麼也許您可以切換到使用Razor Mediator進行模板代替?

2

我通常使用此代碼「在模板中啓用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); 
     } 
    } 
} 
+0

如果CT和PT的佈局都是由DWT編寫的,則代碼很有用。在我的情況下,所有的CT都是通過舊的XSLT渲染的,我使用複合模板來創建PT。當試圖在包含DWT標識符的組件演示文稿上調用DWT時,我在@@ RendercomponentPresentation @@ step處得到了錯誤。這意味着如果我將在DWT中使用渲染,而不是在C#中,則我無法訪問正確的輸出。 –

+1

這表明'@@ RenderComponentPresentation()@@'正在評估組件模板的結果。你使用什麼版本的Tridion? –

+0

是的,我覺得Nuno聽起來也很奇怪。我打算稍後檢查行爲。這是正常的嗎? –

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"]."" != ""' had error 'Expected identifier' at Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement) at 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) at Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(Engine engine, Template templateToTransform, Package package) at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package) at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package, TemplateInvocation templateInvocation, Template template) at Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(Engine engine, Template templateToTransform, Package package) at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package) at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package, TemplateInvocation templateInvocation, Template template) at Tridion.ContentManager.Templating.Engine.TransformPackage(Template template, Package package) at Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run() at Tridion.ContentManager.Templating.Debugging.DebugSession.Run() ---Caused by: Expected identifier eval code: Line 1 - Error: Expected identifier

+0

我意識到這是一箇舊的問答,但這應該被編輯到問題中,**不會**作爲答案發布。 (目前它處於非常低質量的審覈隊列中,因爲它不是答案)。 – EJoshuaS