Orchard コードで生成されたモジュールとパーツは、そのドライバー クラスでエディター メソッドを呼び出さないため、パーツ プロパティを表示するエディター テンプレート ビューをロードしません。また、モジュールが作成したカスタム データベース テーブルへの書き込みは行いませんが、関連付けられたコンテンツ アイテムの保存と作成を許可します。
プロジェクトとしてのモジュールはビジュアル スタジオでビルドされ、ドライバーのコンストラクター メソッドにヒットするデバッグを取得できますが、Editor() または Display() または Editor() ポストバックにはヒットしません。
codegen およびコード生成拡張モジュールを使用して Orchard モジュールを作成しました。codegen 部分は Code Generations Extensions モジュールからのもので、残りはコア コード生成モジュールからのものです。モジュールを作成し、プロパティを含むコンテンツ パーツを追加し、データ移行を生成しました。
使用したコマンドは次のとおりです。
codegen module "TestModule.Foo"
codegen part "TestModule.Foo" Bar /Properties:Description:string,Broken:bool
codegen datamigration "TestModule.Foo"
私が行った唯一のコード変更は、移行の更新によって型を createable() にすることでした。これが実行されたことを確認し、管理画面で新しいバー レコードを作成するためのコンテンツ タイプ オプションを確認できます。また、placement.info ファイルを手作業で編集して、Parts_Bar_Edit シェイプの配置タグを追加しました。
使用されているすべてのコードは次のとおりです。
Migration.cs:
System.Data の使用; Orchard.ContentManagement.MetaData の使用; Orchard.Core.Contents.Extensions の使用; Orchard.Data.Migration を使用します。 名前空間 TestModule.Foo { 公開クラスの移行: DataMigrationImpl { public int Create() { // テーブル BarRecord の作成 SchemaBuilder.CreateTable("BarRecord", テーブル => テーブル .ContentPartRecord() .Column("説明", DbType.String) .Column("Broken", DbType.Boolean) ); 1 を返します。 } public int UpdateFrom1() { ContentDefinitionManager.AlterTypeDefinition("BarRecord", cfg => cfg .Creatable() ); 2 を返します。 } } }
Placement.info:
<配置> <Place Parts_Bar="Content:5"/> <Place Parts_Bar_Edit="Content:7.5" /> </配置>
モデル/Bar.cs:
オーチャードを使用。 Orchard.ContentManagement の使用; 名前空間 TestModule.Foo.Models { public class Bar : ContentPart { 公開文字列 説明 { get { return Record.Description; } セット { Record.Description = 値; } } public bool ブロークン { get { return Record.Broken; } セット { Record.Broken = 値; } } } }
モデル/BarRecord.cs
オーチャードを使用。 Orchard.ContentManagement.Records の使用; 名前空間 TestModule.Foo.Models { public class BarRecord : ContentPartRecord { パブリック仮想文字列の説明{get; 設定; } public virtual bool ブロークン{ get; 設定; } } }
Handlers/BarHandler.cs
JetBrains.Annotations の使用; Orchard.ContentManagement.Handlers の使用; Orchard.Data の使用; TestModule.Foo.Models の使用; 名前空間 TestModule.Foo.Handlers { [暗黙的に使用] public class BarHandler : ContentHandler { public BarHandler(IRepository リポジトリ) { Filters.Add(StorageFilter.For(リポジトリ)); } } }
ドライバー/BarDrivers.cs
JetBrains.Annotations の使用; Orchard.ContentManagement の使用; Orchard.ContentManagement.Drivers の使用; Orchard.Localization の使用; Orchard.UI.Notify の使用; TestModule.Foo.Models の使用; 名前空間 TestModule.Foo.Drivers { [暗黙的に使用] public class BarDriver : ContentPartDriver { プライベート読み取り専用 INotifier _notifier; private const string TemplateName = "パーツ/バー"; public Localizer T {get; 設定; } public BarDriver(INotifier 通知機能) { _通知者 = 通知者; T = NullLocalizer.Instance; } protected override DriverResult Display(バー部分、文字列 displayType、動的 shapeHelper) { return ContentShape("Parts_Bar", () => shapeHelper.Parts_Bar(ContentItem: part.ContentItem)); } protected override DriverResult Editor(バー部分、動的形状ヘルパー) { return ContentShape("Parts_Bar", () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model:part, Prefix: Prefix));` } protected override DriverResult Editor(Bar パーツ、IUpdateModel アップデーター、動的 shapeHelper) { if (updater.TryUpdateModel(part, Prefix, null, null)) { _notifier.Information(T("バーが正常に編集されました")); } そうしないと { _notifier.Error(T("Bar 更新中にエラーが発生しました!")); } Editor(part, shapeHelper) を返します。 } } }
ビュー/EditorTemplates/パーツ/Bar.cshtml
@model TestModule.Foo.Models.Bar @Orchard.ContentManagement を使用します。 @{ Layout.Title = T("編集バー").ToString(); } <フィールドセット> <legend>@T("バーの設定")</legend> <div> @Html.LabelFor(m => m.Description, @T("Description")) @Html.EditorFor(m => m.Description) @Html.ValidationMessageFor(m => m.Description, "*") </div> <div> @Html.LabelFor(m => m.Broken, @T("Broken")) @Html.EditorFor(m => m.Broken) @Html.ValidationMessageFor(m => m.Broken, "*") </div> </フィールドセット>
ビュー/パーツ/Bar.cshtml
@モデル動的
私は Orchard 1.6.1 を使用していますが、1.7rc でも同じ動作を再現できました。この時点で私は完全に困惑し、イライラしているので、どんな助けも大歓迎です. ありがとう。