0

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 でも同じ動作を再現できました。この時点で私は完全に困惑し、イライラしているので、どんな助けも大歓迎です. ありがとう。

4

1 に答える 1

0

いくつかのこと...

Bar.cs

    public class Bar : ContentPart<BarRecord> {

BarHandler.cs

public BarHandler(IRepository<BarRecord> repository)

そして、移行の部分では、おそらくやりたいことはその部分を変更することだと思います。したがって、次のようになります。

public int UpdateFrom1() {                      

ContentDefinitionManager.AlterPartDefinition("Bar", cfg => cfg
                            .Attachable()
                    );
                    return 2;           
        }

あなたがしているのは、BarRecord と呼ばれるタイプを作成して作成可能にすることであり、実際にパーツをアタッチすることではありません。とか、その部分を付けさせたり。したがって、Bar タイプが必要な場合は、以前と同様に次のようになります。

public int UpdateFrom1() {             

ContentDefinitionManager.AlterPartDefinition("Bar", cfg => cfg
                            .Attachable()
                    );

ContentDefinitionManager.AlterTypeDefinition("BarType", cfg => cfg
                            .Creatable()
                            .WithPart("Bar")

                    );
                    return 2;           
        }

モデルとハンドラーの内容は、コード生成によって行われているはずです。それは少し奇妙です。命名規則に従い、最後に Part を追加する必要があるかもしれません。したがって、「Bar」ではなく「BarPart」です。または、モジュール名を " " で囲んでください。わからない。モジュールが機能しない場合は、モジュールの作成者に連絡してください。彼は一流の男だ

于 2013-07-17T21:20:29.660 に答える