Sharepoint 2010 : Nota Bene sur l'installation des packs de langue

Un post rapide pour vous faire partager (et ne plus oublier) ma façon de gérer l'installation des packs de langue avec SharePoint.

J'ai du récémment réinstaller ma machine de Développement pour un projet avec de multiple langue supportées et j'ai donc de nouveau gouté à la joie de l'installation des packs de langue...

Alors si vous êtes comme moi et que vous vous y perdez dans quel pack de langue vous avez installé, quelle url il faut utiliser pour télécharger tel ou tel pack, je vous conseille de garder ces 3 petits tips en tête.




  • Pour vérifier quelle pack de langue vous avez déjà installé, il suffit simplement d'aller le Control Panel > Programs > Programs and Features > Installed Updates



  • Au final, pour l'installation en elle-même, je vous conseille de passer par le projet AutoSPInstaller.
Il vous suffira de "déposer" vos pack de langues et leur updates dans les répertoires appropriés et il fera tout le reste pour vous.


Il y a pas à dire, ça nous change des problèmatiques qu'on avait avec 2007 :)

<Phil/>

SharePoint 2010 : Suivre l'actualité concernant SharePoint

Avec la quantité d’informations disponibles sur la toile, c’est de plus en plus difficile de suivre un sujet (ou plusieurs) sans être submergé d’information.

Concernant SharePoint, cette problématique est la même : La communauté SharePoint est grande et très active et c’est souvent très difficile de faire la part des choses entre les posts de blog qui font du copier coller et les vrai post utiles.

De nombreux clients me demande régulièrement quelques pointeurs à ce sujet, du coup, j’en profite pour vous faire part de ce que j’utilise de mon coté pour suivre l’actualité SharePoint.

Tout d’abord : http://www.planetsharepoint.org/

image

On y retrouve la majeure partie des blogueurs SharePoint intéressants : Agnes Molnar Andrew Connell Arno Nel Bob Fox Brendon Schwartz Chris O'Brien pour n’en citer que les premiers (par ordre alphabétique). A noter que de nombreux français sont répertoriés sur ce flux.

Mais la communauté SharePoint, ce n’est pas que les blogs, c’est aussi les projet Codeplex. Personnellement, je suis abonné au flux global mais si c’est uniquement les projets SharePoint qui vous intéressent, je vous conseille de regarder du coté de Michael Greth qui propose régulièrement la SharePoint Toolbox.

La dernière en date est la SharePoint Toolbox 31 et Michael nous présente plusieurs projet (nouveaux ou mis à jour)

image

Si vous êtes un fan de postcast et que l’anglais n’est pas un problème, je ne peux que vous recommander le fameux SharePoint Pod Show, c’est la référence en la matière avec plus de 60 épisodes.

image

Et enfin, si vous préférez que l’information vous parvienne directement, Nick Swan (SharePoint MVP qui s’occupe aussi du SharePoint Pod Show) vient de mettre en place un mailing liste : http://www.sharepointweekly.com/

image

Si ça vous tente, regardez à quoi regarde la première issue : http://www.sharepointweekly.com/home/issue1

Pour finir, si même avec tout ça, vous avez encore des questions sur SharePoint, vous pourrez toujours allez les poser sur les forums suivants :

Vous voilà équipé pour passer le temps pendant que tout le monde est en vacances ! Smile

<Philippe/>

SharePoint 2010 : Développement SharePoint Online et Silverlight – Partie 0 : Contexte

Ce billet fait partie de la série de posts liés au développement sur SharePoint Online.

Le but de cette série est de montrer/démontrer/prouver qu’il est tout à fait possible de développer des composants voire des applications complètes directement dans le Cloud de Microsoft (dans le contexte SharePoint).

Le cœur de cette série se concentrera sur un petit plaisir de développeur lorsqu’on travaille avec SharePoint 2010 : La possibilité de développer simplement des composants Silverlight pour SharePoint.

Et afin d’être le plus complet possible, je vais repartir sur une série de post que j’avais rédigée en 2008/2009 sur la création d’une fonctionnalité de Quizz dans SharePoint.

Cette fonctionnalité en elle-même est relativement simple :

  1. On veut pouvoir créer plusieurs quizz (Titre, Description, Catégorie)
  2. Un quizz à plusieurs questions
  3. Une question à plusieurs réponse proposée, potentiellement plusieurs valides
  4. Une web part Quizz permet de sélectionner un Quizz
  5. L’utilisation navigue de questions en questions grâce à la webpart
  6. Un camembert représentant le nombre de bonnes/mauvaises réponses est affiché à la fin et lui permet de ressayer le quizz si il le souhaite

Bref on dit souvent qu’une image vaut mieux qu'un long discours donc voilà à quoi ça devrait (normalement) ressembler une fois terminé.

QuizzMockup

Cette fonctionnalité avait été reprise à l’époque durant la session des Techdays 2009 que j’avais présentée avec Adrien Siffermann. Cela vous donnera une idée du fonctionnement de l’application.

image

Pour rappel, le plan plus ou moins structuré de l’époque allait de la création de la solution et l’organisation du projet et des features à l’exécution de test (unitaires, fonctionnels, charges).

Si on revient au présent, le but de cette série sera donc de vous montrer comment on peut faire la même choses (en mieux) avec SharePoint 2010.

Dans le désordre, on abordera les points suivants :

  • Intégration Silverlight & SharePoint
  • Model Object Client Silverlight
  • Automatiser le déploiement sur son environnement de A à Z via PowerShell
  • Pattern MVVM
  • Création de contenu via Powershell
  • Intégration avec TFS 2010
  • Création du projet, architecture de la solution
  • Utilisation de MTM (Microsoft Test Manager) et exécution automatique de test
  • TypeMock, Pex, Kezako ?
  • Bonnes pratiques de développement
  • Les restrictions posées par SharePoint Online

<Philippe/>

SharePoint 2010 : Nouveau centre de ressources de bonne pratiques pour SharePoint 2010

Ca y est, la version 2010 du centre de bonne pratiques appliquées à SharePoint est enfin disponible sur TechNet http://technet.microsoft.com/en-us/sharepoint/hh189420.aspx

centre de ressources de bonne pratiques pour SharePoint 2010

Selon Microsoft, Les articles liés aux bonnes pratiques et le Centre de ressources associé ont été certains des contenus plus populaires lors des précédentes versions. Ce qui semble assez logique, car souvent les clients passent par plusieurs étapes quand on parle de la mise en place de SharePoint dans l’entreprise :

  • Prendre conscience de l’intérêt du produit et de son positionnement au sein du marché actuel (ie : SharePoint is leading Gartner Magic Quadrant for Horizontal Portals)
     SharePoint is leading Gartner Magic Quadrant for Horizontal Portals
  • Installer pour la première fois SharePoint 2010 dans une machine virtuelle en mode “next, next, installation avec le compte administrateur, next, next”
  • Se rendre compte que ca risque d’être un peu plus compliqué que ça à installer, configurer et maintenir
  • Rechercher des informations sur les bonnes pratiques associées

Et bien, dorénavant, l’information existe et est facilement référencée via le centre de bonne pratiques !

Les nouveaux articles ont été conjointement écrit par les équipes SharePoint Customer Engineering et Microsoft Consulting Services en se basant sur leur retours d’expériences afin d’éviter certains des pièges de déploiement courants et de garder votre environnements SharePoint disponibles et performants.

Vous y retrouverez les informations pour les IT :

Vous y retrouverez aussi les liens vers les Ressources dédiés aux développeurs

Evidemment d’autres articles verront le jour dans les semaines à venir afin de combler les manques par rapport à la version 2007 du centre de bonne pratiques.

Best Practices is Good for You

Au final on y retrouve des articles au contenu intéressant même si ils reprennent parfois des informations qui pourraient sembler évidentes pour beaucoup. Et pourtant on se rend compte que bien souvent ces informations ne sont pas mises en pratiques en production…

Pour ma part, j’ai particulièrement apprécié le Best practices for team collaboration sites (SharePoint Server 2010). Il écrit de manière synthétique quels problèmes ont peut rencontrés, comment les résoudre (en référençant les whitepapers et autres articles disponibles à ce sujet), voire même vous propose d’aller regarder du coté des éditeurs de logiciels comme Lightning Tools qui répondent à certaines problématiques non gérées par SharePoint.

