Cod*_*der 6 tridion tridion-2011
我为所有这些类别创建了不同的页面:书籍,手机,组合等.现在我想在所有页面中放置这种类型的导航菜单(如图所示),打开页面应突出显示相应的菜单链接.
我应该创建一个包含文本和链接的模式并使其成为多值的吗?那么我创建一个组件,最后在所有页面中渲染它们?
如果没有,请建议任何其他更好的方法.

在Tridion中生成任何导航的最常用方法是简单地在基于结构组和页面的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));
Run Code Online (Sandbox Code Playgroud)
上面的片段实际上只显示了如何向上导航结构组的层次结构.您仍然需要将每个结构组作为链接,可能通过查看每个结构组的PublishUrl属性StructureGroup.
我知道你不是在问一个面包屑的痕迹,你的看起来更像是一个左撇子.但是所有导航元素的方法都是类似的:使用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));
Run Code Online (Sandbox Code Playgroud)
另请参阅Nick的一个很好的例子,他在那里生成一个完整的站点地图.这更接近你最终需要的东西,但当然是更多的代码(在这里重现太多).Albert也分享了他对这种方法的一些经验,并提到了替代方案.
如果您使用ASPX作为页面类型,下面将介绍其他导航逻辑:
使用重要页面信息(ID,路径,标题...)创建一个导航xml(包含所有页面)
创建将生成痕迹导航或任何其他导航的ascx控件.由于参数控制应检索当前页面ID
通过这种方式,您可以减少渲染(发布)时间,导航将在页面加载时呈现.不幸的是,通过这种方式增加页面加载时间.这取决于您的需求什么是更合适的解决方案.刷新导航XML是这种方法的问题之一....
| 归档时间: |
|
| 查看次数: |
1284 次 |
| 最近记录: |