我为所有这些类别创建了不同的页面:书籍、手机、comp 等。现在我想将这种类型的导航菜单(如图所示)放在所有页面中,打开一个页面应该突出显示相应的菜单链接。
我应该创建一个包含文本和链接的模式并使其具有多值性吗?那么我创建一个组件并最终在所有页面中呈现它们?
如果没有,请建议任何其他更好的方法。
我为所有这些类别创建了不同的页面:书籍、手机、comp 等。现在我想将这种类型的导航菜单(如图所示)放在所有页面中,打开一个页面应该突出显示相应的菜单链接。
我应该创建一个包含文本和链接的模式并使其具有多值性吗?那么我创建一个组件并最终在所有页面中呈现它们?
如果没有,请建议任何其他更好的方法。
在 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));
上面的片段实际上只显示了如何向上导航结构组的层次结构。您仍然必须将每个结构组作为链接,可能通过查看 each 的PublishUrl
属性StructureGroup
。
我知道您不是在询问面包屑路径,您的看起来更像是左导航。但是所有导航元素的方法都是相似的:使用 ITemplate 中的 TOM.NET 遍历相关的 Pages 和 StructureGroups,并从中生成导航 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));
另请参阅Nick 的这个很好的示例,他在其中生成了整个站点地图。这更接近您最终需要的内容,但当然还有更多代码(此处无法重现)。Albert 还分享了他对这种方法的一些经验,并提到了替代方案。
如果您使用 ASPX 作为页面类型,下面将描述其他导航逻辑:
创建一个包含重要页面信息(ID、路径、标题...)的导航 xml(包含所有页面)
创建将生成面包屑或任何其他导航的 ascx 控件。作为参数控制应该检索当前页面ID
这样可以减少渲染(发布)时间,导航将在页面加载时渲染。不幸的是,您通过这种方式增加了页面加载时间。这取决于您需要什么更适合您的解决方案。刷新导航 XML 是这种方法的问题之一......