Bonne lecture.

<Philippe/>

SharePoint 2010 : Développement SharePoint Online, Personnalisation Graphique et Packaging – Partie 2

Ce billet fait partie de la série de posts liés au développement sur SharePoint Online. Il fait suite au post précédent qui à pour but de montrer qu’on peut configurer automatiquement un site SharePoint hebergé dans le cloud de Microsoft en un seul clic.

Le but étant de partir du fameux site SharePoint classique pour arriver à un site complètement personnalisé en un clic de feature.

image

Feature Désactivée

Feature Activée

image image

Dans le précédent post, on a vu comment uploader les fichiers nécessaires à ce changement de look & feel et à les publier proprement (archiver, approuver et publier pour être précis) dans une solution Sandboxed exécutée sur un SharePoint Online.

Le but est maintenant de voir comment :

  • Lier les MasterPages aux sites et assigner le nouveau layout à la page par défaut
  • Insérer du contenu HTML dans la publishing page.
  • Changer les valeurs de configuration de la recherche

Lier les Masterpages et autres dépendances graphiques

// Enumerate through each site and apply branding.
foreach (SPWeb web in siteCollection.AllWebs)
{
    try
    {
        //Only if Search or Publishing webtemplate
        if (web.WebTemplateId == 90 || web.WebTemplateId == 53)
        {
            if (web.WebTemplateId == 90)
                web.CustomMasterUrl = webAppRelativePath + "_catalogs/masterpage/Synesthesia-search.master";
            else
            {
                web.CustomMasterUrl = webAppRelativePath + "_catalogs/masterpage/Synesthesia-home.master";
                web.MasterUrl = webAppRelativePath + "_catalogs/masterpage/Synesthesia.master";
                web.CustomJavaScriptFileUrl = webAppRelativePath + "Style Library/Synesthesia/jquery.nivo.slider.js";
  }
 
            web.UIVersion = 4;
            web.Update();
        }
    }
    // Best Practices: Using Disposable Windows SharePoint Services Objects
    // http://msdn.microsoft.com/en-us/library/aa973248.aspx 
    finally
    {
        if (web != null)
            web.Dispose();
    }
}

Dans ce bout de code (dans le lequel, je ne catche aucune exception…), j’itère sur les sites de ma collection et effectue le changement de mes masterpages uniquement sur les Search ou Publishing Webtemplate.

Il faut simplement savoir que j’utilise une masterpage sensiblement différente pour le site de recherche et que l’utilisation de CustomMasterUrl et MasterUrl dépend de la règle suivante :

  • Les pages de publications utilisent le token ~masterurl/custom.master
  • Toutes les autres pages standards (formulaires et view pages) utilisent le token ~masterurl.default.master

Ainsi, en utilisant CustomMasterUrl & MasterUrl, je change les valeurs de ces token dynamiquement et du coup les pages chargent les nouvelles masterpages.

Bien sur, on n’oublie pas de respecter les bonnes pratiques de développement et on pense à libérer explicitement le SPWeb

Nota Bene :

Si ce que je viens de vous dire est du chinois pour vous et que la page Best Practices: Using Disposable Windows SharePoint Services Objects (http://msdn.microsoft.com/en-us/library/aa973248.aspx) vous semble difficile à digérer, je vous conseille d’utiliser SPDisposeCheck http://archive.msdn.microsoft.com/SPDisposeCheck. SPDisposeCheck est un outil qui aide les développeurs et les administrateurs à vérifier que les développements SharePoint respecttent les bonnes pratiques en terme de libération des ressources.

C’est pratique, rapide et ca peut éviter que votre administrateur vous séquestre pendant 3 semaines parce que vos fuites mémoire ont fait crasher sa ferme SharePoint…

Assigner un nouveau modèle de page à la page d’acceuil

   1:  else
   2:  {
   3:      web.CustomMasterUrl = webAppRelativePath + "_catalogs/masterpage/Synesthesia-home.master";
   4:      web.MasterUrl = webAppRelativePath + "_catalogs/masterpage/Synesthesia.master";
   5:      web.CustomJavaScriptFileUrl = webAppRelativePath + "Style Library/Synesthesia/jquery.nivo.slider.js";
   6:   
   7:      // Unfortunately there is no EASY way to change a Pagelayout's Publishing page from a Sandbox Solution, 
   8:      // So it's quick & dirty mode ON. Thx God for Reflector.
   9:      SPFile defaultPage = web.GetFile(web.ServerRelativeUrl + "pages/default.aspx");
  10:      string layoutUrl = webAppRelativePath + "_catalogs/masterpage/synesthesia.aspx";
  11:      string layoutDescription = "Synesthesia Page Layout";
  12:      SetPageLayout(defaultPage, layoutUrl, layoutDescription);
  13:   
  14:      string htmlContent = @"<br/><br/><br/><br/><div class='col'><h3>Quisque Vel Lorem</h3><div class='ft'><p>Quisque vel lorem eu libero laoreet facilisis. Aenean placerat, ligula quis placerat iaculis, mi magna luctus nibh, adipiscing pretium erat neque vitae augue.</p><p><a href='#'>Read More</a></p></div></div><div class='col'><h3>Placerat Iaculis</h3><div class='ft'><p>Quisque vel lorem eu libero laoreet facilisis. Aenean placerat, ligula quis placerat iaculis, mi magna luctus nibh, adipiscing pretium erat neque vitae augue.</p><p><a href='#'>Read More</a></p></div></div><div class='col last'><h3>Vitae Augue</h3><div class='ft'><p>Quisque vel lorem eu libero laoreet facilisis. Aenean placerat, ligula quis placerat iaculis, mi magna luctus nibh, adipiscing pretium erat neque vitae augue.</p><p><a href='#'>Read More</a></p></div></div>";
  15:      ReplacePublishingPageContent(defaultPage, htmlContent);
  16:  }

Ici, on a un petit problème… Dans un monde normal (comprenez dans une Solution de type Ferme), j’aurais accès au modèle objet complet de SharePoint et je pourrais faire ce genre de chose :

  • Récupèrer mon PublishingWeb
    • PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web))
  • Récupèrer mon PageLayout
    • soit via pubWeb.GetAvailablePageLayouts() soit via une requête CAML
  • Récupèrer ma page
    • PublishingPage.GetPublishingPage(listItem)
  • Assigner mon Layout
    • page.Layout = newLayout
  • Mettre à jour.

Sauf que dans un univers Sandboxed & (et en plus dans SharePoint Online), je n’ai pas accès au namespace Publishing. Donc il va falloir ruser :

Il faut savoir que dans SharePoint, tout objet hérite potentiellement de SPListItem et le reste n’est que Métadonnées supplémentaires. L’utilisation du namespace Publishing ne fait rien de plus que de rajouter une couche d’abstraction pour nous simplifier la vie au jour le jour.

Mais rien ne nous empêche de le faire à l’ancienne en prenant bien soin de lancer reflector avant et de voir ce qu’il y a dans la DLL en question :

Au final, vous l’aurez compris, la partie intéressante est dans la fonction SetPageLayout(defaultPage, layoutUrl, layoutDescription);

   1:  /// <summary>
   2:  /// Sets the page layout.
   3:  /// </summary>
   4:  /// <param name="page">The page.</param>
   5:  /// <param name="layoutUrl">The layout URL.</param>
   6:  /// <param name="layoutDescription">The layout description.</param>
   7:  private void SetPageLayout(SPFile page, string layoutUrl, string layoutDescription)
   8:  {
   9:      EnableChanges(page);
  10:   
  11:      SPListItem pageItem = page.Item;
  12:   
  13:      Guid pageLayoutFieldGuid = new Guid("0f800910-b30d-4c8f-b011-8189b2297094");
  14:   
  15:      pageItem[pageLayoutFieldGuid] = new SPFieldUrlValue()
  16:      {
  17:          Url = layoutUrl,
  18:          Description = layoutDescription
  19:      };
  20:      pageItem.Properties["PublishingPageLayoutName"] = layoutDescription;
  21:      pageItem.Update();
  22:      page.Update();
  23:   
  24:      FinalizeChanges(page);
  25:  }
  26:   
  27:  /// <summary>
  28:  /// Finalizes the changes.
  29:  /// </summary>
  30:  /// <param name="file">The file.</param>
  31:  private void FinalizeChanges(SPFile file)
  32:  {
  33:      // Depending on the settings of the parent document library we may need to check in and/or (publish or approve) the file
  34:      if (file.Level == SPFileLevel.Checkout)
  35:          file.CheckIn(string.Empty, SPCheckinType.MajorCheckIn);
  36:      if (file.Level == SPFileLevel.Draft)
  37:      {
  38:          if (file.DocumentLibrary.EnableModeration)
  39:              file.Approve(string.Empty);
  40:          else
  41:              file.Publish(string.Empty);
  42:      }
  43:  }
  44:   
  45:  /// <summary>
  46:  /// Enables the changes.
  47:  /// </summary>
  48:  /// <param name="file">The file.</param>
  49:  private void EnableChanges(SPFile file)
  50:  {
  51:      if (file.RequiresCheckout && file.CheckOutType == SPFile.SPCheckOutType.None)
  52:      {
  53:          file.CheckOut();
  54:      }
  55:  }

Le bout de code qui nous intéresse ici est de la ligne 5 à 16 :

   1:  private void SetPageLayout(SPFile page, string layoutUrl, string layoutDescription)
   2:  {
   3:      …;
   4:   
   5:      SPListItem pageItem = page.Item;
   6:   
   7:      Guid pageLayoutFieldGuid = new Guid("0f800910-b30d-4c8f-b011-8189b2297094");
   8:   
   9:      pageItem[pageLayoutFieldGuid] = new SPFieldUrlValue()
  10:      {
  11:          Url = layoutUrl,
  12:          Description = layoutDescription
  13:      };
  14:      pageItem.Properties["PublishingPageLayoutName"] = layoutDescription;
  15:      pageItem.Update();
  16:      page.Update();
  17:   
  18:      …;
  19:  }

Cette portion de code est plus ou moins directement importée du code que j’ai pu lire dans Reflector en regardant ce qu’il se passe quand on fait Page.Layout = newLayout

Au final, je récupère l’élément correspondant à la page, stocke l’url du nouveau modèle de page dans la bonne métadonnée, je rajoute la description dans le properties bag de l’élément et j’update le tout

Au final, le code est simplissime mais la façon de faire est un peu différente de ce qu’on est habitué à faire en général.

Insérer du contenu HTML dans la page d’accueil

…Qui est une page de publication donc à priori on va avoir le même problème… et donc la même solution !

/// <summary>
/// Replaces the content of the publishing page.
/// </summary>
/// <param name="page">The page.</param>
/// <param name="htmlContent">Content of the HTML.</param>
private void ReplacePublishingPageContent(SPFile page, object htmlContent)
{
    EnableChanges(page);
 
    SPListItem pageItem = page.Item;
 
    // Can't Activate on SPO cause of FieldId, Publishing namespace.
    //pageItem[FieldId.PublishingPageContent] = htmlContent;
 
    Guid publishingPageContentFieldGuid = new Guid("F55C4D88-1F2E-4ad9-AAA8-819AF4EE7EE8");
    pageItem[publishingPageContentFieldGuid] = htmlContent;
    pageItem.Update();
    page.Update();
 
    FinalizeChanges(page);
}

On remarquera ici, une petite différence.

En effet, dans une sandbox développée sur mon environnement de développement le code pageItem[FieldId.PublishingPageContent] = htmlContent fonctionnait parfaitement.

Lors de mon passage sur l’environnement SharePoint Online, il m’a été impossible de déployer ma sandboxed solution parce que je faisais référence à FieldID. J’ai du récupèrer la valeur du champ PublishingPageContent et le spécifier en dur dans mon code.

Rien de bien grave mais c’est à noter qu’il peut y avoir des différences entre votre environnement Sandboxed et celui de SPO.

Changer les valeurs de configuration de la recherche

Et pour finir sur une petite pointe d’humour, je vais vous montrer comment arriver à changer les configurations liées à la recherche dans la collection de site :

La première chose qui surprend, c’est que vous n’avez aucune propriété à ce sujet sur votre SPSite… Du coup, mon premier réflexe a été de regarder le nom de la page applicative qui me permettait de faire ce changement dans SharePoint.

Ce qui m’a forcément ramener à Reflector et à examiner exactement ce qui se passait dans ce bout de code. Et bien figurez vous que les informations sont stockées à cet endroit :

  • rootWeb.AllProperties["SRCH_ENH_FTR_URL"]
  • rootWeb.AllProperties["SRCH_TRAGET_RESULTS_PAGE"]

Non, je n’ai pas fait de typos dans la chaine de caractères des propriétés... Du coup, j’applique le même code dans ma sandbox :

// Doesn't work (ie. DO NOTHING) when run inside a Sandbox Solution
// Cf : http://www.moss2007.be/blogs/vandest/archive/2011/03/06/sharepoint-spweb-properties-versus-spweb-allproperties.aspx
rootWeb.AllProperties["SRCH_ENH_FTR_URL"] = webAppRelativePath + "Search";
rootWeb.AllProperties["SRCH_TRAGET_RESULTS_PAGE"] = webAppRelativePath + "Search/Results.aspx";
rootWeb.Update();

Sauf que rien ne se passe… Aucune exceptions, messages d’erreur, rien dans les fichiers de log, rien... En mode debug, mon code est bien exécuté mais il ne change pas la valeur de la propriété.

Deuxième réflexe, un petit bing/google pour voir si je suis le seul à avoir fait ce genre de chose (la réponse est bien évidemment non), et je tombe sur un post de blog très intéressant http://www.moss2007.be/blogs/vandest/archive/2011/03/06/sharepoint-spweb-properties-versus-spweb-allproperties.aspx

En résumé :

  • Si la propriété SRCH_ENH_FTR_URL n’est pas entièrement en majuscules, ca ne marchera pas.
  • Si vous êtes dans un environnement Sandbox, SPWeb.AllProperties est uniquement accessible en ReadOnly. Mais si vous essayez de mettre à jour le table de Hash, aucune exception ne sera lancée, il ne se passera rien tout simplement.

Néanmoins, je reste persuadé qu’il est possible de changer cette valeur peut être pas par code mais de manière littérale (XML), peut être à l’instanciation du site… A voir.

Dans tout les cas, voilà qui clôt le sujet sur la personnalisation graphique, je pensais parler dans mes prochains billets des possibilités de SharePoint Online & Silverlight ou potentiellement d’une application complète de Covoiturage avec BingMaps.

Si vous avez d’autres idées, je serai ravi de les entendre.

<Phil/>

SharePoint 2010 : Développement SharePoint Online, Personnalisation Graphique et Packaging – Partie 1

Ce billet fait partie de la série de posts liés au développement sur SharePoint Online.

Le but de cette série est de montrer/démontrer/prouver qu’il est tout à fait possible de développer des composants voire des applications complètes directement dans le Cloud de Microsoft (dans le contexte SharePoint).

Le cœur de ce post se concentrera sur un des premiers besoins de la majorité des entreprises qui font le choix Sharepoint Online : La personnalisation graphique.

Si vous avez suivi ma session avec Stéphanie durant les Techdays 2011 concernant les Best Practices de développement pour Sharepoint Online, vous savez déjà qu’il est possible de faire ce genre de chose via SharePoint Designer (@6:40 dans la vidéo).

Naturellement, il est impossible de répondre à une demande de personnalisation graphique avec un outil comme SPD de manière professionnelle. Je ne connais aucun IT SharePoint qui vous laisserait faire ce genre de modification directement sur le serveur en live (par contre, j’en connais au moins un qui me taperait littéralement dessus si je m’y risquais).

Sans compter que vous ne pouvez pas réellement automatiser cette personnalisation; en effet, si vous avez plusieurs sites à configurer, il vous faudra répéter vos actions de configuration/personnalisation pour chacun des sites * environnement de qualification = risques d’ennui et de fautes de manipulations garanties.

Bon maintenant que SPD est hors du scope de ce post, il ne nous reste plus qu’à se demander comment faire avec VisualStudio 2010 :

Dans le cadre de ce post, je pars d’un design fourni sur le site TopSharePoint

http://www.topsharepoint.com/synesthesia-%E2%80%93-free-sharepoint-2010-theme

Synesthesia – Free SharePoint 2010 Theme

