Partager via


Procédure : ajouter un sous-site à la barre de liens supérieure ou au menu Lancement rapide

Dernière modification : lundi 1 novembre 2010

S’applique à : SharePoint Foundation 2010

Lorsque vous créez un sous-site via l'interface utilisateur de Microsoft SharePoint Foundation, vous pouvez spécifier si les liens vers le nouveau site apparaissent dans la zone Lancement rapide et dans la barre de liens supérieure du site parent. Vous pouvez également ajouter des liens à ces deux emplacements en écrivant un code qui manipule la propriété SPWeb.Navigation.TopNavigationBar du site Web parent et sa propriété SPWeb.Navigation.QuickLaunch.

Insertion d'un lien dans la barre de liens supérieure

Dans le modèle objet SharePoint Foundation, la structure de navigation de la barre de liens supérieure est représentée par une instance de la classe SPNavigationNodeCollection. Pour obtenir la collection, accédez d'abord à la propriété SPWeb.Navigation du site Web, laquelle renvoie un objet SPNavigation, puis accédez à la propriété TopNavigationBar de cet objet.

Note AttentionAttention

Si un site Web est configuré afin d'utiliser la barre de liens supérieure de son site parent, la propriété TopNavigationBar renvoie null.

Lorsque vous avez une collection de nœuds de navigation, construisez un objet SPNavigationNode pour représenter le nouveau lien, puis appelez une méthode de la classe SPNavigationNodeCollection pour ajouter le nœud à la barre de liens supérieure.

Pour ajouter un lien vers un sous-site dans la barre de liens supérieure du site parent

  1. Obtenez une référence à l'objet SPWeb qui représente le sous-site.

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. Vérifiez que le sous-site est effectivement un sous-site en testant la valeur de la propriété IsRootWeb ; vérifiez également que le site parent n'utilise pas une barre de liens supérieure partagée en testant la valeur de sa propriété UseShared.

    if (!child.IsRootWeb && !child.ParentWeb.Navigation.UseShared)
    
    If Not child.IsRootWeb AndAlso Not child.ParentWeb.Navigation.UseShared Then
    
  3. Obtenez l'objet SPNavigationNodeCollection qui représente la barre de liens supérieure du site parent.

    SPNavigationNodeCollection topnav = child.ParentWeb.Navigation.TopNavigationBar;
    
    Dim topnav As SPNavigationNodeCollection = child.ParentWeb.Navigation.TopNavigationBar
    
  4. Vérifiez s'il existe un lien vers le sous-site en interrogeant la collection sur un objet SPNavigationNode dont la propriété Url a la même valeur que la propriété SPWeb.ServerRelativeUrl du sous-site.

    SPNavigationNode node = topnav
        .Cast<SPNavigationNode>()
        .FirstOrDefault(n => n.Url.Equals(child.ServerRelativeUrl));
    
    Dim node As SPNavigationNode = topnav.Cast(Of SPNavigationNode)().FirstOrDefault( _
        Function(n) n.Url.Equals(child.ServerRelativeUrl))
    
  5. S'il n'existe aucun lien, construisez un objet SPNavigationNode pour représenter un lien, puis appelez une méthode de la classe SPNavigationNodeCollection pour l'ajouter à la barre de liens supérieure du site parent.

    if (node == null)
    {
        node = new SPNavigationNode(child.Title, child.ServerRelativeUrl);
        node = topnav.AddAsLast(node);
    }
    
    If node Is Nothing Then
    
        node = New SPNavigationNode(child.Title, child.ServerRelativeUrl)
        node = topnav.AddAsLast(node)
    
    End If
    

Exemple

L'exemple suivant montre comment ajouter un lien vers un sous-site dans la structure de navigation du site parent. Cet exemple s'intègre dans un projet plus large qui utilise une fonctionnalité qui s'étend au Web pour ajouter le lien. La fonctionnalité inclut un gestionnaire d'événements qui implémente la classe SPFeatureReceiver, et le code permettant de créer le lien et de l'ajouter au site parent se trouve dans la méthode FeatureActivated du récepteur de fonctionnalités.

