Sitecore 7 -在子页面中维护基于特定父项的导航

本文关键字:于特定 导航 维护 Sitecore | 更新日期: 2023-09-27 18:07:13

这是一种奇怪的问题短语,但我认为它更容易理解,如果我解释:我没有在Sitecore 7相当长一段时间工作,我正在为子页面建立侧导航。以下是在站点树中设置子页面的方式:

  • 产品(一级)
  • 产品超级分类(级别2)(不是在网站——这是更多的组织)
  • 产品类别(三级)
  • 产品清单(四级)
  • 产品(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();
    }

UPDATE:这段代码按照我想要的方式工作,但是当我进入产品页面时,我发现它重复而且不够清晰。我不能指定产品项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循环来完成我想要的吗?

Sitecore 7 -在子页面中维护基于特定父项的导航

看起来您正在尝试创建一个基于当前上下文项返回相关产品列表的方法。一种选择是引入一个祖先查询(注意,这使用c# 6语法进行字符串格式化)

productListings = currItem.Axes.SelectItems($"ancestor-or-self::*[@@templateid='{productCategoryTemplateID}']/*[@@templateid='{productListingTemplateID}']")

查询末尾的模板检查仅在产品类别项可以有产品列表以外的子项时才需要