2011-05-04 49 views
0

讓我具體的例子說明一下:有不同Sitecore的項目類型不同的顯示

我有3種類型(模板)的消息:新的,外部新聞,產品發佈;

我想以不同的方式在主頁上顯示它們。

現在我做一個簡單的在我的xsl:

<xsl:variable name="upcoming" select="./item[sc:formatdate(sc:fld('End Date',.),'yyyyMMdd') >= sc:formatdate($now,'yyyyMMdd')" /> 
<xsl:for-each select="$upcoming"> 
    <div> 
     <h2> 
      <sc:text field="Name" /> 
     </h2> 
     <p> 
      <sc:text field="Description" /> 
     </p> 
    </div> 
</xsl:for-each> 

拳的解決方案是類似的東西(很顯然,我不知道真正的語法):

<xsl:choose> 
    <xsl:when test="template = 'external news'"> 
     <!-- something --> 
    </xsl:when> 
</xsl:choose> 

但更好的是一個更加面向對象的方法,並有一個make_body()函數綁定到我可以從我的主頁渲染調用的項目。

或者Sitecore有一種方法來渲染一個可以顯示在任何頁面上的項目;由物品本身處理的渲染?

您認爲如何?


更新

我想我是不夠清楚:

我想在我的主頁上最後的消息框:

<div class="last_news"> 
    <h2>Last News</h2> 
    <!-- Loop Goes here --> 
</div> 

我不同的新聞類型(新,外新聞,產品發佈)當它們在該框中列出時具有不同的外觀:

新:

<div class="news"> 
    <h2><!-- title --></h2> 
    <p><!-- abridged text goes here --><p> 
    <a href="##news url##">read more</a> 
</div> 

外部新聞:

<div class="news external"> 
    <img src="##website logo##"> 
    <h2><!-- title --></h2> 
    <p><!-- abridged text goes here --><p> 
    <a href="##external url##">read more on www.<!-- site name --></a> 
</div> 

產品發佈:

<div class="news product_release"> 
    <div class="float_left"> 
     <img src="##product logo##"> 
     <a href="##product url##">Download now</a> 
     <a href="##product download url##">Download now</a> 
    </div> 
    <h2><!-- title --></h2> 
    <p><!-- abridged text goes here --><p> 
    <a href="##news url##">read more</a> 
</div> 

每個新聞類型都有它不同的領域

  • 新的自己的模板:標題,刪節的文字,全文
  • 外部新聞:標題,刪節的文字,外部網址,網站選擇框
  • 產品發佈:標題,刪節的文字,全文,產品選擇框

我可以做一個sublayouts(的.ascx)或效果圖(.xslt),但現在我想知道如何在我的循環中顯示那些

我可以在我的循環中放置一個佔位符,並且Sitecore會知道佔位符必須由當前項使用嗎?

+0

您是否希望堅持使用XSLT(yuck!)或願意切換到C#並使用子佈局(用戶控件)或編譯的Web控件? – 2011-05-05 03:42:34

+0

您尚未提供正在處理的XML文檔。如果你這樣做,我會向你展示一個簡單而優雅的XSLT解決方案。 – 2011-05-05 03:50:39

+0

我強烈建議你使用C#並使用子佈局。 xsl適合簡單的解決方案,但是當事情變得更加複雜時,您可能需要切換到子佈局/用戶控件。 – Younes 2011-05-05 07:28:37

回答

0

我認爲這個答案完全取決於你要展示什麼樣的內容。您可以將任何您想要的內容放在Rich文本字段中,並使其對該項目是唯一的。這是迄今爲止最簡單的解決方案,對我來說最有意義......但也許我誤解了你想要做的事情。但我相當肯定你不想在XSLT中這樣做。 (當然,我有偏見......我在XSLT中沒有做任何事情)

如果我真的必須根據模板使渲染行爲有所不同,那麼我會讓它成爲一個帶有代碼隱藏的子佈局。把業務邏輯放在XSL中是沒有意義的。

也可以動態地將子佈局添加到佔位符。畢竟,這就是Sitecore在後端執行的操作......因此,您可以根據您正在顯示的(隨機)項目指定特定的子佈局,並將數據源設置爲您的項目。

3

也許我失去了一些東西,但是你不能只是有一個渲染(xslt)og sublayout(asp.net控件)每個模板綁定到該模板的演示文稿?

而不是創建一個「複雜」,如果或切換處理不同的模板,使一個簡單的每個模板?

例如,你有這些asp.net控件:

  • new.ascx
  • external_news.ascx
  • product_release.ascx

否則,如果您喜歡使用XSLT 1,因爲他們有很多的共享字段,您可以使用

<xsl:template match="*"> 

功能。我想你會這樣寫:

<xsl:template match="@template='external news'"> 
    //do something specific for the 'external news' template 
</xsl:template> 

然後你只是爲每個模板製作一個。警告我不是100%確定@ template ='x'是正確的語法。

我希望這會有所幫助。

+0

你的拳頭解決方案是我正在尋找的,但我似乎無法找到如何輸出一個綁定sublayont在我每個。 – Kevthunder 2011-05-06 12:42:50

+0

但是你有不同的模板,每種類型?即是否有模板「外部新聞」,「產品發佈」等或僅有不同的主/分支? 如果存在不同的模板,則只需設置這些模板的佈局(在標準值子項上)。 IE瀏覽器。使用佔位符添加子佈局(.ascx)或渲染(.xslt)的佈局(.aspx頁面)。這只是標準的Sitecore的東西。 如果它是不同的主/分支(即相同的模板),那麼我建議把它做爲繼承的模板。 IE瀏覽器。製作一個「主」新聞模板,並與其他模板一起繼承。 – Holger 2011-05-09 10:48:55

+0

是的,我可以爲每個模板製作一個子佈局(.ascx)或渲染(.xslt)。但我不想顯示**一個**項目,但最後** 10 **添加項目。我不知道如何在許多項目列表中顯示這些子佈局。 – Kevthunder 2011-05-11 19:07:02