2016-09-16 30 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}']") 

在查詢結束模板檢查時,才需要如果產品類別項目可以有比其他孩子產品列表