Si le site sur lequel la fonctionnalité est activée possède des sous-sites, la méthode recherche un sous-site nommé « ourwiki ». Si ce sous-site existe, la méthode en obtient une référence. S'il n'existe aucun sous-site, ou s'il existe des sous-sites mais aucun portant le nom «ourwiki », la méthode en crée un.

Ensuite, la méthode ajoute le lien de navigation au sous-site. Si le site actuel possède sa propre barre de liens supérieure (c'est-à-dire qu'il n'utilise pas celle de son parent), le lien est ajouté à la barre de liens supérieure du site actuel. Sinon, il est ajouté au menu Lancement rapide du site actuel.

Le menu Lancement rapide et la barre de liens supérieure sont tous les deux représentés par des objets SPNavigationNodeCollection. Par conséquent, à ce stade, le code est le même, quelle que soit la collection correspondant à la destination du lien de navigation. Cet exemple vérifie d'abord s'il existe déjà un lien vers le sous-site dans la collection de nœuds de navigation. Dans le cas contraire, le code crée un lien et l'ajoute.

Notes

L'exemple de code utilise plusieurs types sans qualification. Pour que le code se compile correctement, la classe du récepteur de fonctionnalités doit importer les espaces de noms suivants :

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{

    // Get the website where the feature is activated.
    SPWeb parentWeb = properties.Feature.Parent as SPWeb;
    if (parentWeb == null)
        return;

    SPWeb childWeb = null;
    string childName = "ourwiki";

    // If a subsite by that name exists, open it.
    string[] webs = parentWeb.Webs.Names;
    if (webs != null && Array.IndexOf(webs, childName) >= 0)
    {
        childWeb = parentWeb.Webs[childName];
    }

    // Otherwise, create the subsite.
    if (childWeb == null)
    {
        string title = "Wiki";
        string desc = "A place to capture knowledge.";
        uint lcid = parentWeb.Language;

        string templateName = "WIKI#0";

        childWeb = parentWeb.Webs.Add(childName, title, desc, lcid, templateName, false, false);
    }

    // Let the subsite use the parent site's top link bar.
    childWeb.Navigation.UseShared = true;

    // Get a collection of navigation nodes.
    SPNavigationNodeCollection nodes = null;
    if (parentWeb.Navigation.UseShared)
    {

        // Parent site does not have its own top link bar
        // so use the parent's Quick Launch.
        nodes = parentWeb.Navigation.QuickLaunch;
    }
    else
    {

        // Parent site has its own top link bar,
        // so use it.
        nodes = parentWeb.Navigation.TopNavigationBar;
    }

    // Check for an existing link to the subsite.
    SPNavigationNode node = nodes
        .Cast<SPNavigationNode>()
        .FirstOrDefault(n => n.Url.Equals(childWeb.ServerRelativeUrl));

    // No link, so add one.
    if (node == null)
    { 

        // Create the node.
        node = new SPNavigationNode(childWeb.Title, childWeb.ServerRelativeUrl);

        // Add it to the collection.
        node = nodes.AddAsLast(node);
    }

    childWeb.Dispose();
    parentWeb.Dispose();
}
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)

    'Get the website where the feature is activated.
    Dim parentWeb As SPWeb = TryCast(properties.Feature.Parent, SPWeb)
    If parentWeb Is Nothing Then
        Return
    End If

    Dim childWeb As SPWeb = Nothing
    Dim childName As String = "ourwiki"

    ' If a subsite by that name exists, open it.
    Dim webs As String() = parentWeb.Webs.Names
    If webs IsNot Nothing AndAlso Array.IndexOf(webs, childName) >= 0 Then
        childWeb = parentWeb.Webs(childName)
    End If

    ' Otherwise, create the subsite.
    If childWeb Is Nothing Then
        Dim title As String = "Wiki"
        Dim desc As String = "A place to capture knowledge."
        Dim lcid As UInteger = parentWeb.Language

        Dim templateName As String = "WIKI#0"

        childWeb = parentWeb.Webs.Add(childName, title, desc, lcid, _
                                        templateName, False, False)
    End If

    ' Let the subsite use the parent site's top link bar.
    childWeb.Navigation.UseShared = True

    ' Get a collection of navigation nodes.
    Dim nodes As SPNavigationNodeCollection = Nothing

    If parentWeb.Navigation.UseShared Then

        ' Parent site does not have its own top link bar
        ' so use the parent's Quick Launch.
        nodes = parentWeb.Navigation.QuickLaunch
    Else

        ' Parent site has its own top link bar,
        ' so use it.
        nodes = parentWeb.Navigation.TopNavigationBar
    End If

    ' Check for an existing link to the subsite.
    Dim node As SPNavigationNode = nodes.Cast(Of SPNavigationNode)().FirstOrDefault( _
        Function(n) n.Url.Equals(childWeb.ServerRelativeUrl))

    ' No link, so add one.
    If node Is Nothing Then

        ' Create the node.
        node = New SPNavigationNode(childWeb.Title, childWeb.ServerRelativeUrl)

        ' Add it to the collection.
        node = nodes.AddAsLast(node)
    End If

    childWeb.Dispose()
    parentWeb.Dispose()
