まず、ウィジェットとレイヤーを調べてみてください。認証されたユーザー用のレイヤーと匿名ユーザー用のレイヤーを定義し、それらのレイヤーにウィジェットをアタッチして、目的を達成することができます。これは、これを達成するための最良の方法かもしれません。これを行う方法の例については、Orchard のドキュメントを参照してください。
カスタムコントローラーと多くのカスタムロジックを使用する前に、同様のことを行いました。私の特定の要件のため、ウィジェットとレイヤーはこれには機能しません。ページ上のすべてのコンテンツは、いくつかの入力に応じて変更する必要があり、ウィジェットとレイヤーはこれにはあまり適していませんでした。私がしたことは、カスタムコントローラーと、対応する優先度の高いルートを作成することでした (したがって、ルートは、ホームページになりたい他のすべてよりも優先されます)。私は IHomePageProvider をまったくいじりませんでした。
コントローラー アクションで、必要なデータを取得し、必要な形状を作成して、次のような結果を返しました。return new ShapeResult(this, homePageShape);
homePageShape
return ステートメントの直前で、次のように構成されます。
// Create personalized home page shape:
var homeShape = _orchardServices.New.CustomHome(
SomeShape1: someShape1
, SomeShape2: someShape2
, SomeModel1: someModel1
...
);
これにより CustomHome という形状が作成され、orchard はモジュールのビュー フォルダーで CustomHome.cshtml というテンプレートを自動的に探します。
いくつかの形状を作成しました (上記のすべての「someShapeX」変数)。ほとんどの場合、BuildDisplay() メソッドを介してコンテンツ パーツから作成されます。コンテンツ パーツは IContentManager を使用してクエリされ、図形は次のように作成されます (この例はスライド ショーの図形です)。
dynamic sliderShape = _contentManager.BuildDisplay(sliderPart, "Detail");
ユーザーがログインしているかどうかに応じて、コントローラーにロジックを配置して、必要な形状を作成できます。 CustomHome.cshtml では、次のような形状をレンダリングします。
@Display(Model.SomeShape1)