+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / Retrieving post author details (avatar, nickname, etc) in blog post templates?

Retrieving post author details (avatar, nickname, etc) in blog post templates?

8 posts, 0 answered
  1. michaelroper
    michaelroper avatar
    18 posts
    Registered:
    25 Jul 2012
    30 Jul 2012
    Link to this post
    I'm trying to modify the blog post list + detail templates to pull in the post author's nickname and profile picture that is set in their Sitefinity user profile. I've trawled the forums and found no specific way to do it, so if anyone is able to look at my template code below and give me some hints/solution, I'd be most grateful...

    <%@ Control Language="C#" AutoEventWireup="true" Inherits="SitefinityWebApp.SfCtrlPresentation.OpenAccessDataProvider_a0a350ca5ca446d4985fcf70f892e660" CodeFile="OpenAccessDataProvider,a0a350ca5ca446d4985fcf70f892e660.ascx.cs" %>
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.ContentUI" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.Comments" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.PublicControls.BrowseAndEdit" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
    <%@ Import Namespace="Telerik.Sitefinity" %>
     
    <telerik:RadListView ID="Repeater" ItemPlaceholderID="ItemsContainer" runat="server" EnableEmbeddedSkins="false" EnableEmbeddedBaseStylesheet="false">
      <LayoutTemplate>
        <div class="postList">
          <asp:PlaceHolder ID="ItemsContainer" runat="server" />
        </div>
      </LayoutTemplate>
      <ItemTemplate>
        <div class="postItem row">
          <div class="postSide span1 hidden-phone">
            <div class="postAvatar">
              <img src="<%# Eval('AuthorAvatarUrl') %>" />
            </div>
            <div class="postDate">
              <span class="postDay"><%# Eval("PublicationDate", "{0:dd}") %></span>
              <span class="postMonth"><%# Eval("PublicationDate", "{0:MMM}") %></span>
              <span class="postYear"><%# Eval("PublicationDate", "{0:yyy}") %></span>
            </div>
          </div><!-- /postSide -->
          <div class="postMain span8">
            <div class="postMeta clearfix">
              <div class="postMetaAuthor pull-left">
                <span class="postMetaAuthorName"><sf:PersonProfileView runat="server" /></span>
                <span class="postMetaAuthorNickname"><asp:Literal runat="server" ID="AuthorNickname" /></span>
              </div>
              <div class="postMetaCategory pull-right">
                <sitefinity:HierarchicalTaxonField ID="HierarchicalFieldControl" runat="server" TaxonomyId="E5CD6D69-1543-427b-AD62-688A99F5E7D4" DisplayMode="Read" WebServiceUrl="~/Sitefinity/Services/Taxonomies/HierarchicalTaxon.svc" Expanded="false" TaxonomyMetafieldName="Category" ExpandText="ClickToAddCategories" BindOnServer="true" />
              </div>
              <div class="clear"></div>
            </div><!-- /postMeta -->
            <div class="postArea">
              <h2 class="postTitle"><sf:DetailsViewHyperLink TextDataField="Title" ToolTipDataField="Description" runat="server" /></h2>
              <div class="postContent">
                <sf:FieldListView ID="PostContent" runat="server" Text="{0}" Properties="Content" WrapperTagName="div" WrapperTagCssClass="sfpostContent" />
              </div>
            </div><!-- /postArea -->
          </div><!-- /postMain -->
        </div><!-- /postItem -->
      </ItemTemplate>
    </telerik:RadListView>
    <sf:Pager id="pager" runat="server"></sf:Pager>

    And the CodeBehind (using the SfCtrlPresentation method)...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Telerik.Sitefinity.Web.UI;
    using Telerik.Web.UI;
    using Telerik.Sitefinity;
    using Telerik.Sitefinity.Blogs.Model;
    using Telerik.Sitefinity.Model;
     
     
    namespace SitefinityWebApp.SfCtrlPresentation {
        public partial class OpenAccessDataProvider_a0a350ca5ca446d4985fcf70f892e660 : System.Web.UI.UserControl
        {
            protected void Page_Load(object sender, EventArgs e)
            {
               
            }
     
            protected override void OnInit(EventArgs e)
            {
                var repeater = (RadListView)this.FindControl("Repeater");
                repeater.ItemDataBound += new EventHandler<RadListViewItemEventArgs>(repeater_ItemDataBound);
            }
     
            void repeater_ItemDataBound(object sender, RadListViewItemEventArgs e) {
                if (e.Item is RadListViewDataItem) {
     
                  var strAuthor = "Business Manager";
     
                  // this code doesn't work, but this is the general idea of what i want to do
                  // var post = ((RadListViewDataItem)(e.Item)).DataItem as BlogPost;
                  // var owner = post.GetValue("Owner").ToString();
                  // strAuthor = owner;
     
                  var AuthorNicknameCtrl = (Literal)e.Item.FindControl("AuthorNickname");
                  AuthorNicknameCtrl.Text = strAuthor;
     
                }
            }
        }
    }

    The template ends up looking like this...

    Thanks... :)
  2. Svetla
    Svetla avatar
    36 posts
    Registered:
    07 Sep 2015
    06 Aug 2012
    Link to this post
    Hi Michael,

    Here is a code snippet that achieves the following. I have created it as an ascx control and defined it as a template through the controls advanced properties in Home >ControlDefinition >Views >DetailBlogPostsFrontend. Of course you can also use the ViewMap approach if you wanted to tackle this globally 

    You got the right idea in your previous code sample and generally what was missing is the proper API calls to get the item and then get the proper profile for it. The Avatar is a bit tricky because the Avatar field in a profile is a ContentLink to an Image and you can see below how I got that image.


    ascx code:
    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="BlogWithAuthor.ascx.cs" Inherits="SitefinityWebApp.WidgetTemplates.BlogWithAuthor" %>
     
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.ContentUI" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.Comments" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="sf" Namespace="Telerik.Sitefinity.Web.UI.PublicControls.BrowseAndEdit" Assembly="Telerik.Sitefinity" %>
    <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
    <%@ Import Namespace="Telerik.Sitefinity" %>   
     
    <telerik:RadListView ID="Repeater" ItemPlaceholderID="ItemsContainer" runat="server" EnableEmbeddedSkins="false" EnableEmbeddedBaseStylesheet="false">
        <LayoutTemplate>
            <sf:ContentBrowseAndEditToolbar ID="MainBrowseAndEditToolbar" runat="server" Mode="Add"></sf:ContentBrowseAndEditToolbar>
            <ul class="sfpostsList sfpostListTitleDateSummary">
                <asp:PlaceHolder ID="ItemsContainer" runat="server" />
            </ul>
        </LayoutTemplate>
        <ItemTemplate>
            <li class="sfpostListItem">
                 
                <h2 class="sfpostTitle">
                    <sf:DetailsViewHyperLink ID="DetailsViewHyperLink1" TextDataField="Title" ToolTipDataField="Description" runat="server" />
                </h2>
                <asp:image runat="server" ID="AuthorImage" style="width: 120px; margin-right:7px; border-radius: 10px; float:left; background-color: #666;box-shadow: 0 0 25px #111;"
                    />
                     
                            <div class="sfpostAuthorAndDate">
                    <asp:Literal ID="Literal2" Text="<%$ Resources:Labels, By %>" runat="server" />
                    <sf:PersonProfileView ID="PersonProfileView1" runat="server" />
                    <sf:FieldListView ID="PostDate" runat="server" Format=" | {PublicationDate.ToLocal():MMM dd, yyyy}" />
                </div>
     
                <sf:FieldListView ID="PostContent" runat="server" Text="{0}" Properties="Summary" WrapperTagName="div" WrapperTagCssClass="sfpostSummary" />
     
                <sf:DetailsViewHyperLink ID="FullStory" Text="Full story" runat="server" CssClass="sfpostFullStory" />
                <sf:ContentBrowseAndEditToolbar ID="BrowseAndEditToolbar" runat="server" Mode="Edit,Delete,Unpublish"></sf:ContentBrowseAndEditToolbar>
            </li>
        </ItemTemplate>
    </telerik:RadListView>
    <sf:Pager id="pager" runat="server"></sf:Pager>
    <asp:PlaceHolder ID="socialOptionsContainer" runat="server" />

    The code behind

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Telerik.Sitefinity;
    using Telerik.Sitefinity.Security;
    using Telerik.Sitefinity.Blogs.Model;
    using Telerik.Sitefinity.Security.Model;
    using Telerik.Sitefinity.Model;
    using Telerik.Sitefinity.Data.ContentLinks;
    using Telerik.Web.UI;
    using Telerik.Sitefinity.Security.Claims;
    using Telerik.Sitefinity.Modules.Libraries;
     
    namespace SitefinityWebApp.WidgetTemplates
    {
        public partial class BlogWithAuthor : System.Web.UI.UserControl
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                Repeater.ItemDataBound += new EventHandler<Telerik.Web.UI.RadListViewItemEventArgs>(Repeater_ItemDataBound);
            }
     
            void Repeater_ItemDataBound(object sender, Telerik.Web.UI.RadListViewItemEventArgs e)
            {
                RadListViewDataItem dataItem = (RadListViewDataItem)e.Item;
                if (e.Item.ItemType == RadListViewItemType.DataItem  || e.Item.ItemType == RadListViewItemType.AlternatingItem)
                {
                     
                    var imageControl = e.Item.FindControl("AuthorImage") as System.Web.UI.WebControls.Image;
                    if (imageControl != null)
                    {
                        UserManager manager = UserManager.GetManager();
                        UserProfileManager pManager = UserProfileManager.GetManager();
                        BlogPost post = (BlogPost)dataItem.DataItem;
                         
                        User owner = manager.GetUser(post.Owner);
                        SitefinityProfile profile = pManager.GetUserProfile<SitefinityProfile>(owner);
                        LibrariesManager lmanager = LibrariesManager.GetManager();
                        Telerik.Sitefinity.Libraries.Model.Image image = lmanager.GetImage(profile.Avatar.ChildItemId);
                        imageControl.ImageUrl = image.ThumbnailUrl;
                    }
                }
            }
        }
    }

    You can find the result attached and of course the same logic applies to the nickname as well.

    Let us know if the provided information helped with the quest:)

    All the best,
    Svetla
    the Telerik team
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  3. David
    David avatar
    114 posts
    Registered:
    19 Jul 2012
    19 May in reply to Svetla
    Link to this post

    Hi Svetla,

    I noticed this code will cause an error if there is no Avatar.  Is there a simple way to show the Blank Avatar (like the Sitefinity User Page) when there is no Avatar? 

    Thanks.

  4. Svetoslav Manchev
    Svetoslav Manchev avatar
    735 posts
    Registered:
    07 Dec 2016
    24 May
    Link to this post
    Hi David,

    You can use conditional control similar like proposed here:
    http://www.sitefinity.com/developer-network/forums/developing-with-sitefinity-/if-statement-in-widget-template#gnns3BPXL0WrM2tBoO8Kzw
    and render different markup in case there is no Avatar evaluated.

    Regards,
    Svetoslav Manchev
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
  5. David
    David avatar
    114 posts
    Registered:
    19 Jul 2012
    26 May in reply to Svetoslav Manchev
    Link to this post

    Thanks Svetoslav,

    I added a check in the code behind for null Avatar and then set a Blank Avatar to BlankAvatar.ThumbnailUrl = "/SFRes/images/Telerik.Sitefinity.Resources/Images.DefaultPhoto.png";

    Which seems to work OK.

    I also want the Avatar to show in the Blog Post itself as well as the Blog Post List Template.  Could you provide the template and code behind for this?

  6. Svetoslav Manchev
    Svetoslav Manchev avatar
    735 posts
    Registered:
    07 Dec 2016
    31 May
    Link to this post
    Hello David,

    There is a property 'Owner' that returns the Id of the owner which you can use to retrieve the requested information.

    You can check this similar functionality creating a custom control described in that blog post:
    http://www.sitefinity.com/blogs/svetoslavmanchev/posts/svetoslav-manchevs-blog/2013/11/21/displaying-additional-user-information-in-a-sitefinity-forum-post

    I hope this helps.

    Regards,
    Svetoslav Manchev
    Telerik
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
  7. David
    David avatar
    114 posts
    Registered:
    19 Jul 2012
    06 Jul in reply to Svetoslav Manchev
    Link to this post
    This seems a lot of effort to replace a template with code behind for the list, and then amend another with a custom field for Avatar for the blog post itself.  Could I raise a request that this is implemented as standard?  We should be able to drag and drop the Avatar field along with other detailed information about the post author - into blog posts/news items, etc..  Thanks.
  8. Svetoslav Manchev
    Svetoslav Manchev avatar
    735 posts
    Registered:
    07 Dec 2016
    11 Jul
    Link to this post
    Hi David,

    The issue is logged in our feedback portal here:
    http://feedback.telerik.com/Project/153/Feedback/Details/196578-add-more-details-about-the-author-in-content-list-and-details-templates, where you can vote to increase its popularity.

    Regards,
    Svetoslav Manchev
    Telerik by Progress
     
    Do you want to have your say in the Sitefinity development roadmap? Do you want to know when a feature you requested is added or when a bug fixed? Explore the Telerik Sitefinity CMS Ideas&Feedback Portal and vote to affect the priority of the items
     
8 posts, 0 answered