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.まとめ

説明は以上となります。誤りや指摘点があればご連絡ください。また例によって テストはしっかりしていないのでご注意ください。