Mon objectif est de vous montrer qu’il est possible d’automatiser toutes les tâches qui sont détaillées dans le post ci-dessus :

  • Upload des fichiers Masterpages, images, css & scripts

Synesthesia – Free SharePoint 2010 Theme image15     Synesthesia – Free SharePoint 2010 Theme

  • Lier les MasterPages aux sites

 

  • Changer le modèle de page de la page d’acceuil

  • Rajouter du contenu HTML

  • Changer les configurations liées à la recherche dans la collection de site

Première étape : Création et Agencement du projet

image14

Rien de bien compliqué ! Une feature, 2 Elements Manifest qui vont respectivement uploadés les pagesLayouts, les Masterpages et les Images, css, javascript.

  • Synesthesia.Designer

image17

  • Masterpages >> Elements.xml
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    <Module Name="Masterpages" Url="_catalogs/masterpage">
        <File Path="Masterpages\synesthesia.master" Url="synesthesia.master" >
            <Property Name="UIVersion" Value="4" />
            <Property Name="ContentTypeId" Value="0x010105" />
        </File>
        <File Path="Masterpages\synesthesia-home.master" Url="synesthesia-home.master" >
            <Property Name="UIVersion" Value="4" />
            <Property Name="ContentTypeId" Value="0x010105" />
        </File>
        <File Path="Masterpages\synesthesia-search.master" Url="synesthesia-search.master" >
            <Property Name="UIVersion" Value="4" />
            <Property Name="ContentTypeId" Value="0x010105" />
        </File>
        <File Path="Masterpages\synesthesia.aspx" Url="synesthesia.aspx" Type="GhostableInLibrary">
            <Property Name="Title" Value="Synesthesia Page Layout" />
            <Property Name="ContentType" Value="$Resources:cmscore,contenttype_pagelayout_name;" />
            <Property Name="PublishingPreviewImage" Value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleBodyOnly.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/ArticleBodyOnly.png" />
            <Property Name="PublishingAssociatedContentType" Value=";#$Resources:cmscore,contenttype_articlepage_name;;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D;#"/>
        </File>
    </Module>
    <Module Name="DoStuffOnUploadedFiles">
        <File Path="Masterpages\Elements.xml" Url="Elements_Masterpages_$SharePoint.Feature.Id$.xml" Type="Ghostable" />
    </Module>
</Elements>
  • StyleLibrary >> Element.xml
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="StyleLibrary" RootWebOnly="TRUE" Url="Style Library">
    <File Path="StyleLibrary\Synesthesia\synesthesia.css" Url="Synesthesia/synesthesia.css" />
    <File Path="StyleLibrary\Synesthesia\images\bullets.png" Url="Synesthesia/images/bullets.png" />
    <File Path="StyleLibrary\Synesthesia\images\delicious.png" Url="Synesthesia/images/delicious.png" />
    <File Path="StyleLibrary\Synesthesia\images\facebook.png" Url="Synesthesia/images/facebook.png" />
    <File Path="StyleLibrary\Synesthesia\images\favicon.ico" Url="Synesthesia/images/favicon.ico" />
    <File Path="StyleLibrary\Synesthesia\images\feed.png" Url="Synesthesia/images/feed.png" />
    <File Path="StyleLibrary\Synesthesia\images\friendfeed.png" Url="Synesthesia/images/friendfeed.png" />
    <File Path="StyleLibrary\Synesthesia\images\home1.jpg" Url="Synesthesia/images/home1.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\home1a.jpg" Url="Synesthesia/images/home1a.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\home2.jpg" Url="Synesthesia/images/home2.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\home2a.jpg" Url="Synesthesia/images/home2a.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\home3.jpg" Url="Synesthesia/images/home3.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\home4.jpg" Url="Synesthesia/images/home4.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\home4a.jpg" Url="Synesthesia/images/home4a.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\leftBG.png" Url="Synesthesia/images/leftBG.png" />
    <File Path="StyleLibrary\Synesthesia\images\linkedin.png" Url="Synesthesia/images/linkedin.png" />
    <File Path="StyleLibrary\Synesthesia\images\loading.gif" Url="Synesthesia/images/loading.gif" />
    <File Path="StyleLibrary\Synesthesia\images\mainBg.gif" Url="Synesthesia/images/mainBg.gif" />
    <File Path="StyleLibrary\Synesthesia\images\mainBG.jpg" Url="Synesthesia/images/mainBG.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\mainBG1.png" Url="Synesthesia/images/mainBG1.png" />
    <File Path="StyleLibrary\Synesthesia\images\mainContentBG.png" Url="Synesthesia/images/mainContentBG.png" />
    <File Path="StyleLibrary\Synesthesia\images\navBarFill.png" Url="Synesthesia/images/navBarFill.png" />
    <File Path="StyleLibrary\Synesthesia\images\navBarLeft.png" Url="Synesthesia/images/navBarLeft.png" />
    <File Path="StyleLibrary\Synesthesia\images\navBarRight.png" Url="Synesthesia/images/navBarRight.png" />
    <File Path="StyleLibrary\Synesthesia\images\navBarSep.png" Url="Synesthesia/images/navBarSep.png" />
    <File Path="StyleLibrary\Synesthesia\images\navBlue.gif" Url="Synesthesia/images/navBlue.gif" />
    <File Path="StyleLibrary\Synesthesia\images\next.png" Url="Synesthesia/images/next.png" />
    <File Path="StyleLibrary\Synesthesia\images\prev.png" Url="Synesthesia/images/prev.png" />
    <File Path="StyleLibrary\Synesthesia\images\rss.png" Url="Synesthesia/images/rss.png" />
    <File Path="StyleLibrary\Synesthesia\images\shadow-bottom.png" Url="Synesthesia/images/shadow-bottom.png" />
    <File Path="StyleLibrary\Synesthesia\images\shadow-left.png" Url="Synesthesia/images/shadow-left.png" />
    <File Path="StyleLibrary\Synesthesia\images\shadow-right.png" Url="Synesthesia/images/shadow-right.png" />
    <File Path="StyleLibrary\Synesthesia\images\srcBG.png" Url="Synesthesia/images/srcBG.png" />
    <File Path="StyleLibrary\Synesthesia\images\ss_back.png" Url="Synesthesia/images/ss_back.png" />
    <File Path="StyleLibrary\Synesthesia\images\synesthesia.png" Url="Synesthesia/images/synesthesia.png" />
    <File Path="StyleLibrary\Synesthesia\images\twitter.png" Url="Synesthesia/images/twitter.png" />
    <File Path="StyleLibrary\Synesthesia\images\youtube.png" Url="Synesthesia/images/youtube.png" />
    <File Path="StyleLibrary\Synesthesia\images\arrows.png" Url="Synesthesia/images/arrows.png" />
    <File Path="StyleLibrary\Synesthesia\images\background.png" Url="Synesthesia/images/background.png" />
    <File Path="StyleLibrary\Synesthesia\images\nemo.jpg" Url="Synesthesia/images/nemo.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\toystory.jpg" Url="Synesthesia/images/toystory.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\up.jpg" Url="Synesthesia/images/up.jpg" />
    <File Path="StyleLibrary\Synesthesia\images\walle.jpg" Url="Synesthesia/images/walle.jpg" />
    <File Path="StyleLibrary\Synesthesia\jquery-1.4.3.min.js" Url="Synesthesia/jquery-1.4.3.min.js" />
    <File Path="StyleLibrary\Synesthesia\jquery.nivo.slider.js" Url="Synesthesia/jquery.nivo.slider.js" />
  </Module>
    <Module Name="DoStuffOnUploadedFiles">
        <File Path="StyleLibrary\Elements.xml" Url="Elements_StyleLibrary_$SharePoint.Feature.Id$.xml" Type="Ghostable" />
    </Module>
</Elements>

On déploie, on active, les fichiers sont bien uploadés mais bon… on a un petit souci. Tout les fichiers sont en Checkout, numero de version 0.1…

Si vous faites un petit coup de Bing/Google, vous trouverez rapidement une solution de contournement : http://stefan-stanev-sharepoint-blog.blogspot.com/2011/01/automatically-publishing-files.html

