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.まとめ
説明は以上となります。誤りや指摘点があればご連絡ください。また例によって テストはしっかりしていないのでご注意ください。
さんのコメント: さんのコメント: