Sitecore 7 - 在整个子页面中维护基于特定父项的导航
Sitecore 7 - Maintain navigation based on specific parent item throughout subpages
这是一个奇怪的问题,但我认为如果我解释一下会更容易理解:我已经有一段时间没有使用 Sitecore 7 了,我正在为子页面构建侧边导航。这是在站点树中设置子页面的方式:
- 产品(级别 1)
- 产品超级分类(2 级)(不是在
站点——这更多用于组织)
- 产品类别(级别 3)
- 产品列表(4 级)
- 产品(5 级)
如果我在产品着陆页上,那么我会得到所有的产品类别(我已经完成了这个功能)。当我在产品类别页面上时,我获得了所有产品列表(产品类别模板的子项)(此功能有效)。
但是,当我在产品列表页面或产品页面上时,我对如何保持与产品类别页面上相同的导航感到困惑。我知道我需要检查我所在的当前页面的父页面,但我不确定最好的方法。
这是我开始的,它适用于产品类别页面,因为它获取所有产品列表子项和所有产品子项。
private void Page_Load(object sender, EventArgs e)
{
var db = Sitecore.Context.Database;
this.currentItem = Sitecore.Context.Item;
//get the product
var productCategoryItem = db.Items.GetItem(this.currentItem.ID);
var productListings = productCategoryItem.Children
.Where(d => d.TemplateID.ToString() == productListingTemplateID);
ProductCategories.DataSource = productListings;
ProductCategories.DataBind();
}
protected void ProductCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var catItem = e.Item.DataItem as Item;
Repeater categoriesRepeater = e.Item.FindControl("CategoriesRepeater") as Repeater;
var catProducts = catItem.GetChildren();
if (catProducts.ToList().Count == 0)
{
return;
}
categoriesRepeater.DataSource = catProducts;
categoriesRepeater.DataBind();
}
更新:这段代码按照我想要的方式工作,但当我进入产品页面时,我发现它重复而且不够清晰。我无法指定产品项目 ID 或模板 ID,因为产品使用不同的模板(不知道为什么,但这就是它们的设置方式。不过,产品页面是产品列表页面的子项,产品列表页面是子项产品类别页面等):
if (currItem.TemplateID.ToString() == productCategoryTemplateID.ToString())
{
productCategoryItem = db.Items.GetItem(currItem.ID);
}
else
{
if (currItem.TemplateID.ToString() == productListingTemplateID.ToString())
{
productCategoryItem = db.Items.GetItem(currItem.ParentID);
}
else
{
productCategoryItem = db.Items.GetItem(currItem.Parent.ParentID);
}
}
var productListings = productCategoryItem.Children
.Where(d => d.TemplateID.ToString() == productListingTemplateID);
ProductCategories.DataSource = productListings;
ProductCategories.DataBind();
虽然我对如何使用 if 语句执行此操作有想法,但我不希望代码变得重复和乏味。是否可以通过某种 while 循环来完成我想要的?
您似乎正在尝试创建一种方法,根据您当前的上下文项目returns 相关产品列表。一种选择是引入祖先查询(请注意,这使用 C#6 语法进行字符串格式化)
productListings = currItem.Axes.SelectItems($"ancestor-or-self::*[@@templateid='{productCategoryTemplateID}']/*[@@templateid='{productListingTemplateID}']")
仅当产品类别项目可以包含产品列表以外的子项时,才需要查询末尾的模板检查
这是一个奇怪的问题,但我认为如果我解释一下会更容易理解:我已经有一段时间没有使用 Sitecore 7 了,我正在为子页面构建侧边导航。这是在站点树中设置子页面的方式:
- 产品(级别 1)
- 产品超级分类(2 级)(不是在 站点——这更多用于组织)
- 产品类别(级别 3)
- 产品列表(4 级)
- 产品(5 级)
如果我在产品着陆页上,那么我会得到所有的产品类别(我已经完成了这个功能)。当我在产品类别页面上时,我获得了所有产品列表(产品类别模板的子项)(此功能有效)。
但是,当我在产品列表页面或产品页面上时,我对如何保持与产品类别页面上相同的导航感到困惑。我知道我需要检查我所在的当前页面的父页面,但我不确定最好的方法。
这是我开始的,它适用于产品类别页面,因为它获取所有产品列表子项和所有产品子项。
private void Page_Load(object sender, EventArgs e)
{
var db = Sitecore.Context.Database;
this.currentItem = Sitecore.Context.Item;
//get the product
var productCategoryItem = db.Items.GetItem(this.currentItem.ID);
var productListings = productCategoryItem.Children
.Where(d => d.TemplateID.ToString() == productListingTemplateID);
ProductCategories.DataSource = productListings;
ProductCategories.DataBind();
}
protected void ProductCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var catItem = e.Item.DataItem as Item;
Repeater categoriesRepeater = e.Item.FindControl("CategoriesRepeater") as Repeater;
var catProducts = catItem.GetChildren();
if (catProducts.ToList().Count == 0)
{
return;
}
categoriesRepeater.DataSource = catProducts;
categoriesRepeater.DataBind();
}
更新:这段代码按照我想要的方式工作,但当我进入产品页面时,我发现它重复而且不够清晰。我无法指定产品项目 ID 或模板 ID,因为产品使用不同的模板(不知道为什么,但这就是它们的设置方式。不过,产品页面是产品列表页面的子项,产品列表页面是子项产品类别页面等):
if (currItem.TemplateID.ToString() == productCategoryTemplateID.ToString())
{
productCategoryItem = db.Items.GetItem(currItem.ID);
}
else
{
if (currItem.TemplateID.ToString() == productListingTemplateID.ToString())
{
productCategoryItem = db.Items.GetItem(currItem.ParentID);
}
else
{
productCategoryItem = db.Items.GetItem(currItem.Parent.ParentID);
}
}
var productListings = productCategoryItem.Children
.Where(d => d.TemplateID.ToString() == productListingTemplateID);
ProductCategories.DataSource = productListings;
ProductCategories.DataBind();
虽然我对如何使用 if 语句执行此操作有想法,但我不希望代码变得重复和乏味。是否可以通过某种 while 循环来完成我想要的?
您似乎正在尝试创建一种方法,根据您当前的上下文项目returns 相关产品列表。一种选择是引入祖先查询(请注意,这使用 C#6 语法进行字符串格式化)
productListings = currItem.Axes.SelectItems($"ancestor-or-self::*[@@templateid='{productCategoryTemplateID}']/*[@@templateid='{productListingTemplateID}']")
仅当产品类别项目可以包含产品列表以外的子项时,才需要查询末尾的模板检查