En résumé, dans une sandboxed solution, toute l’API n’est pas disponible. Notamment le fameux GetElementDefinitions qui permet de lire les Element.xml décrivant les features. En général, on utilise cette méthode pour traiter un grand nombre de fichier uploadés. C’est notamment comme ça que j’avais développé à l’époque l’extension de méthode SoVDeleteUploadedFiles sur le post SharePoint 2007 : Extension Method (DeleteUploadedFiles). Vous pourrez retrouver directement le bout sur code sur le projet Codeplex SharePointOfView à l’adresse suivante : http://sharepointofview.codeplex.com/SourceControl/changeset/view/18307#244105

Heureusement, il y a plusieurs solutions alternatives dont notamment une, que je trouve relativement élégante vu le contexte. Cette solution consiste à dire que si on ne peut pas avoir le fichier dans l’API restreinte des Sandboxed Solutions, on va l’obtenir en uploadant le fichier dans SharePoint et y accéder en .Net classique à coup de StreamReader & Xdocument.

Le code est basé sur le travail de Stefan Stanev que j’ai refactoré & étendu pour répondre à mes besoins particuliers pour cette solution :

 
/// <summary>
/// Does stuff on uploaded files.
/// Code base from :http://stefan-stanev-sharepoint-blog.blogspot.com/2011/01/automatically-publishing-files.html
/// Refactored to handle Action parameter.
/// </summary>
/// <param name="web">Current SPWeb</param>
/// <param name="featureID">Feature used to upload all the files</param>
/// <param name="deleteFiles">if set to <c>true</c> [delete files].</param>
/// <param name="toDoList">To do list.</param>
private void DoStuffOnUploadedFiles(SPWeb web, Guid featureID, bool deleteFiles, List<Action<SPFile>> toDoList)
{
    // Create a regular expression pattern for the manifest files
    string pattern = string.Format(@"^.+_{0}.xml$", featureID);
    Regex fileNameRE = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
    XNamespace WS = "http://schemas.microsoft.com/sharepoint/";
 
    // Get the manifest files from the root folder of the site
    SPFile[] manifestFiles = web.RootFolder.Files.Cast<SPFile>().Where(f => fileNameRE.IsMatch(f.Name)).ToArray();
    try
    {
        // Iterate the manifest files
        foreach (SPFile manifestFile in manifestFiles)
        {
            // Load the contents of the manifest file in an XDocument
            MemoryStream mStream = new MemoryStream(manifestFile.OpenBinary());
            StreamReader reader = new StreamReader(mStream, true);
            XDocument manifestDoc = XDocument.Load(reader, LoadOptions.None);
 
            // Iterate over the 'Module' and 'File' elements in the XDocument, concatenating their Url attributes in a smart way so that we grab the site relative file Url-s
            string[] fileUrls = manifestDoc.Root.Elements(WS + "Module")
                .SelectMany(me => me.Elements(WS + "File"), (me, fe) => string.Join("/", new XAttribute[] { me.Attribute("Url"), fe.Attribute("Url") }.Select(attr => attr != null ? attr.Value : null).Where(val => !string.IsNullOrEmpty(val)).ToArray()))
                .ToArray();
 
            // Iterate the file url-s
            foreach (string fileUrl in fileUrls)
            {
                // Get the file
                SPFile file = web.GetFile(fileUrl);
 
                foreach (Action<SPFile> func in toDoList)
                {
                    func(file);
                }
            }
        }
    }
    finally
    {
        if (deleteFiles)
        {
            // finally delete the manifest files from the site root folder
            foreach (SPFile manifestFile in manifestFiles)
                manifestFile.Delete();
        }
    }
}

Le code est relativement simple (et ne gère pratiquement aucun cas d’erreur).Une fois le fichier élément.xml récupéré depuis SharePoint, il est analysé et on récupère la liste des fichiers uploadés. Pour chacun de ces fichiers, on exécutera une liste de fonction données (ToDoList).

Le fichier Element.xml est uploadé ainsi (à la fin de Masterpage >> Element.xml) :
 

    <Module Name="DoStuffOnUploadedFiles">
        <File Path="Masterpages\Elements.xml" Url="Elements_Masterpages_$SharePoint.Feature.Id$.xml" Type="Ghostable" />
    </Module>

Notez l’utilisation intelligente des tokens : Elements_Masterpages_$SharePoint.Feature.Id$.xml pour le rendre unique.

La fonction est appelée ainsi dans la méthode FeatureActivated :

     var toDoList = new List<Action<SPFile>>() { new Action<SPFile>(FinalizeChanges)};
    DoStuffOnUploadedFiles(rootWeb, properties.Feature.DefinitionId, false, toDoList);

Voilà la fonction qui va fait tout le boulot demandé :

/// <summary>
/// Finalizes the changes.
/// </summary>
/// <param name="file">The file.</param>
private void FinalizeChanges(SPFile file)
{
    // Depending on the settings of the parent document library we may need to check in and/or (publish or approve) the file
    if (file.Level == SPFileLevel.Checkout)
        file.CheckIn(string.Empty, SPCheckinType.MajorCheckIn);
    if (file.Level == SPFileLevel.Draft)
    {
        if (file.DocumentLibrary.EnableModeration)
            file.Approve(string.Empty);
        else
            file.Publish(string.Empty);
    }
}

Et voilà, toute ma petite 50aine de fichier Uploadés, Checkin, Approuvés et Publiés !

Pour la touche finale, on peut rajouter cette ligne de code sur le FeatureDeactivating qui supprimera tout les fichiers Uploadés.

    // Clean up
    // Delete set to false car the delegate is going to delete all files in the Element.xml
    var toDoList = new List<Action<SPFile>>() { delegate(SPFile file) { file.Delete(); } };
    DoStuffOnUploadedFiles(topLevelsite, properties.Feature.DefinitionId, false, toDoList);

Maintenant que nous avons une méthode propre et surtout qui s’active/désactive correctement, on verra dans le prochain post :

  • Comment lier les MasterPages aux sites et assigner le nouveau layout à la page par défaut
  • Comment insérer du contenu HTML dans la publishing page.
  • Comment changer les valeurs de configuration de la recherche

<Phil/>

SharePoint 2010 : Mesurer le temps d'exécution de votre code

J’ai récemment parcouru un blog dont le sujet était “Comment mesurer le temps d’exécution de votre code”. En résumé, l’auteur de ce blog expliquait que lorsqu’on souhaite optimiser une webpart custom et autres composants SharePoint pour améliorer les performances, il peut être intéressant de mesurer le temps d’exécution de certains morceaux de code.

Il illustre son propos par ce bout de code :

   1:  var timer = System.Diagnostics.Stopwatch.StartNew();
   2:   
   3:  (your code goes here)
   4:   
   5:  timer.Stop();
   6:  Response.Write(timer.ElapsedMilliseconds);

Bien que correct et techniquement applicable à d’autres cas d’utilisation, ce post m’a paru étrange.

Il m’a fait réagir car il montre bien une des problématiques que nous rencontrons tout les jours en tant que Développeurs SharePoint lorsque nous devons proposer des solutions techniques. A savoir, le besoin de bien connaitre l’ensemble du framework .Net mais surtout de maitriser le framework SharePoint pour proposer la solution appropriée à nos client sans avoir à redévelopper un composant existant ou moins performant.

Dans le cas qui nous intéresse, je pense notamment à une autre façon de mesurer le temps d’exécution de nos composants : SPMonitoredScope

Son usage est très simple car il se base sur l’utilisation du Developper Dashboard :

image

Ce Developper Dashboard fournit diverses informations destinées au développeur :

  • Thread execution time
  • Number, duration, call stack information and query text of each SQL Server query generated by the page
  • Number, duration, and call stack information of each WCF call
  • URL or timer job name
  • Current user
  • Execution start time

Plus d’infos à ce sujet sur http://msdn.microsoft.com/en-us/library/ff512745.aspx

Vous pouvez l’activer de diverses manières : STSADM, Powershell ou par code.

   1:  Stsadm –o setproperty –pn developer-dashboard –pv ondemand (or “on” or “off”)
   2:   
   3:  $devDashboard = [Microsoft.SharePoint.Administration.SPWebService]::ContentService.DeveloperDashboardSettings;
   4:  $devDashboard.DisplayLevel = 'OnDemand';
   5:  $devDashboard.TraceEnabled = $true;
   6:  $devDashboard.Update() 
   7:   
   8:  SPWebService cs = SPWebService.ContentService;
   9:  cs.DeveloperDashboardSettings.DisplayLevel = SPDeveloperDashboardLevel.On;
  10:  cs.DeveloperDashboardSettings.Update();
  11:   

