Contenu dynamique dans la navigation

Contenu dynamique dans la navigation

Publié le août 01, 2014 0 Comments

The content you're reading is getting on in years
This post is on the older side and its content may be out of date.
Be sure to visit our blogs homepage for our latest news, updates and information.

Une navigation dynamique qui intègre des offres de produits, du contenu ou des offres spéciales peut améliorer considérablement l’expérience de l’utilisateur final. Cet article de blog explique une technique qui vous permet d’étendre la navigation pour inclure tout type de contenu. 

Actuellement, Sitefinity ne peut afficher que des éléments de type PageNode (c’est-à-dire Pages) dans les contrôles de navigation prêts à l’emploi.

Pour afficher du contenu dynamique, vous avez besoin d’un contrôle de navigation personnalisé, qui sera lié à SitefinitySiteMapDataSource - notre contrôle qui fournit une source de données mise en cache du sitemap des pages. Vous pouvez vous abonner à l’événement ItemDataBound du contrôle de navigation et insérer de nouveaux éléments sous la page souhaitée à l’aide de l’API Sitefinity pour récupérer une collection des éléments de contenu du type souhaité.

Par exemple :

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MixedNavigation.ascx.cs" Inherits="SitefinityWebApp.SupportSamples.MixedNavigation" %>
<%@ Register TagPrefix="sfNav" Namespace="Telerik.Sitefinity.Web.UI.NavigationControls" Assembly="Telerik.Sitefinity" %>
  
<sfNav:SitefinitySiteMapDataSourceid="navDataSource" runat="server" ShowStartingNode="false" />
<telerik:RadMenuid="rmNavigation" runat="server" DataSourceID="navDataSource"></telerik:RadMenu>

et sa logique code-behind :

using System;
using System.Globalization;
using System.Linq;
using Telerik.Sitefinity.Modules.Ecommerce.Catalog;
using Telerik.Sitefinity.Services;
using Telerik.Sitefinity.Web;
  
namespace SitefinityWebApp.SupportSamples
{
    publicpartial class MixedNavigation : System.Web.UI.UserControl
    {
        protectedvoid Page_Load(object sender, EventArgs e)
        {
            //Subscribe to ItemDataBound so you can insert new items under desired node on data binding
            rmNavigation.ItemDataBound += rmNavigation_ItemDataBound;
        }
  
        voidrmNavigation_ItemDataBound(object sender, Telerik.Web.UI.RadMenuEventArgs e)
        {
            if(e.Item.DataItem is PageSiteNode)
            {
                var page = e.Item.DataItem as PageSiteNode;
                //Check if the current item is the desired PageNode
                if (page.Title == ParentPageToPlaceUnder)
                {
                    //Get the collection of items
                    var manager = CatalogManager.GetManager();
                    var products = manager.GetProducts()
                        .Where(p => p.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live && p.visible == true)
                        .ToList();
                    //Get the ContentLocationService - it stores the URL statistics for all Sitefinity data items
                    var contLocationService = SystemManager.GetContentLocationService();
                    //Get the current culture, to ensure you're resolving the correct URL
                    var culture = CultureInfo.CurrentUICulture;
                    //iterate through the collection and add a new item in the navigation with the item's Title and resolved URL
                    foreach(var product in products)
                    {
                        var itemAbsoluteUrl = "";
                        //Please ensure your items are displayed at least on one page in the site, otherwise GetItemDefaultLocation() will be null
                        //You can get a list of the generated item locations by going to:
                        //Sitefinity backend -> Content -> Your desired content type -> Pages where items of your content type are published
                        if (contLocationService.GetItemDefaultLocation(product, culture) != null)
                            itemAbsoluteUrl = contLocationService.GetItemDefaultLocation(product).ItemAbsoluteUrl;
                        e.Item.Items.Add(new Telerik.Web.UI.RadMenuItem(product.Title, itemAbsoluteUrl));
                    }
                }
            }
        }
  
        //You can configure the desired page to insert the new items under - it will be displayed as a public property int he widget property editor as well
        publicstring ParentPageToPlaceUnder
        {
            get
            {
                return parentPageToPlaceUnder;
            }
            set
            {
                this.parentPageToPlaceUnder = value;
            }
        }
  
        //you can configure a default page to insert the new items under
        privatestring parentPageToPlaceUnder = "MyTargetPage";
    }
}

Pour votre commodité, j’ai joint l’exemple complet à cet article de blog ici, n’hésitez pas à le modifier selon vos besoins spécifiques. Vous pouvez également trouver ici une courte vidéo démonstrative de l’échantillon utilisé sur une  page Sitefinity.

Vous pouvez également envisager d’affecter des produits associés ou d’autres données directement aux pages via des champs personnalisés pour les pages, ce qui permettra à vos utilisateurs professionnels de définir exactement quel contenu dynamique personnalisé apparaîtra dans le méga menu. Vous pouvez consulter la documentation d’interrogation des champs personnalisés pour les pages afin de connaître les méthodes d’API à utiliser.

 

Commentaires

Comments are disabled in preview mode.
SUJETS

La formation et la certification Sitefinity sont maintenant disponibles.

Laissez nos experts vous apprendre à utiliser les meilleures fonctionnalités de Sitefinity pour offrir des expériences numériques convaincantes.

Pour en savoir plus

Abonnez-vous pour obtenir toutes les nouvelles, informations et didacticiels dont vous avez besoin pour créer de meilleures applications et sites professionnels

Loading animation