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

Forums / General Discussions / Rotating Content with Sitefinity 4.0

Rotating Content with Sitefinity 4.0

4 posts, 0 answered
  1. Roland
    Roland avatar
    6 posts
    Registered:
    04 Feb 2011
    21 Feb 2011
    Link to this post
    Hi,

    I'm trying to get rotating content with Sitefinity. Here's where I am right now:

    var pageGuids = App.WorkWith().Pages().LocatedIn(Telerik.Sitefinity.Fluent.Pages.PageLocation.Frontend)
                    .Where(page => page.ShowInNavigation == true && page.ApprovalWorkflowState == "Published")
                    .Get().Select(page => page.Id).ToArray();
                
    Random rng = new Random();
    Guid randomGuid = pageGuids[rng.Next(0, pageGuids.Length)];
    
    PageNode pn = App.WorkWith().Page(randomGuid).Get();
    

    Now, this approach may not optimal but it works. However, I'm stuck with figuring out a way of rendering that PageNode object in a similar fashion that Sitefinity renders them. Of course without any of the page template wrappers.
  2. Ivan Dimitrov
    Ivan Dimitrov avatar
    16072 posts
    Registered:
    12 Sep 2017
    21 Feb 2011
    Link to this post
    Hello Roland,

    I am not sure what actually you are trying to do and how you want to render the page. If you want to rotate content you should use content facades. In your case you can extract only page properties data.

    All the best,
    Ivan Dimitrov
    the Telerik team
  3. Roland
    Roland avatar
    6 posts
    Registered:
    04 Feb 2011
    22 Feb 2011
    Link to this post
    Thanks Ivan,

    Are you implying that I should update a content item content such as title and body dynamically form a list of content items?

    Anyways, maybe it's the learning curve but I'm struggling to get this working. I am approaching it from a different angle as well and trying to develop a custom widget based on the NewsRotator in the SDK, which is not quite what I want.

    What I want is to have say content from "Content" types with a particular tag revolve on page refresh. The specified tag will need to be customized somewhere in the custom widget interface. I could get this random content scripted out into a stored procedure but it's not "the right way to do it", plus I can't figure how to access the connection string in DataConfig.conf (this is not too important however).

    Please let me know if this you think this is the right solution to pursue,

    Roland
  4. Roland
    Roland avatar
    6 posts
    Registered:
    04 Feb 2011
    22 Feb 2011
    Link to this post
    FYI. I think I found a solution that works for me. The merit goes to the other posts: http://www.sitefinity.com/devnet/forums/sitefinity-4-x/general-discussions/generic-content-by-category.aspx however, Here's what I did:

    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.Fluent.Pages;
    using Telerik.Sitefinity.Modules.Pages;
    using Telerik.Sitefinity.Pages.Model;
    using Telerik.Sitefinity.GenericContent.Model;
    using Telerik.Sitefinity.Taxonomies.Model;
    using Telerik.Sitefinity.Taxonomies;
    using Telerik.Sitefinity.Modules.GenericContent;
    using System.Collections;
    using Telerik.Sitefinity.Utilities.TypeConverters;
    using Telerik.Sitefinity.Data;
     
    namespace SitefinityWebApp.MyControls
    {
        public partial class RandomPageControl : System.Web.UI.UserControl
        {
            /// <summary>
            /// Descriptor for a type
            /// </summary>
            /// <param name="itemType"></param>
            /// <param name="taxon"></param>
            /// <returns></returns>
            private TaxonomyPropertyDescriptor GetPropertyDescriptor(Type itemType, ITaxon taxon)
            {
                return TaxonomyManager.GetPropertyDescriptor(itemType, taxon);
            }
     
            /// <summary>
            /// Issues query to retrieve content items for a given taxon (limit to 1000)
            /// </summary>
            /// <param name="taxon"></param>
            /// <param name="contentProvider"></param>
            /// <param name="itemType"></param>
            /// <returns></returns>
            private IEnumerable GetItems(ITaxon taxon, ContentDataProviderBase contentProvider, Type itemType)
            {
                TaxonomyPropertyDescriptor prop = GetPropertyDescriptor(itemType, taxon);
                int? totalCount = 0;
                var items = contentProvider.GetItemsByTaxon(taxon.Id, prop.MetaField.IsSingleTaxon, prop.Name, itemType, string.Empty, string.Empty, 0, 1000, ref totalCount);
                return items;
            }
     
            /// <summary>
            /// Return a published list of content items for a given category
            /// </summary>
            /// <param name="category"></param>
            /// <returns></returns>
            protected List<ContentItem> GetContentItemsByCategory(string category)
            {
                List<ContentItem> ciL = new List<ContentItem>();
                TaxonomyManager taxManager = TaxonomyManager.GetManager();
     
                var taxonomyManager = TaxonomyManager.GetManager();
                var c = "categories";
                var taxonomy1 = taxonomyManager.GetTaxonomies<HierarchicalTaxonomy>().Where(t => t.Name == c || t.Title == c).SingleOrDefault();
                var taxon = taxonomy1.Taxa.Where(t => t.Name == category || t.Title == category).SingleOrDefault();
     
                if (taxon != null)
                {
                    string itemTypeName = "Telerik.Sitefinity.GenericContent.Model.ContentItem";
                    Type itemType = TypeResolutionService.ResolveType(itemTypeName);
                    var manager = ManagerBase.GetMappedManager(itemType, "");
                    ContentDataProviderBase contentProvider = manager.Provider as ContentDataProviderBase;
     
                    var v = GetItems(taxon, contentProvider, itemType);
                    //Load into strongly typed list
                    foreach (ContentItem n in v)
                    {
                        ciL.Add(n);
                    }
                }
                else
                {
                    throw new Exception("Category " + category + " was not found.");
                }
                return ciL.Where(a => a.Status == ContentLifecycleStatus.Live && a.ApprovalWorkflowState == "Published").ToList();
            }
     
            /// <summary>
            /// Returns content items with a particular tag
            /// </summary>
            /// <param name="tag">tag word (name or title)</param>
            /// <returns></returns>
            protected List<ContentItem> GetContentItemsByTag(string tag)
            {
                List<ContentItem> ciL = new List<ContentItem>();
                TaxonomyManager taxManager = TaxonomyManager.GetManager();
     
                // Get the tag
                var taxon = taxManager.GetTaxa<FlatTaxon>().Where(t => t.Name == tag || t.Title == tag).Single();
     
                // I want content items
                if (taxon != null)
                {
                    string itemTypeName = "Telerik.Sitefinity.GenericContent.Model.ContentItem";
                    Type itemType = TypeResolutionService.ResolveType(itemTypeName);
                    var manager = ManagerBase.GetMappedManager(itemType, "");
                    ContentDataProviderBase contentProvider = manager.Provider as ContentDataProviderBase;
     
                    var v = GetItems(taxon, contentProvider, itemType);
                    //Load into strongly typed list
                    foreach (ContentItem n in v)
                    {
                        ciL.Add(n);
                    }
                }
                else
                {
                    throw new Exception("Tag " + tag + " was not found.");
                }
                return ciL.Where(a => a.Status == ContentLifecycleStatus.Live && a.ApprovalWorkflowState == "Published").ToList();
            }
     
            /// <summary>
            /// Auto wired method fires when page loads
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Page_Load(object sender, EventArgs e)
            {
                Random rng = new Random();
                string category = "CustomerProfiles";
     
                try
                {
                    var allContent = GetContentItemsByCategory(category);
                    if (allContent.Count > 0)
                    {
                        ContentItem ci = allContent[rng.Next(0, allContent.Count)];
                        pageTitle.Text = ci.Title;
                        pageBody.InnerHtml = ci.Content.ToString();
                    }
                    else
                    {
                        pageTitle.Text = "No content was categoriezed with " + category + ".";
                    }
                }
                catch (Exception ex)
                {
                    pageTitle.Text = "Error";
                    pageBody.InnerText = ex.Message;
                }
            }
        }
    }
4 posts, 0 answered