Pour revenir au sujet, en combinant SPMonitoredScope & le Developper Dashboard, il nous est possible de rajouter nos propres bouts de code dans le Developper Dashboard :

   1:  using (new SPMonitoredScope("OnLoad (GetSupplierInformationWP)"))
   2:  {
   3:   
   4:      using (new SPMonitoredScope("Construction de la requete CAML (GetSupplierInformationWP)"))
   5:      {
   6:          #region Construction de la requete CAML
   7:          …;
   8:          #endregion
   9:      }
  10:   
  11:      using (new SPMonitoredScope("Affichage des données (GetSupplierInformationWP)"))
  12:      {
  13:          #region Affichage des données
  14:          …;
  15:          #endregion
  16:      }
  17:   
  18:      using (new SPMonitoredScope("CleanUp & Dispose (GetSupplierInformationWP)"))
  19:      {
  20:          #region CleanUp & Dispose
  21:          …;
  22:          #endregion
  23:      }
  24:  }

Ce qui nous donne :

image

Ca peut s’avérer pratique pendant les phases de debug sur certains composants “poilus”.

<Philippe/>

Office 365 : Ouverture de la béta publique

Enfin ! Office 365 ouvert à tous.

image

Certains on en entendu parler depuis automne dernier. Entre temps près de 100 000 entreprise l’on testé durant sa phase de béta privée. Dorénavant Office 365 est disponible dans plus de 38 pays et 17 langues différents.

Si vous ne savez pas encore trop en quoi Office 365 peut vous aider, je vous suggère de regarder quelques une des ces vidéos qui montrent l’intéraction entre SharePoint Online & Office 365 & d'autres applications de la suite Office

Introductory videos for SharePoint Online for enterprises

Introductory videos for SharePoint Online for professionals and small businesses

image

On notera au passage le concours “Ready for Work” : 5 petites entreprises gagneront 50 000 $ et un an d’office 365. Tout ce qu’il y a faire est de partager sur la page Facebook d’Office 365, comment office 365 vous aide à réaliser votre vison business" en 365 mots Smile

Le simple fait de soumettre votre avis vous permet d’être selectionné pour gagner 5 Winphone 7 chaque semaine.

Si vous n’avez pas encore de compte béta, aller sur : www.office365.com. Il semble que le délai d’activation des clefs béta soit de 2 semaines.

Beta for Enteprise: https://portal.microsoftonline.com/Signup/Registration.aspx?OfferId=4ADF12B2-2115-4E32-815D-BB4B5618A88A&dl=ENTERPRISEPACK&culture=en-us&Country=US

Beta for Small Business:

SharePoint 2010 : Office 365 et SharePoint Online

Après ces Techdays très axés “Cloud Power”, où j’ai eu le plaisir de donner une session à ce sujet avec Stéphanie Hertrich, de plus en plus de personnes s’interrogent sur l’intérêt d’Office 365 et surtout sur la possibilité d’utiliser SharePoint Online au sein de leur entreprise.

image

Pour ceux qui auraient raté le train, Office 365 est la nouvelle génération de solution de communication et de collaboration hébergée par Microsoft.

En résumé, Microsoft héberge pour vous SharePoint 2010, Exchange 2010, Lync (Live Meeting + Office Communicator) dans le Cloud et vous fournit en plus les licences Office Client pour utiliser l’ensemble.
Un des gros avantages d’Office 365 (en plus d’être très compétitif en terme de cout et très souple en terme de licensing) est le fait que la solution est stable, disponible (>99,9%),  adaptable et sécurisée.
Pour plus d’informations, je vous encourage à aller regarder le parcours Office 365 sur les vidéos des Techdays et plus particulièrement la session Office 365 : Vue d'ensemble de la solution (100) animée par Damien Caro, Christian Fumey & Cecilia Lentini.

En ce qui concerne la partie SharePoint Online mise à disposition avec Office 365, on peut par exemple créer des sites pour :

  • Gérer et partager ses documents et son profil sur son site personnel
  • Travailler en équipe et gérer vos projets internes sur des sites d’équipes
  • Toujours savoir ce qui se passe dans l’entreprise grâce à l’intranet de la société
  • Partager des documents avec vos clients et partenaires via l’extranet
  • Avoir un site vitrine facilement éditable afin de se faire connaitre sur internet

Alors bien sur, tout ça c’est de la théorie…

En pratique, on comprend vite que grâce à l’hébergement de SharePoint par Microsoft, on aura de meilleurs services tout en payant moins cher. Mais rapidement, quand on commence à rentrer dans les détails, qu’on explique que le SharePoint auquel le client va accéder est un serveur mutualisé et que les développements ou possibilités de personnalisations sont limités, souvent ça coince.

Et ça coince, car il est très rare de pouvoir répondre aux besoins du client à 100% en utilisant la plateforme en mode OOB (Out of the Box). On est souvent proche du 70% OOB / 30% Personnalisation. Du coup les gens pensent que si ils devaient mettre leur intranet dans SharePoint Online, il devraient faire une croix sur une grande partie de leur besoins fonctionnels.

Et bien c’est FAUX … Car avec cette nouvelle version de SharePoint (2010) est apparue une nouvelle possibilité de déploiement et de développement de fonctionnalités et elle répond parfaitement aux problématiques posées par l’utilisation de SharePoint dans un environnement mutualisé.

Je parle bien sur des Sandboxed Solutions. Sans rentrer dans les détails car je reviendrai sur ce sujet dans un prochain post. Une Sandboxed solution permet de  déployer du code de manière sécurisé au niveau d’une collection de site.

Voilà ce que l’on peut faire (ou pas) avec ces Sanboxed solutions : (tiré de SharePointDevWiki )

Supported

Not Supported

  • List definitions
  • List instances
  • Onet.xml
  • WebTemplate Feature element instead of Webtemp.xml
  • Content Types/Fields
  • Navigation
  • Module/files
  • Feature callouts
  • Web Parts derived from WebPart
  • Event receivers
    • SPItemEventReceiver
    • SPListEventReceiver
    • SPWebEventReceiver
  • Custom Actions
  • Workflows
  • Custom Action groups
  • HideCustomAction element
  • Content Type Binding
  • Web Application-scoped Features
  • Farm-scoped Features
  • CustomPropertyToolPart Class
  • Programmatic workflow
  • Event receivers
    • SPLimitedWebPartManager
  • Timer jobs
  • Visual WebParts
  • SharePoint mapped folders (e.g. "_layouts", and "images")
  • Namespaces
    • ADO.NET
    • System.IO
    • System.Security.Cryptography
    • System.Web.UI.ClientScriptManager

Sauf que dire ça ou rien…

Le problème est que seul des SharePointeurs expérimentés peuvent se rendre compte de ce que cela signifie réellement en terme de possibilités de personnalisation et comment cela se traduira dans l’environnement Sharepoint pour le client final.

Est ce que mon SharePoint va avoir le même look & feel que celui fournit en standard ? Est ce qu’il existe un composant pour connecter mon application métier à mon SharePoint Online ? Autant de questions que les clients,voire même certains intégrateurs, se posent au sujet de SharePoint Online.

C’est pourquoi, au bout de cette longue introduction, vous trouverez un ensemble d’articles axés “Travaux pratiques” qui montreront dans le détail ce qu’on peut faire avec SharePoint Online en terme de personnalisation et de développement mais aussi la simplicité avec laquelle SharePoint peut être étendu.

Le premier exemple qui me vient en tête étant la personnalisation graphique (qui est sans doute la personnalisation la plus demandée par des clients), ce sera sans doute mon prochain post.

Office 365 et SharePoint Online – Introduction

  1. SharePoint Online et la personnalisation graphique
  2. SharePoint Online et Silverlight
  3. SharePoint Online et Bing Maps

Comme toujours, si vous avez des idées/suggestions de “Travaux Pratiques”, les commentaires sont là pour ça

Philippe

SharePoint 2010 : Silverlight Web Part extensions for SharePoint

Je viens de voir une vidéo intéressante sur Channel 9, Worlds are colliding New Silverlight Web Parts for SharePoint dont voici l’url :   http://channel9.msdn.com/Shows/SilverlightTV/Silverlight-TV-68-Worlds-are-Colliding-New-Silverlight-Web-Parts-for-Sharepoint

