我爲所有這些類別創建了不同的頁面:書籍,手機,比較等。現在我想在所有頁面中放置這種類型的導航菜單(如圖所示),並打開一個頁面應突出顯示相應的菜單鏈接。如何爲SDL Tridion中的不同頁面創建導航菜單?
我應該創建一個包含文本和鏈接並使其多值化的模式嗎?那麼我創建一個組件並最終在所有頁面中渲染它們?
如果不是,請提出任何其他更好的方法來做到這一點。
我爲所有這些類別創建了不同的頁面:書籍,手機,比較等。現在我想在所有頁面中放置這種類型的導航菜單(如圖所示),並打開一個頁面應突出顯示相應的菜單鏈接。如何爲SDL Tridion中的不同頁面創建導航菜單?
我應該創建一個包含文本和鏈接並使其多值化的模式嗎?那麼我創建一個組件並最終在所有頁面中渲染它們?
如果不是,請提出任何其他更好的方法來做到這一點。
如果使用ASPX頁面作爲類型,下面描述的其他邏輯導航:
創建一個XML導航(包含所有頁面)與重要的網頁信息(ID,路徑,標題......)
創建將生成麪包屑或任何其他導航的ascx控件。作爲參數控制應檢索當前頁面ID
在這條路上你減少渲染(出版)的時候,導航將在頁面加載呈現。不幸的是,通過這種方式可以增加頁面加載時間這取決於你的需要什麼是更適合你的解決方案。刷新導航XML是這種方法的問題之一....
產生在外表套上任何導航的最常見的方法是簡單地生成它基於結構組和網頁一個C#模板。
例如可以從模板中容易產生面包屑(或者是C#片段或實施ITemplate
一個類)通過這樣的事:
var pageDocument = package.GetByType(ContentType.Page).GetAsXmlDocument();
var current = new Page(pageDocument.DocumentElement, engine.GetSession());
var breadcrumb = page.Title;
while (current.OrganizationalItem != null)
{
current = current.OrganizationalItem;
breadcrumb = current.Title + " > " + breadcrumb;
}
package.PushItem("breadcrumb",
package.CreateStringItem(ContentType.Text, breadcrumb));
上述片段實際上只顯示瞭如何向上瀏覽結構組的層次結構。您仍然必須將每個結構組作爲鏈接,可能通過查看每個StructureGroup
的PublishUrl
屬性。
我知道你並沒有問一個麪包屑痕跡,你看起來更像是一個leftnav。但所有導航元素的方法都是類似的:使用ITemplate中的TOM.NET遍歷相關的Pages和StructureGroup,並從中生成導航HTML。
要獲取所有頁面的當前StructureGroup列表(和標記當前一個),我希望這樣的事情:
var pageDocument = package.GetByType(ContentType.Page).GetAsXmlDocument();
var current = new Page(pageDocument.DocumentElement, engine.GetSession());
var sg = (StructureGroup) page.OrganizationalItem;
string result = "<ul>";
foreach (var page in sg.GetItems())
{
result += (page.Id != current.Id) ? "<li>" : "<li class='selected'>";
result += page.Title;
result += "</li>";
}
result += "</ul>";
package.PushItem("siblings", package.CreateHtmlItem(result));
另請參閱this great example from Nick where he generates an entire sitemap。這更接近你最終需要的東西,但是當然還有更多的代碼(這裏重複的太多了)。 Albert還分享了一些his experience with this approach and mentions the alternatives。