2014-10-09 118 views
0

我正在開發sitecore多站點。我有多個網站,例如test1,test2,test3,test4。所有配置都在webconfig中。意思是test1,test2,test3等等。所以URL // test1將始終指向那些位於test1/home內部的本地home文件夾。Sitecore多站點網站URL路由

但按照我的要求,我有一個全球文件夾,它與所有網站都是分開的,但其中的頁面對於所有網站都是通用的。

例:

Sitecore的/根/全球/分類/ A

Sitecore的/根/ test1的

Sitecore的/根/ test2的

Sitecore的/根/ TEST3

現在我無法獲得頁面A,如果我在// test1中,並且想要訪問頁面A並且URL應該是// test1/Category/A。

請幫忙。

+0

聽起來像一個很好的候選人[項目克隆(http://www.sitecore.net/Learn/Blogs/Technical-Blogs/John-West- Sitecore的-博客/職位/ 2010/10/Sitecore的-CMS-6-4的克隆。aspx) – jammykam 2014-10-09 09:58:37

+0

請建議我該如何做到這一點。 – Soni 2014-10-09 11:32:45

回答

1

我通常不會重新發佈一個確切的答案,我之前發佈的粉絲,特別是當我剛剛發佈原稿剛剛一個星期前,但以下是從this post

在Sitecore中管理的每個頁面都是一個Sitecore項目。因此,您應該能夠導航到播放器項目的名稱。如果你想在您的文章說,類別的項目都存儲在全局而不是頁面,那麼你就只剩下以下選項:

  1. 查詢字符串:test1/Category?categoryId={ID of Category}

    • 如果這是您選擇的路線然後我會建議使用類別項目的Sitecore ID作爲查詢字符串參數的值。
    • 如果你有其他的ID然後把指定的ID放在那裏,但是它最容易與Sitecore ID
    • 然後你會做什麼是獲取具有在查詢字符串參數中指定的ID(或獲取項目類別ID查詢字符串參數指定的,取決於你採取哪條路線),並在頁面上顯示該類別的數據
      • Sitecore.Context.Database.GetItem(Request.QueryString["categoryId"])
      • categoryItems.FirstOrDefault(categoryItem => categoryItem["Category ID"] == Request.QueryString["categoryId"])
        • 注意,這個假設類別ID是一個字段,而不是Sitecore的ID
        • 如果是Sitecore的ID,然後改變拉姆達使用categoryItem.ID == new ID(Request.QueryString["categoryId"]
      • 不管你使用哪一種,我建議增加null檢查的查詢字符串吸氣

  2. Sublayout參數
    • 如果使用此方法,則查詢字符串將不會更改,並且人們將無法從直接URL進入頁面
    • 該過程與查詢字符串相同,只是您使用Sublayout參數而不是
    • 請注意,您必須在父sublayout或Sitecore的設置這些(這意味着你有一個單獨的頁面爲每個玩家 - 即這將是一個壞的解決方案)

  3. 虛擬物品
    • 這真的是我認爲你正在尋找
    • 這可能是大量的工作,如果你從頭開始做,或者你可以使用the Wildcard Module
    • 如果你從頭做到這一點,你需要一個定製的管道, /或處理該請求
+0

感謝您的解決方案。但這並不是我正在尋找的。我正在尋找我可以獲得項目的URL,然後根據要求定製它 – Soni 2014-10-09 13:49:16

+2

其實,它正是你在找什麼。這是通配符模塊和虛擬物品的功能。您創建的虛假網址實際上指向您將其配置爲指向的項目,而不是指向真實項目。 – 2014-10-09 14:36:12

1

如果Wildcard Module是行不通的,如果這是你的Sitecroe實例中的所有網站的情況下,你可以寫一個自定義項目解析器和插入處理器在內置的項目解析器之後的httpBeginRequest管道中。

這有點從內存中,但應該讓你開始:

namespace Example 
{ 
    public class CategoryItemRewsolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor 
    { 
     public override void Process(HttpRequestArgs args) 
     { 
      if (Sitecore.Context.Item != null) return; // Item has already been resolved 

      if (args.Context.Request.Path.StartsWith("Category")) 
      { 
       Sitecore.Context.Item = Sitecore.Context.Database.GetItem("sitecore/Root/Global" + args.Context.Request.Path); 
      } 
     } 
    } 
} 

你會明顯地想換成自己的路徑(也可能讓他們通過config文件進行配置)。

然後打補丁到管道這樣的:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
     <pipelines> 
      <httpRequestBegin> 
       <processor patch:after="*[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']" type="Example.CategoryItemResolver,Example" /> 
      </httpRequestBegin> 
     </pipelines> 
    </sitecore> 
</configuration>