URLの最後が / (スラッシュ) で終わるカスタムリンクプロバイダーを作成してみましたので覚書を記載します。
検証環境は次の通りです
- Sitecore CMS 7.2 Update 1
- Visual Studio 2012 で作成
Sitecore 7.2 では、 Sitecore.Speak.config の設定により、既定では LinkProvider として Sitecore.Speak.Client.dll で定義されている、 Sitecore.Providers.LinkProvider が使用されるようになっています。
今回は、上記 LinkProvider を使用して addAspxExtensionオプション が false の場合に / で終わるURLを生成するようなLinkProvider を作成してみます。
1.プログラムとconfigの作成
今回は MyLinkProvider という名前でクラスファイルを作成してみました。ベースクラスとして Sitecore.Providers.LinkProvider を使用しています。サンプルでは addAspxExtension オプションがfalse の場合 URL の最後が / (スラッシュ) になるようにしています。
using Sitecore;
using Sitecore.Diagnostics;
using Sitecore.IO;
using Sitecore.Links;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace v72u1.Web.Fx.Providers
{
/// <summary>
/// Sitecore.Speak.Client.dll に定義されている Sitecore.Providers.LinkProvider
/// をもとにLinkProviderを作成します。
/// </summary>
public class MyLinkProvider : Sitecore.Providers.LinkProvider
{
protected override LinkBuilder CreateLinkBuilder(UrlOptions options)
{
return new MyLinkProvider.MyLinkBuilder(options);
}
public class MyLinkBuilder : Sitecore.Links.LinkProvider.LinkBuilder
{
private UrlOptions _options;
public MyLinkBuilder(UrlOptions options) : base(options)
{
this._options = options;
}
protected override string BuildItemUrl(string serverUrl, string itemPath, string virtualFolder)
{
Assert.ArgumentNotNull(serverUrl, "serverUrl");
Assert.ArgumentNotNull(itemPath, "itemPath");
Assert.ArgumentNotNull(virtualFolder, "virtualFolder");
string text = string.Empty;
if (!serverUrl.EndsWith("/", StringComparison.InvariantCulture))
{
text += '/';
}
bool flag = this.EmbedLanguage();
if (flag && this._options.LanguageLocation == LanguageLocation.FilePath)
{
text = FileUtil.MakePath(text, this._options.Language.Name, '/');
}
text = FileUtil.MakePath(text, itemPath, '/');
if (text.Length > 1)
{
text = StringUtil.RemovePostfix('/', text);
}
if (this._options.EncodeNames)
{
text = MainUtil.EncodePath(text, '/');
}
if (this.AddAspxExtension && text != StringUtil.RemovePostfix('/', virtualFolder) && StringUtil.RemovePostfix('/', text) != StringUtil.RemovePostfix('/', serverUrl))
{
text = text + '.' + "aspx";
}
else if (!this.AddAspxExtension && !text.EndsWith("/"))
{
text = text += "/";
}
if (flag && this._options.LanguageLocation == LanguageLocation.QueryString)
{
text = text + "?sc_lang=" + this._options.Language.Name;
}
return serverUrl + text;
}
}
}
}
プログラムを作成したら ビルドを行い エラーが発生しないことを確認します。
次に、 LinkProvider を変更するためのパッチファイルを作成します。今回は CustoMinkProvider.config という名前で config ファイルを App_Config/Include/Custom/ フォルダーに作成しました。
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<linkManager>
<providers>
<add name="customProvider" type="v72u1.Web.Fx.Providers.MyLinkProvider,v72u1.Web" addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="asNeeded" languageLocation="filePath" lowercaseUrls="false" shortenUrls="true" useDisplayName="false" patch:after="add[@name='sitecore']"/>
</providers>
</linkManager>
<linkManager>
<patch:attribute name="defaultProvider">customProvider</patch:attribute>
</linkManager>
</sitecore>
</configuration>
config ファイルを準備したら動作確認していましょう。
Sitecore RocksのSitecore Explorer から対象のサイトコアの接続を右クリック >> Tools >> Open Expanded Web.config か サイトコアにUIにログインして /admin/ShowConfig.aspx にアクセスしてパッチファイルの コンフィグが上手く適用されているかを確認してみて下さい。
あとは実際にLinkProvider による生成されるリンクが スラッシュ / で終わることを確認します。
2.まとめ
説明は以上となります。誤りや指摘点があればご連絡ください。また例によって テストはしっかりしていないのでご注意ください。