設定:
クライアントが自社のメールをコンテンツとして管理できるように、モジュールを作成しています。
人々の実際の電子メール アドレスを公開 Web サイトに掲載することを避けるため、Web サイト ユーザーが電子メールを送信するには、Orchard にフォームを表示させます。それで問題ありません。私の問題 (以下を参照) は、Orchard がWeb サイトの公開部分ではなく、ダッシュボードにコンテンツ アイテムを表示する方法に関連しています。
次に進む:
EmailAddress というコンテンツ タイプを作成しました (下記の migration.cs を参照)。これは基本的に、CorporateEmailPart と呼ばれるコンテンツ パーツの単なるコンテンツ タイプ ラッパーです。
セットアップのその他の関連部分はドライバーです (以下の CorporateEmailPartDriver.cs を参照)。PluralSight.com の Kevin Kuebler のビデオに従って、ドライバーを作成しました。デバッグは、正常に動作していることを示しています。
形状は、私のモジュールの Placement.info ファイルを使用して配置されます。
だから、それがなければすべてうまくいくだろう...
問題:
ドライバーを使用すると、コンテンツ タイプのエディターのシェイプを正しく作成でき、問題なく表示されます。
というか、問題なく表示され、新しい EmailAddress を作成できます。CorporateEmailPart をデータベースに問題なく保存できます。
しかし、新しい EmailAddress コンテンツ タイプを保存するか、既存のものを編集しようとすると、CorporateEmailPart のフィールドが EmailAddress エディターにまったく表示されません。
つまり、POST DriverResult Editor メソッドで GET Editor ContentShape を返すと、コンテンツ タイプの CommonPart のみが表示されます (つまり、ContentItem の所有者フィールド)。CorporateEmailPart データは表示されません。空のテキスト ボックスでさえありません。
他のすべてが機能するので、単純なものが欠けているに違いありません。
しかし、私は何も見えません...!
コード:
Migrations.cs:
using Orchard.ContentManagement.MetaData;
using Orchard.Core.Contents.Extensions;
using Orchard.Data;
using Orchard.Data.Migration;
using Wingspan.CorporateEmails.Models;
namespace Wingspan.CorporateEmails {
public class Migrations : DataMigrationImpl {
public int Create() {
ContentDefinitionManager.AlterTypeDefinition("EmailAddress", builder =>
builder
.WithPart("CommonPart")
.Creatable());
SchemaBuilder.CreateTable("CorporateEmailPartRecord", table =>
table.ContentPartRecord()
.Column<string>("Alias")
.Column<string>("EmailAddress")
.Column<int>("DisplayOrder")
.Column<string>("DisplayTitle")
.Column<bool>("IsDefault"));
ContentDefinitionManager.AlterPartDefinition(typeof(CorporateEmailPart).Name, p => p.Attachable());
ContentDefinitionManager.AlterTypeDefinition("EmailAddress", builder =>
builder
.WithPart(typeof(CorporateEmailPart).Name));
SchemaBuilder.CreateTable("EmailMessageRecord", table =>
table
.Column<int>("Id", col => col.PrimaryKey().Identity())
.Column<int>("CorporateEmailPartRecord_Id")
.Column<string>("Sender")
.Column<string>("Recipient")
.Column<string>("Subject")
.Column<string>("Body")
.Column<string>("TitleAndName")
.Column<string>("Address")
.Column<string>("Telephones"));
return 1;
}
}
}
CorporateEmailDriver.cs
using System.Collections.Generic;
using System.Web.Routing;
using Orchard;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.Data;
using Orchard.Services;
using Wingspan.CorporateEmails.Models;
using Wingspan.CorporateEmails.ViewModels;
using System.Linq;
namespace Wingspan.CorporateEmails.Drivers {
public class CorporateEmailPartDriver : ContentPartDriver<CorporateEmailPart>{
private readonly IRepository<EmailMessageRecord> _repositoryEmailMessage;
private readonly IEnumerable<IHtmlFilter> _htmlFilters;
private readonly RequestContext _requestContext;
private const string TemplateName = "Parts/CorporateEmail";
protected override string Prefix
{
get
{
{ return "CorporateEmail"; }
}
}
public IOrchardServices Services { get; set; }
public CorporateEmailPartDriver(IRepository<EmailMessageRecord> repositoryEmailMessage)
{
_repositoryEmailMessage = repositoryEmailMessage;
}
public CorporateEmailPartDriver(IOrchardServices services, IEnumerable<IHtmlFilter> htmlFilters, RequestContext requestContext) {
_htmlFilters = htmlFilters;
Services = services;
_requestContext = requestContext;
}
protected override DriverResult Display(CorporateEmailPart part, string displayType, dynamic shapeHelper)
{
return ContentShape(TemplateName, () => shapeHelper.Parts_CorporateEmail(CorporateEmailPart: part));
}
//GET
protected override DriverResult Editor(CorporateEmailPart part, dynamic shapeHelper)
{
var model = BuildEditorViewModel(part);
return ContentShape("Parts_CorporateEmail_Edit", () =>
shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}
//POST
protected override DriverResult Editor(CorporateEmailPart part, IUpdateModel updater, dynamic shapeHelper)
{
updater.TryUpdateModel(part, Prefix, null, null);
var model = BuildEditorViewModel(part);
return ContentShape("Parts_CorporateEmail_Edit",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}
#region Private Utilities
private CorporateEmailEditorViewModel BuildEditorViewModel(CorporateEmailPart part)
{
return new CorporateEmailEditorViewModel
{
Alias = part.Alias,
EmailAddress = part.EmailAddress,
DisplayOrder = part.DisplayOrder,
DisplayTitle = part.DisplayTitle,
IsDefault = part.IsDefault,
EmailMessageSummaries = part.EmailMessages.Select(ue => ue.Summary).ToList()
};
}
#endregion
}
}
どんな提案でも大歓迎です。