1

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;
        }

これは機能しますが、遅延フィールドにロードされたパーツに対しても同じことができます。

4

2 に答える 2

5

最初に動的にキャストすると、構文がはるかに単純になります。((dynamic)part.ContentItem).NameOfTheType.NameOfTheField.NameOfTheProperty

于 2013-01-13T09:41:45.387 に答える
0

CMS インターフェースを介してユーザー コンテンツ タイプにフィールドを追加した場合、予期したものとは異なる部分にフィールドが追加された可能性があります。ユーザー コンテンツ タイプにフィールドを追加する場合、既定では、「UserPart」ではなく「User」と呼ばれる新しいパーツにフィールドが追加されます。コンテンツ アイテムのすべての部分を検索するには、次の操作を試してください。

(ImageUploadField.Fields.ImageUploadField)Author.ContentItem.Parts
.SelectMany(p => p.Fields).FirstOrDefault(f => f.Name == "Photo");

または「ユーザー」部分から直接:

(ImageUploadField.Fields.ImageUploadField)Author.ContentItem.Parts
.First(p => p.PartDefinition.Name == p.ContentItem.ContentType).Fields
.FirstOrDefault(f => f.Name == "Photo");
于 2013-01-13T00:48:50.740 に答える