On y découvre en invité Paul Stubbs (MSFT) qui nous parle des nouvelles fonctionnalités pour Visual Studio que la team SharePoint a développé pour simplifier le développement Silverlight dans Sharepoint.

Il s’agit en fait d’une nouvelle extension Visual Studio qui rajoute deux éléments de projets à vos projets SharePoint 2010 :

image

NB : Le modèle Silverlight WebPart va utiliser la webpart Silverlight fournie en standard dans SharePoint 2010 alors que l’autre projet va crée une Visual WebPart dont le markup par défaut contiendra le JS nécessaire à l’appel du composant Silverlight, à vous de le personnaliser si besoin.

Un fois le modèle choisi en fonction de vos besoins, il vous laisse choisir quel projet Silverlight vous souhaitez rajouter à votre projet SharePoint et vous rajoute ceci :

image

Au final, que fait il ?

  • Il rajoute le composant Silverlight dans SharePoint via ce qu’on appelle un Module (comme on le faisait à la main avant)
  • Ajoute une page de test préconfiguré avec la Webpart en question déjà intégré dans la page pour faciliter le testing.

On notera au passage pour ceux qui se posaient la question du debugging du composant Silverlight, c’est ultra simple, il suffit de cocher :

image

Et de mettre le breakpoint comme on le fait de manière habituelle pour que cela fonctionne aussi simplement qu’avant :

image

Vous pourrez retrouver ces extensions sur la Visual Studio gallery : http://visualstudiogallery.msdn.microsoft.com/e8360a85-58ca-42d1-8de0-e48a1ab071c7

image

PS : Attention, il faut installer les Visual Studio 2010 SharePoint Power Tools avant ^^

Au final, une petite extension qui paye pas de mine mais qui va se révéler très utile aux SharePointeurs aguerris en leur faisant gagner du temps pour les scénarii simples et qui permet de réduire grandement la barrière d’entrée pour les développeurs RIA qui veulent intégrer & tester leur composant dans SharePoint.

Du coup, je peux demander à Niels ou à Mauricio de faire du SharePoint maintenant ! Tire la langue

<Philippe/>

SharePoint 2010 : Webcast de la session Techdays 2011 - Best Practices de développement pour SharePoint Online

 

Le webcast de la session que j’ai eu le plaisir d’animer avec Stephanie Hertrich est en ligne sur le site des Techdays 2011.

Cette session avait pour but de vous montrer les nouvelles possibilités d'extension de la plateforme SharePoint Online ainsi que les différences entre le développement sur SharePoint OnLine que sur Sharepoint On Premises ?

Nous avons vu aussi rapidement comment contourner les restrictions du mode mutualisé dans nos développement, le modèle d'exécution sandbox ainsi que les nouveaux modèles d'accès aux données côté client : le Client Object Model et l'API Rest.

Voici le webcast en question :

Get Microsoft Silverlight

SharePoint 2010 : Nouvel article sur l'Application Lifecycle Management

Ceux qui ont eu le malheur de travailler avec moi savent qu’en tant que “SharePointeur”, je m’intéresse particulièrement à la partie Industrialisation des développements avec SharePoint et à l’ALM.

J’ai eu l’occasion d’en parler lors de sessions aux Techdays (et j’espère pouvoir vous en reparler pour 2011) :

Comme vous le savez sans doute, l’arrivée de 2010 tant pour SharePoint que pour la suite VisualStudio a apporté énormément de choses (essentiellement des bonnes choses ^^) dans le contexte de l’ALM :

  • Des extensions SharePoint pour VisualStudio performantes et extensibles simplement
  • L’administration de SharePoint avec Powershell
  • La possibilité d’importer des WSP directement dans VisualStudio
  • L’amélioration de SharePoint Designer
  • L’installation de SharePoint sur Win7
  • La gestion du versionning pour les Features
  • Le travail réalisé par Patterns & Practices sur SharePoint
  • etc…

Le seul souci, c’est que jusqu’à présent il n’existait pas d’article ou de post concernant la version 2010 et provenant de Microsoft qui récapitulait tout cela pour nous donner une vision globale de l’ALM pour SharePoint 2010.

Nous avions bien des sources comme Team-Based Development in Microsoft Office SharePoint Server 2007 qui pouvaient rester valable mais qui perdaient beaucoup d’intérêt pour un lecteur averti.

image

Et bien c’est chose faite car vous trouverez maintenant à sur le Microsoft SharePoint Developer Documentation Team Blog, un excellent article qui couvre de manière assez large mais très complète l’ensemble de ces concepts :

Application Lifecycle Management in Microsoft SharePoint 2010

Vous y retrouverez entre autres des axes de réponses sur les problématiques de création d’environnements, de gestions des upgrades, de qualifications de livrables, de l’utilisation de SharePoint Designer, etc.

image

Bref, un must à lire si le sujet vous intéresse !

<Philippe/>

SharePoint 2010 : Outil pour résoudre les problématiques de permissions

Je ne sais pas pour vous mais il m’est déjà arrivé chez mes clients d’entendre la problématique suivante :

“Je ne comprend pas pourquoi je n’ai pas accès à ce site alors que j’ai les droits pour y accéder !”

Bien sur, il n’existe pas une seule réponse à cette question, il peut s’agir d’un problème avec IIS, un héritage des permissions qui peut être cassé pour le site donnée qui se trouve être un sous-site de la collection concernée, l’utilisateur qui ne fait pas partie du groupe qui a les droits, etc…

Jusqu’à présent, il n’était pas chose facile de résoudre cette problématique et on devait le faire ce genre de recherche à la main.

Mais bonne nouvelle, Rodney Viana (MSFT) vient de publier sur son blog le code d’une application qui vous permet d’avoir toutes les informations pour résoudre ces problématiques.

http://blogs.msdn.com/b/rodneyviana/archive/2010/11/11/application-to-check-cascade-access-rights-for-a-particular-user-or-anonymous-user-in-sharepoint.aspx

L’idée étant de pouvoir tester différentes configurations au niveau de IIS et Sharepoint puis de décrypter les masques de permission sur une URL donnée.

L’application ressemble à ça :

image

image 

Attention, le fichier généré est assez détaillé :)

<Philippe/>

SharePoint 2010 : Installation facile de SharePoint pour les développeurs

