2014-10-09 64 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>