2012-06-25 84 views
3

我有一個頁面模板,可以在頁面底部的div中輸出三個組件。所有這三個組件演示文稿都使用相同的架構和Dreamweaver組件模板。如何將參數傳遞給組件(Dreamweaver)模板?

我想根據它們是該div中的第一個組件還是最後一個,稍微區別這些組件演示文稿 - 基本上我想爲每個CSS類添加「first」和「last」CSS類組件演示。

我想在模板構建塊中動態地爲組件演示文稿設置「參數」。下面是我到目前爲止(不工作,只是給你什麼,我試圖做一個想法)有:

public override void Transform(Engine engine, Package package) 
{ 
    var page = GetPage(); 
    var wantComponents = 
     from c in page.ComponentPresentations 
     where c.ComponentTemplate.Title == "Content highlight" 
     select c; 
    if (wantComponents.Count() > 0) 
    { 
     // pseudocode - won't compile! 
     wantComponents.First().ComponentTemplate.Parameters["myCssClass"] = "first"; 
     wantComponents.Last().ComponentTemplate.Parameters["myCssClass"] = "last"; 
    } 
    ... 

在我的Dreamweaver模板(再次,不工作,只是給你什麼,我試圖做的)一個想法:

<div class="block @@[email protected]@"> 
    ... 
</div> 

如何動態的「第一」 CSS類添加到頁面上的第一個組件演示,以及「最後」 CSS類到頁面上的最後一個組件展示?

回答

6

喬治,這並不是一個壞問題。

如果您將組件的模板從組件模板中取出並放入頁面模板中,則無需將參數從頁面模板傳遞到組件模板中。然後設置CSS類第一部分介紹很簡單:

<div class="<!-- TemplateBeginIf cond="TemplateRepeatIndex==0" -->myFirstCssClass<!-- TemplateEndIf -->"></div> 

設置上的最後一個組件外觀一類是更有趣一點,有幾種方法可以做到這一點:

  1. 自定義的Dreamweaver函數,例如TemplateRepeatCount()。然後你可以在頁面模板中做這樣的事情: <!-- TemplateBeginRepeat name="Components" --><div class="<!-- TemplateBeginIf cond="TemplateRepeatIndex==TemplateRepeatCount()-1" -->lastCssClass<!-- TemplateEndIf -->">@@RenderComponentPresentation()@@</div><!-- TemplateEndRepeat -->
  2. 另一種方法是編寫一個基本的TBB來計算組件演示並將總數降到包上,然後您可以將TemplateRepeatIndex與此數字進行比較。

兩個#1以上#2在我的文章在這裏描述:http://www.tridiondeveloper.com/more-fun-with-dreamweaver-templates-templaterepeatcount

最後,這是一種方法更內嵌具體是什麼,你問哪裏組件模板實際上看起來成頁的範圍以確定它是否是列表中的最後一個組件展示。這不是我最喜歡的,因爲使用TemplateBuilder進行調試並不那麼容易(因爲當您運行CT時,您沒有PT,因此組件的顯示計數在此範圍內不存在)。

public class IsLastCP : TemplateBase 
{ 
    private string MY_SCHEMA = "My Component's Schema Title"; 

    public override void Transform(Engine engine, Package package) 
    { 
     this.Initialize(engine, package); 

     //in the page template. 
     Page page = this.GetPage(); 
     if (page == null) 
     { 
      //this TBB is being executed either in Template Builder or a dynamic component presentation. 
      // so we just don't do anything. 
     } 
     else 
     { 
      IList<ComponentPresentation> cpList = page.ComponentPresentations; 

      int cpCount = 0; 
      int thisCPIndex = -1; 

      Component thisComponent = this.GetComponent(); 

      foreach (ComponentPresentation cp in cpList) 
      { 
       Component comp = cp.Component; 
       if (comp.Schema.Title == MY_SCHEMA) 
       { 
        if (comp.Id.Equals(thisComponent.Id)) 
         thisCPIndex = cpCount; 
        cpCount++; 
       } 
      } 

      if (thisCPIndex == cpCount-1) 
      { 
       package.PushItem("IsLastCP", package.CreateStringItem(ContentType.Text, "true")); 
      } 
     } 
    } 

爲此,您將需要威爾的著名TemplateBase類,你可以從他的「有用的積木」,可從SDLTridionWorld擴展獲得。顯然,你需要在你的組件模板領先您的Dreamweaver TBB的這個TBB調整我你的架構名稱所提供的代碼等

跌落然後使用它的輸出是這樣的:<!-- TemplateBeginRepeat name="IsLastCP" -->class="myLastCSSClass"<!-- TemplateEndRepeat -->

注意:你不不需要在這裏執行TemplateBeginIf,並在IsLastCP上顯式檢查true/false。如果問題CP是最後一個,那麼這個變量將出現在包中,並且TemplateBeginRepeat子句將進入。

+0

您是否重命名變量或其他? :) 該代碼應該如何工作(thisCPIndex = thisCPIndex,thisCPIndex == thisCPIndex-1等)? –

+0

謝謝彼得。是的,那正是發生了什麼事。我不得不在這裏重新命名一些變量。我更新了代碼。 –

+0

感謝那個Nickoli的堆 - 我最終只是在我的頁面模板中渲染包含的div,它工作正常。 – George

0

你也可以使用上下文變量來做這種事情。您無法直接從DWT執行此操作,因此這可能意味着可能會編寫一個函數源,或者可能將DWT替換爲寫入輸出的程序集TBB。如果這種方法適合您的設計,您可以在頁面模板中將一個變量寫入engine.PublishingContext.RenderContext.ContextVariables,指示組件渲染是否爲第一個,然後讓組件模板讀取它以確定要生成的輸出。

通常,這個想法是在頁面模板中寫入變量並在組件模板中讀取它們。這應該足以讓您避免將組件模板問題移動到頁面模板中,當然,管道的數量可能會讓您感到厭煩。對於更極端的情況,這可能是to get values from the component template to the page template,但是你的管道更多,所以想要這樣做可能是一種設計氣味。

相關問題