写在前面:
转载请注明出处
-
什么是patch文件? patch文件是一个扩展名为.config的文件,
可以用来在runtime的时候修改Sitecore的配置。文件名称可以为任意,通常放在/App_Config/Include文件夹下,也可以放在更深层下属文件夹下 (譬如/App_Config/Include/CustomSetting/)。 -
patch文件作用原理? Sitecore会读取Sitecore.config文件来对Sitecore在runtime时进行配置。多个patch文件会按一定顺序合并到Sitecore.config文件中,然后合并在一起继而在Sitecore的runtime时起作用。
-
patch文件加入Sitecore.config的顺序?
- patch文件加入顺序类似CSS编译的顺序,即当存在相同配置时, 位置靠后的patch文件里的配置会覆盖位置靠前的patch文件里的配置。
- patch文件先加入/Include根目录下配置文件, 再加入其目录下文件夹中的配置文件
正文目录:
- 创建一个最简单的patch文件, 设定一些常量, 在代码中使用它, 并查看效果
- 创建一个较为复杂的patch文件, 使其对Sitecore固有的Pipleline进行修改
正文:
-
具体步骤:
1). 在Visual Studio的Sitecore项目中, 在App_Config/Include文件夹下, 添加一个新配置文件, 取名为CustomSitecoreSettings.config.
2). 在CustomSitecoreSetting.config里加入如下代码 (这里使用主页的Sitecore路径作为一个例子, 如果是个多网站的Sitecore实例有时会用到特定主页路径):<?xml version=1.0> <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <settings> <!--<setting name="{变量名称}" value="{变量值}"/>--> <setting name="Sitecore Home Path" value="/sitecore/content/Home"/> </settings> </sitecore> </configuration>
3). 在需要使用Sitecore主页路径的地方使用如下代码:
//获取个性化配置的变量 string homeItemPath = Sitecore.Configuration.Settings.GetSetting("Sitecore Home Path");
4). 保存, 编译并发布这个project到安装的Sitecore的路径下
5). 访问使用这个变量的页面测试是否成功
-
想对Sitecore自有的Pipeline进行自定义, 首先要了解想改变的Pipeline处于Sitecore整体过程的哪一步, 然后在对特定的一部进行改变 (补充阅读: Sitecore Pipeline备忘录).
例如 (以下代码也根据此情景为例), 当Sitecore找不到相应的Item时, 我们可以给它提供一个我们想要指定的Item给Sitecore, 这时我们就需要对Sitecore 自有的ItemResolver进行自定义, 并且应该在Sitecore执行完自己的ItemResolver后, 再对其进行自定义, 所以应该使用patch:after。
基本格式为:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <{目标pipeline处于的阶段名称}> <processor patch:after(或before)="processer[@type='{Sitecore自有Pipeline的包括namespace的Class名字},{包含这个Class的assemly的名称}']" type="{自定义的包括namespace的Class的名称, 包括这个Class的assembly的名称},{}"/> </{目标pipeline处于的阶段名称}> </pipelines> </sitecore>
1). 首先在Visual Studio的Sitecore项目中, 在App_Config/Include文件夹下, 添加一个新文件夹, 取名为zzz.CustomPipelines, 在此文件夹中添加一个新的config文件, 取名为xCustomItemResolver.config。使用靠后的字母作为开头是为了让此patch文件尽量在后面加入Sitecore.config, 若之前有相同的patch文件,可以确保覆盖之前的配置从而使用当前配置。
2). 在该文件中写入如下代码:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <httpRequestBegin> <processor patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']" type="Sitecore8Review.Business.CustomPipelines.CustomItemResolver, Sitecore8Review.Business"/> </httpRequestBegin> </pipelines> </sitecore> </configuration>
其中, httpRequestBegin是Sitecore自身ItemResolver发生的pipeline名称, Sitecore8Review.Business是业务逻辑Project的名称, 即编译后的业务逻辑的assembly名称. itecore8Review.Business.CustomPipelines.CustomItemResolver是namespace的名称加Class的名称。
3). 在业务逻辑层新建一个文件夹取名为CustomPipelines, 并在该文件夹中新建一个Class取名为CustomItemResolver.cs
4). 我们将要在Sitecore获得当前Item之后加入一项功能, 即若Sitecore未能找到当前Item (Sitecore.Context.Item为null时), 我们给予Sitecore我们的主页Item. 意思就是当用户访问不存在的页面时, 我们都将用户返回主页 (也可以是任意其他页面, 自定义的404页面应该是最佳实践). 在刚刚创建的CustomItemResolver.cs里写入如下代码来实现:public class CustomItemResolver: HttpRequestProcessor { private string homeItemPath = Sitecore.Configuration.Settings.GetSetting("Sitecore Home Path"); public override void Process(HttpRequestArgs args) { //检验当前Item是不是null //如果不是null, 就什么都不做, 像平常进行即可 //如果是null, 就给Sitecore当前情景提供一个已知存在的Item if(Sitecore.Context.Item == null) { //检验当前数据库是否为null, 因为当Sitecore的Item Resolver Pipeline通过以后,若当前情景Item仍然为null, 则数据库也为null, 例如showconfigs.aspx, 此时无法调用GetItem() if(Sitecore.Context.Database!=null) { //为Sitecore当前情景提供一个已知存在的Item, 这里是Home这个Item //当然也可以做一些其他的事情 Sitecore.Context.Item = Sitecore.Context.Database.GetItem(homeItemPath); } } } }
5). 保存, 编译并发布这个project到安装的Sitecore的路径下
6). 访问任意不存在页面来验证自定义的Pipeline是否成功, 图为一个随机url也显示主页:
7). Troubleshoot: 若不能运行, 访问https://[Sitecore实例名称]/sitecore/admin/showconfig.aspx, 登入, 找到httpRequestBegin, 确保xCustomItemResolver在ItemResolver之后且在下一个Pipeline (这里是DeviceSimulatorResolver)之前。
如果没有在指定位置, 而是在httpRequestBegin Pipeline的最后,并且包含patch:after,如图:
查看patch文件中的xmlconfig后是否有斜杠(/), 这个斜杠很重要,不能省略。
以上就是如何使用patch文件进行Sitecore自定义配置和自定义Pipeline的简单流程。