2012-06-25 5 views
3

У меня есть шаблон страницы, который выводит три компонентные презентации в div внизу страницы. Все три из этих презентаций компонентов используют одну и ту же схему и шаблон компонента Dreamweaver.Как передать аргументы в шаблоны компонентов (Dreamweaver)?

Я хотел бы немного стилизовать эти презентации компонентов на основе того, являются ли они первым компонентом в этом div или последним - в основном я бы хотел добавить «первый» и «последний» классы 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

Не плохой вопрос вообще Джордж.

Если вы берете свои div из шаблона компонента и помещаете их в шаблон страницы, вам не нужно передавать аргументы из шаблона страницы в шаблон компонента. Тогда установка класса 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. Очевидно, что вам нужно настроить код я предоставил ваше имя схемы и т.д.

падения этого TBB впереди вашего Dreamweaver TBB в шаблоне компоненты затем использовать его вывод, как это: <!-- TemplateBeginRepeat name="IsLastCP" -->class="myLastCSSClass"<!-- TemplateEndRepeat -->

Примечание: Вы не Здесь не нужно делать TemplateBeginIf и явно проверить true/false на IsLastCP.Если рассматриваемый CP является последним, тогда эта переменная будет присутствовать в пакете, и в нее войдет предложение TemplateBeginRepeat.

+0

Вы переименовали переменную или что-то еще? :) Как этот код должен работать (thisCPIndex = thisCPIndex, thisCPIndex == thisCPIndex-1 и т. Д.)? –

+0

Спасибо, Питер. Да, это именно то, что произошло. Мне пришлось переименовать некоторые переменные для публикации здесь. Я обновил код. –

+0

Спасибо за кучи за то, что Nickoli - я закончил просто рендеринг содержащихся divs в моем шаблоне страницы, который отлично работает. – George

0

Вы также можете делать подобные вещи с использованием переменных контекста. Вы не можете сделать это непосредственно из DWT, поэтому это означало бы, возможно, запись источника функции или, возможно, замену DWT на сборку TBB, которая записывает на вывод. Если такой подход подходит к вашему дизайну, вы можете просто написать переменную в engine.PublishingContext.RenderContext.ContextVariables из шаблона страницы, указав, является ли рендеринг компонента первым или нет, а затем попросите шаблон компонента прочитать его, чтобы определить, какой результат следует произвести.

В общем, идея состоит в том, чтобы писать переменные в шаблоне страницы и читать их в шаблонах компонентов. Этого должно быть достаточно, чтобы вы не могли перемещать проблемы шаблонов компонентов в шаблон страницы, хотя, конечно, количество сантехники могло бы вас отключить. Для более экстремальных случаев возможно to get values from the component template to the page template, но тогда у вас есть еще больше сантехники, поэтому желание сделать это вообще может быть дизайнерским запахом.

Смежные вопросы