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
希望这对您有所帮助,这是证据:
我想扩展用户内容定义以包含可在现有博客的每个博客 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
希望这对您有所帮助,这是证据: