Rendre un calendrier SharePoint 2010 consultable pour iPhone/iPad ou autre smartphone/tablet

Pendant vos projets SharePoint, vos utilisateurs vont ont certainement fait part qu’ils souhaitaient synchroniser un calendrier spécifique et particulièrement important avec leur iPhone ou leur iPad (que ce soit en interne ou en extérieur). Néanmoins, L’iPhone ne sait pas le faire pas naturellement : rien de plus simple qu’une publication au format iCalendar pour palier au problème !

Pour faire face à cette situation, direction Visual Studio 2010 (avec Nuget installé) ou 2012 (mieux !) :

  1. Créez un nouveau projet SharePoint vide
  2. Ajoutez le package DDay.iCal à votre projet (que vous pouvez trouver ici :http://nuget.org/packages/DDay.iCal) qui va nous permettre de générer simplement la sortie iCal
  3. Créez un fichier handler .ashx et copier (en l’adaptant à votre environnement) suivant :

<%@ Assembly Name= »Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c » %>
<%@ Assembly Name= »Contoso.iCal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d957034fc68cb87″ %>
<%@ WebHandler Language= »C# » Class= »Consoto.iCalPublisher.Agenda » %>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Noumea.iCal;
using Microsoft.SharePoint;

namespace Contoso.iCalPublisher
{
    public class Agenda : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            iCalCalendar cal = new iCalCalendar();

            using (SPSite site = new SPSite(« http://demo.contoso.nc/managers/ »))
            {
                using (SPWeb web = site.RootWeb)
                {
                    // Récupération du calendrier à publier en iCal
                    SPList calManager = web.Lists.TryGetList(« Agenda Managers »);
                    if (calManager != null)
                    {
                        // Filtrage par rapport à un type de contenu et ne récupère que les 15 derniers jours d’évènements antérieurs à la date du jour
                        SPQuery query = new SPQuery();
                        query.Query = string.Concat(
                                « <Where><And><Eq><FieldRef Name=’ContentType’/><Value Type=’Text’>Evènement Manager</Value></Eq><Geq><FieldRef Name=’EndDate’ /><Value Type=’DateTime’><Today OffsetDays=’-15′ /></Value></Geq></And></Where> »);
                        SPListItemCollection listItems = calManager.GetItems(query);
                        // On exporte tous les évènements récupérés en iCal
                        foreach (SPListItem item in listItems)
                        {
                            iCalEvent evt = new iCalEvent();
                            evt.DateBegin = DateTime.Parse(item[« EventDate »].ToString());
                            evt.DateEnd = DateTime.Parse(item[« EndDate »].ToString());
                            evt.Description = item[« Title »].ToString();
                            evt.Location = item[« Location »] != null ? item[« Location »].ToString() : «  »;
                            cal.Events.Add(evt);
                        }
                    }
                }
            }

            byte[] arrBytData = cal.Serialize();
            context.Response.Clear();
            context.Response.ContentType = « text/plain »;
            // Pour éviter le cache
            context.Response.AppendHeader(« Pragma », « no-cache »);
            context.Response.AppendHeader(« Expires », « Sat, 05 Jul 2010 05:00:00 GMT »);
            context.Response.AppendHeader(« Content-Disposition », « attachment; filename=CalendrierManager.ics »);
            context.Response.AppendHeader(« Content-Length », arrBytData.Length.ToString());
            context.Response.ContentType = « text/calendar »;
            context.Response.BinaryWrite(arrBytData);
            context.Response.Flush();
            context.Response.End();
            context.Response.Close();
        }
    }
}

That’s all folks ! Bien évidemment la sécurité fonctionne à merveille (authentification requise).

Créer une webpart de génération de sommaire automatique des titres d’une page de publication pour le publishing de SharePoint 2010

Voici un petit bout de code rapide pour réaliser un sommaire des titres (H1) dans une page de publication assez longue, avec un retour vers le sommaire sous le titre :

var WebPart_SommaireAncres_Variable_Sommaire_CodeRetourSommaire = « <div class=’WebPart_Sommaire_RetourSommaire’><a class=’WebPart_Sommaire_RetourSommaire_a’ href=’#Sommaire’>Retour Sommaire</a><img class=’WebPart_Sommaire_RetourSommaire_img’ src=’/_layouts/DemoCorp/images/WebPart_Sommaire_Fleche-Haut.png’ /></div> »

jQuery(document).ready(function () {

    var divMainResize = document.getElementById(‘MainResize’);

    /* Ajout des ancres sur les H1 */
    var divh1Array = divMainResize.getElementsByTagName(‘h1’);
    for (var i = 0; i < divh1Array.length; i++) {
        // Ajoute l’id qui permet au menu d’identifier le titre
        jQuery(divh1ArrayIdea).attr(« id », « sommaireIndex » + i);
        // Ajoute le lien de retour vers le sommaire
        jQuery(divh1ArrayIdea).after(WebPart_SommaireAncres_Variable_Sommaire_CodeRetourSommaire);
    }

    /* Ajout du sommaire */
    var elSommaire = jQuery(« <a name=’Sommaire’></a> »);
    jQuery(divMainResize).prepend(elSommaire);
    // Génération du sommaire
    var elContenuSommaire = jQuery(« <div id=’WebPart_Sommaire’></div> »).appendTo(elSommaire);
    jQuery(« <h1 class=’WebPart_Sommaire_h1′>Sommaire</h1> »).appendTo(jQuery(elContenuSommaire));
    var elSommaireListe = jQuery(« <ul class=’WebPart_Sommaire_Liste_Lien_ul’></u> »);
    jQuery(elSommaireListe).appendTo(jQuery(elContenuSommaire));
    for (var i = 1; i < divh1Array.length; i++) { // Début à 1 car nous ajoutons un H1 avec le titre du sommaire
        var contenuLi = jQuery(« <li class=’WebPart_Sommaire_Liste_Lien_li’></li> »);
        jQuery(contenuLi).appendTo(elSommaireListe);
        var contenuLinkLi = jQuery(« <a class=’WebPart_Sommaire_Liste_Lien_a’ href=’#sommaireIndex » + (i – 1).toString() + « ‘> » + divh1ArrayIdea.innerHTML + « </a> »);
        jQuery(contenuLinkLi).appendTo(contenuLi);
    }
});

Avec un peu de CSS et des images cela devrait rendre quelque chose de pas mal du tout !

SharePoint 2010 : Gérer la planification des pages de publication

Un petit bout de code pour gérer planifier des pages de publication :

SPList list=web.Lists[« Pages »];
SPListItem item = list.GetItemById(…); // Récupération de l’élément à planifier

if (ScheduledItem.IsScheduledItem(item))
{
   ScheduledItem scheduledItem = ScheduledItem.GetScheduledItem(listItem);
   DateTime startDate = DateTimeNow;
   DateTime endDate = new DateTime(2013, 12, 31, 23, 59, 00);
   scheduledItem.StartDate = startDate;
   scheduledItem.EndDate = endDate;
   scheduledItem.ListItem.Update();
   scheduledItem.Schedule();
}