Que vous soyez consultants, développeurs, architecte bref SharePointeurs en général, la problématique de création d’une VM pour utiliser/tester/développer sur SharePoint arrive forcément un jour ou l’autre devant votre porte. Et soyons franc, la plupart du temps, la première réaction est ... :(

Cette problématique se pose surtout quand on veut bien faire les choses : Utiliser les bons comptes, avoir la machine la plus performante, etc… Certaines personnes vous diront d’utiliser la VM Information Worker fournit par MS (2010 Information Worker Demonstration and Evaluation Virtual Machine) qui contient pas mal de logiciels en plus de SharePoint (ce qui peut être bien ou mal en fonction de vos besoins)  et qui vous permet de faire un tour d’horizon rapide de la plateforme.

D’autres vous diront de partir from scratch et de monter la machine vous même. Dans ce cas là, jusqu’à présent, il fallait utiliser les informations fournies sur Technet et les bribes qu’ont pouvait trouver sur le net. Heureusement la communauté SharePoint avait déjà commencé à travailler sur une automatisation d’un environnement SharePoint comme par exemple avec ces projets:

Alors tout ça, c'est très bien sauf qu’on vient d’apprendre que Microsoft vient de publier sa propre version d’un script d’installation de VM SharePoint 2010 pour développeurs !

L’idée est de créer automatiquement (éventuellement sur une VHD Windows7) tout l’environnement nécessaire au bon fonctionnement d’une VM SharePoint pour développeur.

Le lien vers cette excellente nouvelle : http://blogs.msdn.com/b/cjohnson/archive/2010/10/28/announcing-sharepoint-easy-setup-for-developers.aspx

En résumé, ça consiste à installer :

  • SharePoint Server 2010 + pre-requis
    • Visual Studio 2010 Ultimate Edition
    • Silverlight 4 Tools for Visual Studio
    • Expression Studio 4 Ultimate
    • Open XML SDK
    • Visual Studio SDK
    • Visual Studio SharePoint Power Tools
    • Office 2010 Professional Plus
    • SharePoint Designer 2010
    • Visio 2010

    Ces scripts sont écrits en powershell, ils s’occupent du téléchargement des pré-requis pour vous, préparent le dual boot, configurent les logiciels via un fichier de configuration permettant ainsi de rajouter ou supprimer des soft pour personnalisé l'installation en fonction des besoins de votre entreprise.

    Finalement, voici quelques screenshots pour vous donner envie de tester.

    L'ensemble des scripts

    image

     Le fichier de configuration

    image

    A vos VHD !

    <Philippe/>

    SharePoint 2010 : Bamboo Price Calculator

    Avoir un projet SharePoint (2007/2010), c’est bien mais avoir une idée du coût des licences c’est mieux (mais c’est souvent très compliqué ^^)

    Heureusement, je viens de voir que Bamboo Solutions a mis à jour son Price Calculator (la version 2007 est présente ) pour SharePoint 2010.

    Comme sa version précédente, le but du jeu n’est pas de vous donner une estimation au centime près du coût en license de votre infra mais plutôt de vous fournir une vue globale ainsi que quelques pointeurs pour vous mettre dans la bonne direction.

    image

    Comme d’habitude, si vous souhaitez avoir une réponse précise et adaptée à votre cas, contactez le commercial MS en charge de votre compte.

    <Philippe/>

    SharePoint 2010 : Customer Success Stories

    Un petit post rapide pour vous remonter une page du site http://sharepoint.microsoft.com/ qui m’a fait sourire dans un premier temps puis qui m’a été très utile par la suite.

    Plus sérieusement, en plus des études de cas clients classiques :

    image

    Vous retrouverez des vidéos http://sharepoint.microsoft.com/en-us/Pages/Videos.aspx?VideoID=1 au discours très axées marketting qui peuvent néanmoins être très utiles si vous aviez à convaincre votre DSI de la nécessité d’utiliser SharePoint 2010 au sein de votre entreprise ^^

    <Philippe/>

    SharePoint 2010 : Comparaison entre la version 2007 et la version 2010

    Avant de passer en mode “rentrée” pour la reprise en main de ce blog après une longue période de vacances, j’en profite pour poster quelsues liens qui m’ont été bien utiles pour expliquer, depuis quelques mois déjà, quelles différences il existe en terme de fonctionnalités entre les 2 dernières versions de SharePoint.

    Bref, plus un pense bête qu’autre chose, qui j’espère vous sera utile à vous aussi.

    image

    Enterprise Social Computing features comparison: MOSS 2007 vs. Sharepoint 2010 

    SharePoint 2007 vs SharePoint 2010

    SharePoint 2010 : Sharepoint User Group UK (SUGUK) à Nottingham

    Profitant d’être en Angleterre depuis quelques jours pour Wygwam avec Christian Hougardy, j’ai appris hier que l’équipe UK allait organiser une réunion de son club utilisateur.

    Penny Coventry et Andrew Woodward allait présenter des sujets sur les Workflows dans SharePoint 2007 et Automated UI Testing.

    Autant la partie sur les Workflows reste intéressante car tout le monde n’a pas encore migré sur SharePoint 2010, autant j’étais plus curieux de ce qu’Andrew allait nous montrer sur l’Automated UI Testing. C’est le genre de sujet qui rentre tout à fait dans mon centre d’intérêt : L’industrialisation des développements SharePoint avec Team System  (cf précédente sessions aux techdays 2009-2010).

    Au final, une session intéressante malgré une démo qui a pris la tangente :). L’exemple en question était basé sur une application qu’Andrew a développée avec SharePoint 2010 et Visual Studio 2010 dont le but est de gérer les projets agile sur sharepoint 2010 via l’utilisation de burndown chart, etc… (plus d’infos sur http://www.21scrum.com/)

    Andrew va partager ses slides sous peu, je les rajouterai asap.

    De plus c’était aussi l’occasion de voir comme les anglais organisent ce genre d’event et plutôt que de commenter je passe directement aux photos :)

    IMG_2652 

    Penny et Andrew en train de se préparer

    IMG_2656IMG_2659IMG_2662IMG_2660

    Au final, une 40aine de personnes devaient être présentes pour profiter à la fois des 2 sessions mais aussi du Barbecue (ci-dessous)

    IMG_2653 IMG_2654 IMG_2655     

    Et évidemment la suite de l’UG s’est terminée dans un pub local (sympa le décor, ça change des pubs parisiens)

    IMG_2663IMG_2664 IMG_2666 

    Bref, au final une chouette soirée avec des SharePointeurs UK très sympathiques. Un grand merci pour l’organisation à @m_macrae et @wortony.

    <Philippe/>

    SharePoint 2010 : MVP++

    image

    C'est avec beaucoup de plaisir que j'ai appris mon renouvellement MVP SharePoint pour la troisième année.

    Je dois dire que je vois ça comme un bon présage pour l’année à venir surtout que ma petite fille est censée venir au monde en avril…

    Avec un peu de chance, ce sera une petite geekette et tout sera parfait :)

    En tout cas, une grand merci à toutes les personnes, amis, collègues et/ou autres, qui m'ont apportées leur soutien tout au long de l'année.

    PS : J'en profite pour passer une petite dédicace à Julien Corioland pour sa nomination MVP Client App Dev.

    image

    Félicitations Beedoo, c’est mérité :)

    <Philippe/>

    [MSTD10] SharePoint 2010 et Team Foundation Server

    Un post rapide pour vous informer de la disponibilité de la vidéo de ma présentation sur SharePoint 2010 & Team Foundation Server.

    image

    http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=20215d48-02e3-4d43-8c36-e53505c3b316

    Dans la même lignée du discours tenu pendant cette session, je vous encourage vraiment à aller faire un tour sur le site codeplex de la SharePoint Guidance (http://codeplex.com/spg), Nous en sommes déjà au 5eme drop.

    Vous y retrouverez des informations intéressantes sur les sujets suivants :

    Item Iteration Status
    Maintaining Application Configuration Settings 1 Done
    Unit testing a SharePoint application 1 Done
    Logging Event Information (categorization and filtering) 2 Done
    Execution models for SharePoint 3 in progress
    Data models for SharePoint 4 in progress
    Application patterns for Service Applications 5 Not Started
    Structural models for SharePoint 5 Not Started
    Application Patterns for using Silverlight 6 Not Started
    Application patterns for using AJAX 6 Not Started
    Application patterns for client responsiveness 7 Not Started
    Data/service access approaches for client logic 8 Not Started
    Integrated application patterns 9 Not Started

    En tout cas, vivement les prochains techdays :)

    <Philippe/>

    Plus de Messages Page suivante »

    Les 10 derniers blogs postés

    - Office 365: Comment utiliser la DLL Microsoft.SharePoint.Client.UserProfiles.dll dans son code PowerShell par Blog Technique de Romelard Fabrice le 09-23-2016, 09:15

    - Office 365: Comment obtenir des informations des Users Profiles du tenant via PowerShell par Blog Technique de Romelard Fabrice le 09-22-2016, 17:58

    - Event: La saison des conférence reprend, comme les champignons par Blog Technique de Romelard Fabrice le 09-21-2016, 10:05

    - Microsoft Hololens par Le Blog (Vert) d'Arnaud JUND le 09-21-2016, 07:55

    - SharePoint, édition multi fenêtres d'un élément de liste par Le Blog (Vert) d'Arnaud JUND le 09-19-2016, 13:10

    - Ouvrir avec l’explorateur vos bibliothèques #SharePoint et #OneDrive… par Le blog de Patrick [MVP Office 365] le 09-10-2016, 17:47

    - Contenu Festival #SharePoint et #Office 365 de mai 2016 à Paris #SPSParis par Le blog de Patrick [MVP Office 365] le 09-10-2016, 16:44

    - Changements important pour Microsoft Store Services SDK par Blog de Jérémy Jeanson le 08-16-2016, 12:38

    - Office 365: Le ContentTypeHub et les Content Types Orphelins par Blog Technique de Romelard Fabrice le 08-12-2016, 16:59

    - Office 365: Comment trouver simplement l’adresse de la collection de site associée à une chaine par Blog Technique de Romelard Fabrice le 08-11-2016, 13:22