End Sub

Insertion d'un lien dans le menu Lancement rapide

Dans le modèle objet SharePoint Foundation, chaque lien de navigation inclus dans le menu Lancement rapide est représenté par une instance de la classe SPNavigationNode. Le niveau supérieur de la structure du menu Lancement rapide est une collection d'objets SPNavigationNode représentée par une instance de la classe SPNavigationNodeCollection. Les nœuds de ce premier niveau du menu sont les titres : Liste, Bibliothèques, Sites, etc. Chaque titre possède une propriété SPNavigationNode.Children qui renvoie une collection de nœuds qui représentent les liens situés sous ce titre.

Pour insérer un lien sous le titre Sites, vous pouvez appeler la méthode AddToQuickLaunch et spécifier le titre Sites. La méthode accepte deux arguments : un objet SPNavigationNode qui représente le nouveau lien et une valeur d'énumération SPQuickLaunchHeading qui spécifie le titre devant recevoir le lien.

SPNavigation nav = web.ParentWeb.Navigation;
SPNavigationNode node = new SPNavigationNode(web.Title, web.ServerRelativeUrl);
node = nav.AddToQuickLaunch(node, SPQuickLaunchHeading.Sites);
Dim nav As SPNavigation = web.ParentWeb.Navigation
Dim node As SPNavigationNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)
node = nav.AddToQuickLaunch(node, SPQuickLaunchHeading.Sites)

Vous allez évidemment vérifier qu'aucun lien vers le sous-site n'existe déjà sous le titre Sites. Une manière de le vérifier est expliquée dans la procédure suivante.

Pour ajouter un lien vers un sous-site dans le menu Lancement rapide du site parent

  1. Obtenez une référence à l'objet SPWeb qui représente le sous-site.

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. Vérifiez que le sous-site est véritablement un sous-site et non le site Web racine de la collection.

    if (!child.IsRootWeb)
    
    If Not child.IsRootWeb Then
    
  3. Obtenez l'objet SPNavigation du site Web parent.

    SPNavigation nav = web.ParentWeb.Navigation;
    
    Dim nav As SPNavigation = web.ParentWeb.Navigation
    
  4. Obtenez le titre Sites dans le menu Lancement rapide en appelant la méthode GetNodeById, en passant l'équivalent entier de SPQuickLaunchHeading.Sites.

    SPNavigationNode sitesHeading = nav.GetNodeById((int)SPQuickLaunchHeading.Sites);
    
    Dim sitesHeading As SPNavigationNode = nav.GetNodeById(CInt(SPQuickLaunchHeading.Sites))
    

    Notes

    Si le menu Lancement rapide ne possède pas encore de titre Sites, l'appel de GetNodeById renvoie null.

  5. Vérifiez s'il existe un lien vers le sous-site en interrogeant l'enfant du titre Sites à propos d'un objet SPNavigationNode dont la propriété Url a la même valeur que la propriété SPWeb.ServerRelativeUrl du sous-site.

    SPNavigationNode newNode = null;
    if (sitesHeading != null)
    {
        newNode = sitesHeading
            .Children
            .Cast<SPNavigationNode>()
            .FirstOrDefault(n => n.Url == web.ServerRelativeUrl);
    }
    
    Dim newNode As SPNavigationNode = Nothing
    If sitesHeading IsNot Nothing Then
        newNode = sitesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
            Function(n) n.Url = web.ServerRelativeUrl)
    End If
    
  6. S'il n'existe aucun lien, construisez un objet SPNavigationNode pour représenter le lien, puis appelez la méthode AddToQuickLaunch pour l'ajouter au menu Lancement rapide du site parent sous le titre Sites.

    if (newNode == null)
    {
    
        // Create the link.
        newNode = new SPNavigationNode(web.Title, web.ServerRelativeUrl);
    
        // Add it to the parent site's Quick Launch.
        newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites);
    }
    
    If newNode Is Nothing Then
    
        ' Create the link.
        newNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)
    
        ' Add it to the parent site's Quick Launch.
        newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites)
    End If
    

Exemple

L'exemple suivant est une application console qui illustre la procédure d'insertion d'un lien vers un sous-site dans le menu Lancement rapide du site parent. Vous pouvez ajouter un code similaire (convenablement modifié) à la méthode FeatureActivated d'un récepteur de fonctionnalités qui crée un sous-site.

using System;
using System.Linq;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Navigation;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("https://localhost"))
            {

                // Get the subsite.
                using (SPWeb web = site.OpenWeb("parent/child"))
                {
                    if (!web.IsRootWeb)
                    { 

                        // Get the parent site's navigator.
                        SPNavigation nav = web.ParentWeb.Navigation;

                        // Get the Sites heading.
                        SPNavigationNode sitesHeading = nav.GetNodeById((int)SPQuickLaunchHeading.Sites);

                        // Check if a link to the child already exists.
                        SPNavigationNode newNode = null;
                        if (sitesHeading != null)
                        {
                            newNode = sitesHeading
                                .Children
                                .Cast<SPNavigationNode>()
                                .FirstOrDefault(n => n.Url == web.ServerRelativeUrl);
                        }

                        // No link, so create one.
                        if (newNode == null)
                        {

                            // Create the link.
                            newNode = new SPNavigationNode(web.Title, web.ServerRelativeUrl);

                            // Add it to the parent site's Quick Launch.
                            newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites);
                        }

                        Console.WriteLine("A link to {0} is on the Quick Launch for {1}", newNode.Title, nav.Web.Title);
                    }
                }
            }
            Console.Write("\nPress ENTER to continue....");
            Console.ReadLine();
        }
    }
}
Imports System
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Navigation

Module ConsoleApp

    Sub Main()

        Using site As New SPSite("https://localhost")

            Using web As SPWeb = site.OpenWeb("parent/child")

                If Not web.IsRootWeb Then

                    ' Get the parent site's navigator.
                    Dim nav As SPNavigation = web.ParentWeb.Navigation

                    ' Get the Sites heading.
                    Dim sitesHeading As SPNavigationNode = nav.GetNodeById(CInt(SPQuickLaunchHeading.Sites))

                    ' Check if a link to the child already exists.
                    Dim newNode As SPNavigationNode = Nothing
                    If sitesHeading IsNot Nothing Then

                        newNode = sitesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
                            Function(n) n.Url = web.ServerRelativeUrl)
                    End If

                    ' No link, so create one.
                    If newNode Is Nothing Then

                        ' Create the link.
                        newNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)

                        ' Add it to the parent site's Quick Launch.
                        newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites)
                    End If

                    Console.WriteLine("A link to {0} is on the Quick Launch for {1}", newNode.Title, nav.Web.Title)
                End If

            End Using

        End Using

        Console.Write(vbCrLf & "Press ENTER to continue....")
        Console.Read()
    End Sub

End Module

Voir aussi

Tâches

Procédure : personnaliser l'affichage du menu de lancement rapide

Comment : afficher ou masquer le menu Lancement rapide

Concepts

Ajout de liens à la barre de liens supérieure

Procédure : partager la barre de liens supérieure entre les sites