0

Orchard CMS パーツを使用してモデル化しようとしている複雑なシナリオがあります。

ここで、私の質問を明確にするために簡略化したバージョンを示します。

パーツ名があります。たとえば、PersonPart のプロパティは 1 つだけです: Name. 個人の役割を含む別のパーツがあり、それに PersonRolePart という名前を付け、Role というプロパティを 1 つだけ持ちます。

Orchard では、適切な配管 (ハンドラー、ドライバー、ビューなど) をすべて作成しました。

移行では、2 つの部分を含む Person という名前の新しいコンテンツ タイプを作成しました。

ContentDefinitionManager.AlterTypeDefinition("Person", cfg => cfg
                       .WithPart("PersonPart")
                       .WithPart("PersonRolePart")
                       .WithPart("CommonPart")
                       .Creatable(false)  );

これまでのところ、新しい人を作成して両方の部分を編集できます。

私が持っている別の部分は、上で定義した PersonRoleParts の 1 つにバインドされている ServicePart です。

今質問:

レポート目的で、PersonRole によってすべてのサービスを取得し、そのロールに属する人物の詳細を取得する必要があります。つまり、上記で定義した Person 複合型で使用されるすべての (実際には 1 つだけ) PersonPart を取得する必要があります。

どうやってするか?

果樹園以外の世界では、2 の間に単純な 1 対 1 の関係を作成します。

これまでの私の(失敗した)試みは、 PersonRoleRecord_Id フィールドを PersonPartRecord に追加し、 PersonRecord_Id を Person ロールに追加することでした...しかし、どちらも自分の部分だけを見るため、ドライバーまたはハンドラーで正しいIDに設定する方法がわかりません。

ドライバーからコンテンツ タイプの他のフェロー パーツのインスタンスを取得することは可能ですか?

個人と役割をマージすることはできません。シナリオはそれよりも複雑で、異なる目的のために同じ人の部分と 3 つの異なる役割のような部分が必要であり、共通の人物データが 3 回重複することを避けたいと考えています。

別のアイデアは、適切なハンドラーを作成することでしたが、私が行ったような仮想コンテンツ タイプのハンドラーを作成する方法がわかりません。

4

1 に答える 1

0

別の問題(検証)に対処した別の質問に関するアドバイスを使用して解決することができました。 Orchard CMS - コンテンツ アイテム ドライバーでモデルが有効かどうかを判断する

したがって、私の解決策は、ハンドラーを両方に追加してパーツをキャストし、適切な参照を他のパーツに設定することでした。

        OnPublishing<PersonPart>((context, part) =>{
            var person = part.As<PersonPart>();
            var role= part.As<PersonRolePart>();
            if (person != null && role != null) {
                if (role.Person == null) {
                    role.Person = person.Record;
                }
            }
        });

この特定のケースでは、1:1 の関係であるため、その組み合わせた部分だけを使用します。少なくとも役割が 1 つのタイプの場合、両方の ID は同じです。役物らしいパーツをいつ作ろうかなぁ。

于 2013-10-09T10:26:46.600 に答える