septembre
2009
Suite a une petite discussion sur le forum Sharepoint, je me disais que ca ferait du bien de soumettre ce petit développement a l’appréciation de tous.
Sharepoint dispose, par défaut, d’un certain nombre de fournisseurs de menus (avec WSS, par exemple, SPNavigationProvider, SPSiteMapProvider, ou SPContentMapProvider)
Il peut arriver que, pour des raisons diverses et variées, on ait besoin d’avoir un comportement différent (menus différents selon les utilisateurs, ou autres)
Une bonne façon de faire est d’étendre le Provider, pour pouvoir éventuellement ajouter des éléments. Dans le cas présent, on va aller piocher dans une liste des éléments supplémentaires, de façon a générer un menu déroulant dans WSS v3 (et oui, pas de gestion native des sous-menus).
Pour cela, on va créer une classe TopNavBarProvider (parce qu’on va s’en servir dans la …top navbar ), qui hérite de SPNavigationProvider et on va surcharger sa méthode GetChildNodes. La méthode GetChildNodes est utilisée pour récupérer les noeuds descendants du noeud courant.
[
SharePointPermission(SecurityAction.Demand, ObjectModel = true)]public override SiteMapNodeCollection GetChildNodes(SiteMapNode node)
Dans cette méthode, on va aller essayer de récupérer le contenu d’une liste Menu, qui contient un titre, une url, et un parent.
On va avoir deux familles de cas :
- soit on a un noeud qui est un noeud « sharepoint », a savoir le noeud racine, ou un noeud déclaré dans la barre de navigation standard
- soit on a un de nos noeuds customisés (il n’est pas possible de creer des noeuds de type SPSiteMapNode)
Dans la première famille, il va falloir déterminer si le noeud est un noeud « standard », ou la racine. Si le noeud est la racine du site, il va falloir lui adjoindre tous les noeuds parents de notre liste.
collection = base.GetChildNodes(node);
return LoadSiteMapNodes(node, web);
}
Pour ca, on va faire un test un peu sale (mais qui marche), a savoir :
SiteMapNodeCollection collection = new SiteMapNodeCollection();
if (parentNode.Url.EndsWith(web.Name + « /default.aspx »)) {
foreach (CustomNode tmpNode in LoadTopLevelNodes(parentNode, web)) {
collection.Add(GenerateSiteNode(tmpNode));
}
}
return collection;
}
La fonction LoadTopLevelNodes va ressembler a ca :
Guid siteId = web.Site.ID;
List <CustomNode> tmpNodes = new List<CustomNode>(); SPSecurity.RunWithElevatedPrivileges(delegate {
using (SPSite site = new SPSite(siteId)) {
using (SPWeb tmpWeb = site.OpenWeb(webId)) {
if (!ListExists(tmpWeb, « Menu »)) return;
SPList list = tmpWeb.Lists[« Menu »];
SPQuery query = new SPQuery();
string queryValue = « <Query><Where><And> »;
queryValue += « <IsNull><FieldRef Name=’Parent’ /></IsNull> »;
queryValue += « <Eq><FieldRef Name=’Published’ /><Value Type=’Boolean’>1</Value></Eq> »;
queryValue += « </And></Where></Query> »;
query.Query = queryValue;
SPListItemCollection myItems = list.GetItems(query);
foreach (SPListItem menu in myItems) {
tmpNodes.Add(new CustomNode(menu, tmpWeb.Url));
}
}
}
});
Si on travaille avec un noeud courant qui n’est pas de type SPSiteMapNode, on se retrouve avec soit le cas d’un noeud parent, soit le cas d’un enfant. On va donc simplement chercher tous les enfants du noeud courant, et les renvoyer. Pour cela, on va plus ou moins utiliser la même fonction, en changeant juste la requête CAML.
using (SPSite site = new SPSite(siteId)) {
using (SPWeb tmpWeb = site.OpenWeb(webId)) {
if (!ListExists(tmpWeb, « Menu »)) return;
SPList list = tmpWeb.Lists[« Menu »];
SPQuery query = new SPQuery();
string queryValue = « <Query><Where><And> »;
queryValue += « <IsNull><FieldRef Name=’Parent’ /></IsNotNull> »;
queryValue += « <Eq><FieldRef Name=’Published’ /><Value Type=’Boolean’>1</Value></Eq> »;
queryValue += « </And></Where></Query> »;
query.Query = queryValue;
foreach (SPListItem menu in myItems) {
string parent = menu[« Parent »] as string;
string parentId = parent.Split(‘;’)[0];
if (parentId.Equals(parentNode.Key.Replace(« CustomNode », « »))) {
tmpNodes.Add(new PMONode(menu, tmpWeb.Url));
}
}
}
}
});
Voila, c’est volontairement parcellaire, mais ca devrait permettre a ceux qui sont intéressés de se dépatouiller
Articles récents
Archives
- janvier 2014
- septembre 2013
- août 2013
- mai 2013
- avril 2013
- janvier 2013
- août 2012
- juin 2012
- mai 2012
- avril 2012
- mars 2012
- novembre 2011
- septembre 2011
- août 2011
- juillet 2011
- juin 2011
- mai 2011
- avril 2011
- février 2011
- janvier 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009