Orchard CMS - 使用字段扩展用户 - 在博客中公开值 Post

Orchard CMS - Extending Users with Fields - exposing values in Blog Post

我想扩展用户内容定义以包含可在现有博客的每个博客 post 上查看的简短个人简介和图片。我不确定执行此操作的最佳方法是什么。

我尝试使用这些字段扩展用户内容类型,但我似乎无法在前端使用形状跟踪工具在模型中看到它们。

有没有办法在博客 post 中传递用户形状上的字段?如果是这样,最好的方法是什么?

我也经常这样做,并且总是包含一些自定义功能来实现这一点。

有一种方法可以执行此 OOTB,但这不是最好的 IMO。您始终在任何内容项的 CommonPart 上都有 'Owner' 属性,因此在您的博文视图中,您可以这样做:

@{
    var owner = Model.ContentItem.CommonPart.Owner;
}

<!-- This automatically builds anything that is attached to the user, except for what's in the UserPart (email, username, ..) -->
<h4>@owner.UserName</h4>
@Display(BuildDisplay((IUser) owner))

<!-- Or, with specific properties: -->
<h1>@T("Author:")</h1>
<h4>@owner.UserName</h4>
<label>@T("Biography")</label>
<p>
    @Html.Raw(owner.BodyPart.Text)
</p>
<!-- <owner content item>.<Part with the image field>.<Name of the image field>.FirstMediaUrl (assuming you use MediaLibraryPickerField) -->
<img src="@owner.User.Image.FirstMediaUrl" />

我经常做的是为此创建自定义驱动程序,因此您可以利用 placement.info 并遵循果园的最佳做法:

CommonPartDriver:

public class CommonPartDriver : ContentPartDriver<CommonPart> {

    protected override DriverResult Display(CommonPart part, string displayType, dynamic shapeHelper) {
        return ContentShape("Parts_Common_Owner", () => {
            if (part.Owner == null)
                return null;

            var ownerShape = _contentManager.BuildDisplay(part.Owner);
            return shapeHelper.Parts_Common_Owner(Owner: part.Owner, OwnerShape: ownerShape);
        });
    }
}

Views/Parts.Common.Owner.cshtml:

<h1>@T("Author")</h1>
<h3>@Model.Owner.UserName</h3>

@Display(Model.OwnerShape)

Placement.info:

<Placement>
  <!-- Place in aside second zone -->
  <Place Parts_Common_Owner="/AsideSecond:before" />
</Placement>

恕我直言,对 Orchard 用户进行简单扩展的最佳方法是创建一个 ContentPart,例如"UserExtensions",并将其附加到 Orchard 用户。 这个 UserExtensions 部分可以保存你的字段等。 这样,您的扩展与核心用户就清楚地分开了。

要在前端访问此部分及其字段,只需为要覆盖的特定视图添加一个备用视图。

Is there a way to pass through fields on the User shape in a blog post?

你想展示一张漂亮的照片/简历/任何博文作者吗?如果是这样: 这可能是您的 Content-BlogPost.Detail.cshtml - Alternate

@using Orchard.Blogs.Models
@using Orchard.MediaLibrary.Fields
@using Orchard.Users.Models
@using Orchard.Utility.Extensions
@{
    // Standard Orchard stuff here...
    if ( Model.Title != null )
    {
        Layout.Title = Model.Title;
    }

    Model.Classes.Add("content-item");

    var contentTypeClassName = ( (string)Model.ContentItem.ContentType ).HtmlClassify();
    Model.Classes.Add(contentTypeClassName);

    var tag = Tag(Model, "article");


    // And here we go:
    // Get the blogPost
    var blogPostPart = (BlogPostPart)Model.ContentItem.BlogPostPart;

    // Either access the creator directly
    var blogPostAuthor = blogPostPart.Creator;

    // Or go this way
    var blogPostAuthorAsUserPart = ( (dynamic)blogPostPart.ContentItem ).UserPart as UserPart;

    // Access your UserExtensions part
    var userExtensions = ( (dynamic)blogPostAuthor.ContentItem ).UserExtensions;

    // profit
    var profilePicture = (MediaLibraryPickerField)userExtensions.ProfilePicture;
}
@tag.StartElement
<header>
    @Display(Model.Header)
    @if ( Model.Meta != null )
    {
        <div class="metadata">
            @Display(Model.Meta)
        </div>
    }
    <div class="author">
        <img src="@profilePicture.FirstMediaUrl"/>
    </div>
</header>
@Display(Model.Content)
@if ( Model.Footer != null )
{
    <footer>
        @Display(Model.Footer)
    </footer>
}
@tag.EndElement

希望这对您有所帮助,这是证据: