2011-07-28 97 views
2

因爲我很擔心有關IsItemOfType()功能(read more here)的性能問題,我試圖用GetItemsOfType()功能重寫。什麼GetItemsOfType()sitecore擴展函數返回?

下面是一個代碼:

<xsl:variable name="home" select="ancestor-or-self::item[sc:IsItemOfType('_MenuRoot',.)]"></xsl:variable> 
<xsl:variable name="home2" select="sc:GetItemsOfType('_MenuRoot', ./ancestor-or-self::item)"></xsl:variable>   
<div> 
    <xsl:value-of select="count($home/item)" /> <!-- returns 4 --> 
    <br /> 
     <xsl:value-of select="count($home2/item)" /> <!-- returns 0 ??? --> 
    <br /> 
</div> 

不幸的是GetItemsOfType()功能不是孩子返回項目? 任何想法,爲什麼?

+0

你是否菜單根改變?如果它不變,我會硬編碼。 – marto

+0

@marto,感謝您的迴應,但我不喜歡建議的方法,因爲我正在創建依賴關係並且失去了重用性(如果我理解您的建議權限(通過鍵/ id /名稱引用菜單根項目)) – krul

回答

3

似乎GetItemsOfType()只會查看從該項目的當前模板繼承的模板。所以如果item1是模板t1,並且t1從t2繼承,那麼它只會返回item1,如果你問它是否繼承了t2而不是t1。

你可以編寫自己的代碼。這並不難。你可以這樣做:

public bool InheritsFrom(Item item, ID templateIdToTest) 
    { 
     Template template = TemplateManager.GetTemplate(item); 

     if (template.ID == templateIdToTest) 
     return true; 

     return template.DescendsFrom(templateIdToTest); 
    }