2

いくつかの追加のコンテンツタイプが設定されたOrchardcmsモジュールがあり、コードを介してAutoRouteコンポーネントを追加しました。すべてが完璧に機能しますが、デフォルトのパーマリンクパターンには満足していません。

私がやろうとしているのは、カスタムパターンを追加し、コンテンツタイプでパブリックプロパティの1つを使用することです。私の場合、カスタムタイプにはClubNameというパブリックプロパティがあり、それを使用したいと思います(ルーティングの観点からはより理にかなっています)。
オーチャードパーツのクラス名は。と呼ばれTrackPartます。

、、、、およびその他のさまざまなバリエーションを試しましたが{Content.TrackPart.ClubName}、何も機能していないようです。{Content.Track.ClubName}{ContentItem.TrackPart.ClubName}{Content.TrackPart.ClubName}

私はオーチャードに本当に慣れていないので、単純なものを見逃している可能性が高いです。
どんな助けでも大歓迎です。

@ Bertrand-le-royからのフィードバックに応えて、サンプルトークンをコピーして独自のトークンを作成しました。これで、ドロップダウンメニューにトークンが表示され、それを選択できます。ただし、ルートパターンはまだ機能していません。

Evaluate()関数のcontext.For使用法を誤解しているとしか思えません。必要なデータが取得されていないようです

これが私がこれまでに持っているものです。

public class TrackPartTokens : ITokenProvider { private readonly IContentManager _contentManager;

    public TrackPartTokens(IContentManager contentManager) {
        _contentManager = contentManager;
    }

    public Localizer T { get; set; }

    public void Describe(dynamic context) {
        context.For("Track", T("Track"), T("Tokens for Track"))
            .Token("ClubName", T("ClubName"), T("The name of the club."))
            ;
    }

    public void Evaluate(dynamic context) {
        context.For<TrackPart>("Track")
            .Token("ClubName", (Func<TrackPart, object>)(field => field.ClubName))
            .Chain("ClubName", "ClubName", (Func<TrackPart, object>)(field =>field.ClubName))
            ;
    }</code>

The above code was based on the DateTimeField token inside the Orchard.Fields module.

context.For("DateTimeField") .Token("Date", (Func)(field => field.DateTime)) .Chain("Date", "Date", (Func)(field => field.DateTime));

4

2 に答える 2

3

私も同じ問題を抱えていました。

いくつかのトラブルシューティングの後、実装を次のように変更することで、自動ルートを機能させることができました(例に合わせて、セットアップでlinq-functionの変更が必要になる場合があることに注意してください)。

トークンクラス:

  • まず、usingSystem.Linqステートメントを追加します。
  • 次に、Evaluate実装を次のように変更します。

    context.For<IContent>("Content")
           .Token("ClubName", (Func<IContent>, object>)(content => 
                content.ContentItem.Parts.OfType<TrackPart>().First().ClubName));
    
  • Migrations.csのAutoroutePart設定でContent-prefixが使用されていることを確認してください。好き:

    .WithPart("AutoroutePart", partBuilder =>
        partBuilder
        .WithSetting("AutorouteSettings.AllowCustomPattern", "true")
        .WithSetting("AutorouteSettings.AutomaticAdjustmentOnEdit", "false")
        .WithSetting("AutorouteSettings.PatternDefinitions",
        @"[{Name:'Track', Pattern:'{Content.ClubName}', 
            Description:'Your description'}]")
        .WithSetting("AutorouteSettings.DefaultPatternIndex", "0"))
    

OrchardソースのTokenManagerクラスには、呼び出しが機能するためにtarget-parameterが「Content」と等しくなることのみを許可するいくつかの問題があるようです:_data.TryGetValue(target、out value)(TokenManager.cs、67行目) )。さまざまな設定を試しましたが、_data-dictionaryには常に「Content」キーしか含まれていません。

于 2012-08-14T12:40:38.853 に答える
2

独自のトークンを作成する必要があります。本当に簡単です。実例をコピーします。

于 2012-07-30T18:56:50.390 に答える