2016-09-16 56 views
0

这是一个很奇怪的问题,但我认为如果我解释它会更容易理解:我在Sitecore 7中工作了很长一段时间,致力于构建子页面的侧面导航。这是子页面是如何设置的站点树: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循环完成我想要的功能吗?

回答

1

看起来您正在尝试创建一种方法,该方法根据您当前的上下文项目返回相关产品列表。一个办法是引入一个祖先查询(请注意,这里使用C#6语法格式字符串)

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

在查询结束模板检查时,才需要如果产品类别项目可以有比其他孩子产品列表