2012-04-17 7 views
1

サービスベースの会社のアポイントを管理するカスタムモジュールを構築しました。現在の機能はすべて管理セクションに含まれています。私は単一のContentItemまたはContentPartを使用していません。すべてのモデルは単純なレコードです。オーチャードカスタムウィジェット(フォーム付き)

私は、フロントエンドから予定にサインアップする機能を公開するウィジェットを作成しようとしています。部分的な表示と、表示とフォームの提出を処理するコントローラーがありますが、フロントエンドのコンテンツゾーンの1つに配置できるウィジェットにどのように結びつけるべきかわかりません。

私はこれを研究するためにかなりの時間を費やしており、それに続く良い方法は見つけられません。 (私はいくつか試してみましたが、最適ではない結果を得ました)

何か提案がありますか?私にとって最良の答えは、モジュールのmigration.csファイルにウィジェットタイプの定義を作成することでした

+0

特定の理由でウィジェットを使用してフォームをフロントエンドに配置する必要がありますか、シェイプを使用できますか?ウィジェットから、部分ビューで@ Html.RenderPartial()を呼び出すことができます。それはかなり簡単なようです(多分私が紛失しているものがあります)。あなたが立ち往生していることや質問がある特定の部分はありますか?オーチャード・ドックのウィジェット作成情報を見ましたか? –

+0

いいえ、ウィジェットである必要はありません。私は問題を解決するためにどのようにシェイプを使用するのか分かりません。 ウィジェットの作成に関するオーチャード・ドックと他のチュートリアルを紹介しました。それらのすべては、私があなたが示唆したように見つけたものを除いて、コンテンツ部分にウィジェットの基盤を置いています。 @ Url.Action( "GetServices"、 "Appointment")が間違ったパスを返すため、@ Html.RenderPartial()を使用しようとしましたが、ビューをレンダリングしている間にキーAjaxの一部の呼び出しが壊れています:http:// localhost :30320/OrchardLocal/Contents/Appointment/GetServicesの代わりに:http:// localhost:30320/OrchardLocal/ServiceManager/GetServices –

+1

ルートを指定して、@ Url.RouteUrl()を使用して、簡単に目的のルートを強制してください。 –

答えて

0

ContentDefinitionManager.AlterTypeDefinition("CreateAppointmentWidget", 
    cfg => cfg 
     .WithPart("WidgetPart") 
     .WithPart("CommonPart") 
     .WithSetting("Stereotype", "Widget")); 

その後/MyModule/Handlers/CreateAppointmentWidgetHandler.csでそのウィジェット用のハンドラを作成します。

public class CreateAppointmentWidgetHandler : ContentHandler 
{ 
    private readonly IRepository<FieldTechRecord> _repository; 

    public CreateAppointmentWidgetHandler(IRepository<FieldTechRecord> repository) 
    { 
     _repository = repository; 
    } 

    protected override void BuildDisplayShape(BuildDisplayContext context) 
    { 
     base.BuildDisplayShape(context); 

     if (context.ContentItem.ContentType == "CreateAppointmentWidget") 
     { 
      CreateAppointmentViewModel model = new CreateAppointmentViewModel(_repository.Fetch(x => x.IsActive)); 
      context.Shape.AppointmentModel = model; 
     } 
    } 
} 

次に、部分ビューを挿入する一致するウィジェットテンプレート/MyModule/Views/Widget-CreateAppointmentWidget.cshtmlを作成します。

@Html.Partial("CreateAppointment", (MyModule.Models.Views.CreateAppointmentViewModel)Model.AppointmentModel) 

上記コードは部分図/MyModule/Views/CreateAppointment.cshtmlを取得します。 Giscardの提案に

おかげで、私はUrl.RouteUrl @使用して()と私は行くための行動とAjaxリクエストを必要な場所を指すようにという名前ルートを定義することにより、CreateAppointment.cshtmlからレンダリングのリンクを修正することができました。

このソリューションの素晴らしい点は、Orchards ContentPart機能を使用するためにモデルを改造することなくウィジェットを作成する方法を提供したことです。

0

ゾーンでテーマを作成してから、@ Display.Shape()を実行するだけで、モジュールからそのゾーンにシェイプを送信できるため、何かが私の頭の中でつながっていません。したがって、BuildDisplayShapeをオーバーライドするためにハンドラを使用することが絶対に必要な場合、私は不思議です。

これは、プレーンなレコード(ContentItemまたはContentPartを使用せず、それらを使用していない場合でも、マイグレーションを通じて1つのレコードを作成する例を示しています)としてモデルを使用する場合です。このような

何か - コントローラー:

public ShapeResult MyShape() 
{ 
    var shape = _orchardServices.New.MyPath1_MyShape(); 
    return new ShapeResult(this, shape); 
} 

は、その後、私は持っているものは何でもコードでMyShape.cshtml形状(例えば不要)を作成します。

注:「ビュー」、「ビュー/アイテム」、「ビュー/パーツ」、「ビュー/フィールド」を使用する代わりに、形状を保存できるパスを追加するカスタムIShapeTemplateHarvesterファイルを使用します。オーチャードの株式)。これは次のようなものです:

注:私はそのコードが自動的には囲まれないことを嫌います。

[OrchardSuppressDependency("Orchard.DisplayManagement 
    .Descriptors.ShapeTemplateStrategy.BasicShapeTemplateHarvester")] 
public class MyShapeTemplateHarvester : BasicShapeTemplateHarvester, 
    IShapeTemplateHarvester 
{ 
    public new IEnumerable<string> SubPaths() 
    { 
     var paths = base.SubPaths().ToList(); 
     paths.Add("Views/MyPath1"); 
     paths.Add("Views/MyPath2"); 
     return paths; 
    } 
} 

は私が私のテーマでIndex.cshtmlを持っていると言います。 2つの選択肢があります(私は両方を使い、デフォルトのプレゼンテーションとしてThemeを使います)。

@*Default Content*@ 

Index.cshtmlモジュールフォルダ内:テーマフォルダ内の

Index.cshtml

@*Special Content overriding Theme's Index.cshtml*@ 
Display.MyPath1_MyShape() 

私はテーマフォルダにIndex.cshtmlでこれを行うことができるということです私のためにさらに良いです:

@*Whatever content*@ 
Display.MyPath1_MySecondShape() 

The /テーマにはMyPath1/ule、テーマが表示されます!私は特別なテーマを持つことができ、複数のモジュール(別々のサイトに配置されている)をテーマにして前後に移動することができます(別のサイトの同じ職種で異なるサービスについてダッシュボードを考える)。

注:

public class MyThemeSelector : IThemeSelector 
{ 
    public ThemeSelectorResult GetTheme(RequestContext context) 
    { 
     if (MyFilter.IsApplied(context)) 
     { 
      return new ThemeSelectorResult { Priority = 200, 
       ThemeName = "MyDashboard" }; 
     } 

     return null; 
    } 

} 

ちょうど私の2つのビット:上記だけのようなIThemeSelector実装してもよいです。

関連する問題