0

Sitecoreで多言語ソリューションに取り組んでおり、アイテムのDisplayNameプロパティを使用してURLを表し、言語固有のURLを許可したいと考えています。

useDisplayName以下に示すように、web.configプロパティをtrueに設定しました

<linkManager defaultProvider="sitecore">
  <providers>
    <clear />
    <add name="sitecore" 
         alwaysIncludeServerUrl="false"
         encodeNames="true"
         type="Sitecore.Links.LinkProvider, Sitecore.Kernel"
         addAspxExtension="false"
         shortenUrls="true"
         languageEmbedding="asNeeded"
         languageLocation="filePath"
         useDisplayName="true" />
  </providers>
</linkManager>

私はまた、URLのハイフンで<encodeNameReplacements>置き換え%20てきれいなURLを提供できるセクションで遊んでいます-これは興味のある人のために次のように行われます:

<replace mode="on" find=" " replaceWith="-" />

上記の設定をオンにした状態でユーザーがDisplayName内にハイフンを入力すると、Sitecoreが壊れることを除いて、すべて非常に良好です。上記の設定をオフにした場合、ユーザーがDisplayNameにハイフンで区切られた適切な値を入力するようにする必要があります。そうしない%20と、URLに再び厄介なものが表示され始めます...

では、DisplayNameプロパティを検証して、ハイフンの使用を禁止または許可する方法はありますか?

または、さらに良いことに、encodeNameReplacementsが発生したときに実行されるコードにフックする方法はありますか?これは、ユーザーがDisplayNameに好きなものを入力して、その場でこの値をサニタイズできるようにするために理想的です。

4

2 に答える 2

2

これには解決策がありますが、コーディングが必要であり、非常に複雑です。私は以前に多くのプロジェクトでこの種のソリューションを使用しましたが、これを解決する唯一の方法であると私は知っています。

ユーザーフレンドリーではないため、アイテムを保存するときにスペースをハイフンに置き換えたくはありません。私のソリューションは実行時に機能します。

まず、<replace>追加したルールを削除します。

次に、独自のプロバイダーを作成しますLinkProvider(Sitecoreのデフォルトプロバイダーから継承します)。LinkProvider内で、アイテムの表示名を「正規化」するメソッドを作成します(たとえば、ハイフンのスペースを置き換えます)。このメソッドを呼び出しましょうNormalizeDisplayName()。後で必要になるため、公開して静的にします。

これで、Sitecoreですべてのスペースをリンク内のハイフンに置き換えることができました。デフォルトのプロバイダーオプション(addAspxExtension = "false" useDisplayName = "true"など)を使用して構成できる残りの部分

次はItemResolver:SitecoreのデフォルトのItemResolverはアイテムパスを認識しなくなるため、これを修正するために独自のItemResolverを追加します。

を継承するクラスを作成し、デフォルトのItemResolverのにパイプラインSitecore.Pipelines.HttpRequest.HttpRequestProcessorで使用されるように構成します。<httpRequestBegin>

ここで、itemresolverが処理されるときに、最初に要求されたitempathを分割します(「/ category-name / subitem-name」が要求されたと仮定します)。サイトルート(からプル可能)から開始して、アイテムパスの一部に一致するものが見つかるまで、前に作成したメソッドをSitecore.Context.Site使用してアイテム名を正規化しながら、すべての子をループします。NormalizeDisplayName()

したがって、この場合、正規化された表示名「category-name」に一致するものが見つかるまで、Homeアイテムの子をループします。次に、正規化された表示名「subitem-name」のアイテムが見つかるまで、そのアイテムの子に対して同じことを行います。

このようにして、要求されたアイテムを解決でき、元の表示名にすでにハイフンが含まれている場合にも機能します。

非常に複雑で、上記に限定されないため、完全なコード例を提供できないことをお詫び申し上げます。また、URLが適切にフォーマットされていない場合のリダイレクトについて検討し、Sitecoreが破損しないようにマスター/コアデータベースの例外を作成する必要があります。

これがお役に立てば幸いです。

于 2012-04-26T09:00:18.043 に答える
0

.netリフレクター(Sitecore.Shell.Framework.Commands.SetDisplayName)にソースが表示されている場合、実行されているパイプラインはありません。

ハイフンをスペースに置き換えたいので、表示名を作成して保存イベントを作成できます

public void OnItemSaving(object sender, EventArgs args)
    {
        Item item = Event.ExtractParameter(args, 0) as Item;

        item.Appearance.DisplayName = item.Appearance.DisplayName.Replace("-", " ");
    }

イベントの簡単な例

于 2012-04-19T17:37:45.710 に答える