T の Lazy フィールドに頭を悩ませるために、この投稿をフォローしてきました。これは理解していると思いますが、この方法でロードされたパーツの関連するフィールド データを取得するのに問題があります。
目的 - ブログ投稿の著者の写真をブログ投稿に表示する。
- コンテンツパーツ「Content Author」を追加したい
- パーツ エディターは、オーチャード ユーザーのドロップダウン リストとして表示されます。(コンテンツ所有者に関係なく、CMS ユーザーは作成者を選択できる必要があります)
- ユーザー コンテンツ タイプに画像アップロード フィールドを追加しました
- Content Author Part のビューでフロントエンドにユーザーの画像を表示したい
最初の部分では、コンテンツ タイプを作成し、UserPart の遅延フィールドを使用してユーザー名を取得しました。ただし、UserPart の関連フィールドを取得しようとすると。あるようです。
public class ContentAuthorRecord : ContentPartRecord
{
public virtual string AuthorEmail { get; set; }
}
public class ContentAuthorPart : ContentPart<ContentAuthorRecord>
{
internal readonly LazyField<UserPart> Owner = new LazyField<UserPart>();
public string AuthorEmail
{
get { return Record.AuthorEmail; }
set { Record.AuthorEmail = value; }
}
public UserPart Author
{
get { return Owner.Value; }
set { Owner.Value = value; }
}
public string AuthorName
{
get
{
if (Author == null)
return "Riders for health";
else
{
return Author.UserName;
}
}
}
}
public class ContentAuthorHandler :ContentHandler
{
private readonly IContentManager _contentManager;
public ContentAuthorHandler(IRepository<ContentAuthorRecord> repository, IContentManager contentManager)
{
_contentManager = contentManager;
OnActivated<ContentAuthorPart>(SetUpCustomPart);
Filters.Add(StorageFilter.For(repository));
}
private void SetUpCustomPart(ActivatedContentContext content, ContentAuthorPart part)
{
// Setup the getter of the lazy field
part.Owner.Loader(() => _contentManager.Query<UserPart, UserPartRecord>().List().FirstOrDefault(x => x.Email == part.AuthorEmail));
}
}
次のような方法でフィールドにアクセスできると期待しています
(ImageUploadField.Fields.ImageUploadField)Author.Fields.FirstOrDefault(x => x.Name == "写真");
パーツ クラス内で
(これはすべてを少し脆くしますが、フィールド名をハードコーディングしますが、それをどのように行うべきかわかりません)
詳細情報
表示ハンドラに cms (コードではなく) を介して追加された Image フィールドを持つ HeaderPart があります。このようなフィールドをフェッチします。
protected override DriverResult Display(HeaderPart part, string displayType, dynamic shapeHelper)
{
if (part.HeaderType == HeaderType.Full_width_hero_image)
{
var field = (ImageUploadField) part.Fields.FirstOrDefault(f => f.Name == "HeaderImage");
if (field != null)
{
return ContentShape("Parts_Header_ImageHero",
() => shapeHelper.Parts_Header_ImageHero(ImagePath: field.ImagePath, ImageTitle: field.FileName));
}
return null;
}
if (part.HeaderType == HeaderType.Full_width_hero_video)
{
return ContentShape("Parts_Header_VideoHero", () => shapeHelper.Parts_Header_VideoHero(VideoUrl: part.VideoUrl));
}
if (part.HeaderType == HeaderType.Body_width_video)
{
return ContentShape("Parts_Header_VideoBody", () => shapeHelper.Parts_Header_VideoBody(VideoUrl: part.VideoUrl));
}
return null;
}
これは機能しますが、遅延フィールドにロードされたパーツに対しても同じことができます。