Développement SharePoint

[SP2013] – Récupérer le statut d’un Workflow d’Approbation en REST

Posted on

Bonjour,

Aujourd’hui, un article orienté développement. Il s’agit ici d’une fonction JavaScript permettant de récupérer le statut d’un Workflow d’approbation standard SharePoint Server 2013 afin de l’afficher dans une page par exemple.

A la base, dans mon exemple, je devais afficher ce statut d’approbation dans la page d’accueil d’un Document Set sur lequel portait ce flux d’approbation. L’idée était d’insérer, via un WebPart  éditeur de contenu, un bloc de HTML et de fonctions Javascript afin d’afficher ce statut.

Je ne vais détailler ici que la partie requêtage, il sera facile pour vous d’utiliser ceci dans une logique métier par exemple.

1/ Statuts du Flux de travail d’approbation

Première chose à connaitre, ce sont les différents statuts qui peuvent être affichés lors de l’utilisation de ce type de flux de travail. Ces statuts sont représentés par un entier :


0 == Not Started
1 == Failed on Start
2 == In Progress
3 == Error Occurred
4 == Canceled
5 == Completed
6 == Failed on Start(Retrying)
7 == Error Occurred (Retrying)
15 == Canceled
16 == Approved
17 == Rejected

 

2/ Appeler la fonction…

Pour appeler la fonction, j’ai choisi d’utiliser la fonction JQuery ready(), qui appelle ExecuteOrDelayUntilScriptLoaded() afin de différer l’appel à ma fonction qui récupère le statut, après le chargement de sp.js :


$(document).ready(function () { ExecuteOrDelayUntilScriptLoaded(loadItem, "sp.js"); });

Puis on déclare la fonction loadItem. Cette fonction récupère l’identifiant de l’item courant dans la QueryString (vous pouvez modifier cette partie suivant le cas d’usage) puis construit l’url de la requête REST à partir de cet identifiant et de l’identifiant de la Liste :

function loadItem() {
itemId = getParameterByName('ID');
console.log(WFName + ' : Current item id = ' + itemId);
listId = _spPageContextInfo.pageListId;
console.log(WFName + ' : Current list id = ' + listId);
var url = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getById('" + listId + "')/items(" + itemId + ")?$expand=FieldValuesAsHtml";
var requestHeaders = { "accept" : "application/json;odata=verbose" };
return $.ajax({
url: url,
method: "GET",
contentType: "application/json;odata=verbose",
headers: requestHeaders,
success : loaditemsuccess,
error : onError
});
}

 

Suite à l’exécution de la fonction précédente, en cas de succès, on récupère le statut du Workflow et on affiche le statut comme souhaité (non détaillé dans cet article) :


var WFColunmName = 'Validati';

var WFName = 'WF Approbation';

function loaditemsuccess(data, request) {
var moderationStatusName = data.d.FieldValuesAsHtml[WFColumnName];
console.log(WFName + ' : Moderation Status = ' + moderationStatusName);

//Change DOM into div "WFStatus" to add link to start workflow + icon
if(moderationStatusName == 'Canceled') {
//Display link to start a new worklow
displayStartNewWorkflow('Workflow has been canceled. ','');
}
else if(moderationStatusName == 'Rejected') {
//Display link to start a new worklow
displayStartNewWorkflow('Workflow has been rejected. ','');
}
else if(moderationStatusName == 'Approved') {
//Document set is already approved, display a special icon with no link
displayWorkflowApproved();
}
else if(moderationStatusName == 'In Progress') {
displayWorkflowInProgress();
}
else if (moderationStatusName == '') {
//Display link to start a new worklow
displayStartNewWorkflow('','');
}
else {
onError('Unable to load workflow status.');
}
}

 

Pour récupérer le statut du Workflow, on s’appuie donc sur la colonne de statut créée par l’association du flux d’approbation à la liste/bibliothèque. C’est donc plutôt simple, il suffit d’une requête REST (que je commence à préférer au JSOM ! 🙂 )

 

3/ Quelques fonctions utiles

Voici quelques fonctions que j’ai utilisé dans mon code :


//Function to get a parameter value from QueryString
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(window.location.search);
if(results == null){
return "";
}
else{
return decodeURIComponent(results[1].replace(/\+/g, " "));
}
}
 

//Function to manage errors
function onError(error) {
console.log('An error occured:' + error);
}

 

Et voilà !

[SP2013] – Accéder aux données du Secure Store Service en C#

Posted on Updated on

Bonjour à tous,

Aujourd’hui un article technique pour vous montrer comment accéder aux données stockées dans le Secure Store Service de SharePoint Server 2013.

A quoi sert ce service ? Il suffit de suivre le lien : https://technet.microsoft.com/fr-fr/library/Ee806866.aspx

1/ Contexte général

Le but étant de stocker des données de type login, mot de passe, domaine, Pin, etc. afin d’accéder à des systèmes externe à SharePoint.

Habituellement, on utilise le Secure Store Service (SSS) de SharePoint pour enregistrer les credentials utilisés pour la mise en œuvre de listes externes dans SharePoint par le biais du Business Connectivity Service (BCS, ex-BDC). imaginons le cas où l’on souhaite afficher dans SharePoint une base de clients/fournisseurs qui provient d’une base de données SQL Server. Cette base peut utiliser un mode d’authentification SQL (et non Annuaire AD) et il faut donc envoyer un login/mot de passe pour pouvoir se connecter et requêter la base depuis SharePoint. C’est donc un SSO (Single Sign-On) mais Inter-Domaine (Cross-Domain) que nous propose Microsoft. Les données de cette base d’identifiants sont chiffrées via une clé générée par SharePoint lui-même (à partir d’une phrase secrète qu’il ne faut pas perdre !).

Dans le cas présent, le but est d’accéder à ce Secure Store Service afin de stocker, lire, mettre à jour les données d’un utilisateur, et proposer par exemple un formulaire de connexion, de mise à jour de ces données directement depuis un portail SharePoint.

2/ Architecture du service

Le Secure Store Service est une Application de Service proposée par SharePoint Server 2013 (Standard ou Enterprise). Elle peut se déployer par la console d’administration centrale ou PowerShell (voir l’article Technet précédent).

La clé de chiffrement permet de chiffrer les données stockées dans la base de données associée à l’application de service.

Les données sont stockées dans des Target Applications (Applications cibles). Chaque Target application stocke les données pour 1 application, par exemple :

  • Une Target Application pour la connexion à une base SQL Server
  • Une Target Application pour la connexion à une ferme Dynamics CRM
  • Une Target Application pour la connexion à SAP
  • Une Target Application pour la connexion à une base Oracle

Chacune de ces Target Application est définie par l’administrateur SharePoint où il doit fournir :

  1. ID de l’application cible : identifiant unique de la Target Application
  2. Nom complet : nom d’affichage de la Target Application
  3. Messagerie de contact : adresse e-mail de contact pour l’administrateur de cette Target Application
  4. Url de la page d’application cible : voir article Technet
  5. Type d’application cible : il s’agit ici d’indiquer si chaque utilisateur aura sa propre identification ou si l’on va définir une identification pour tout un groupe de personnes (individual ou group).

Ensuite vous devrez spécifier les champs que vous souhaitez enregistrer : champs d’identification Windows, champs d’identification standards (login/mot de passe), code Pin, domaine, etc.

Et enfin les administrateurs de la Target Application. Bref, tout cela est plutôt bien défini dans l’article Technet.

3/ Lire des credentials depuis mon code en C#

Voici enfin le cœur du problème. Comment accéder aux données stockées dans le SSS depuis mon code ?

J’ai tout d’abord défini une classe métier pour stocker quelques informations : Login, password, Login SharePoint, Nom Complet et E-mail de l’utilisateur :


namespace MonDev.LogMe.Utils
{
   public class SSSCredentials
   {
      public string Login { get; set; }
      public string Password { get; set; }
      public string SPLogin { get; set; }
      public string SPFullName { get; set; }
      public string SPEmail { get; set; }
   }
}

Ensuite, voici le code de la méthode GetCredentials que j’utilise. Les paramètres attendus sont :

  • site : collection de sites courante
  • applicationID : identifiant (interne) de la Target Application

   /// Get credentials for current connected user from Secure Store Service.
   /// current site collection, associated to a Secure Store Service at Web Application Level
   /// Target Application ID in Secure Store Service
   /// Returns Credentials if found, null otherwise.
   public static SSSCredentials GetCredentials(SPSite site, string applicationID)
   {
      //Initialize new Credentials structure
      SSSCredentials credentials = new SSSCredentials();
      credentials.SPEmail = site.RootWeb.CurrentUser.Email;
      credentials.SPFullName = !string.IsNullOrEmpty(site.RootWeb.CurrentUser.Name) ? site.RootWeb.CurrentUser.Name : site.RootWeb.CurrentUser.LoginName;
      credentials.SPLogin = site.RootWeb.CurrentUser.LoginName;

      //new SPSite is not mandatory, but it seems to be more efficient than use SPSite from parameters.
      using (SPSite currentSite = new SPSite(site.ID))
      {
         //Initialize a new SecureProvider to access to data into SSS
         ISecureStoreProvider provider = SecureStoreProviderFactory.Create();
         if (provider == null)
            throw new InvalidOperationException("Unable to get an ISecureStoreProvider");

         ISecureStoreServiceContext providerContext = provider as ISecureStoreServiceContext;
         providerContext.Context = SPServiceContext.GetContext(currentSite);

         try
         {
            using (SecureStoreCredentialCollection creds = provider.GetCredentials(applicationID))
            {
               if (creds != null)
               {
                  foreach (SecureStoreCredential cred in creds)
                  {
                     if (cred == null)
                        continue;

                     switch (cred.CredentialType)
                     {
                        case SecureStoreCredentialType.UserName:
                           credentials.Login = GetStringFromSecureString(cred.Credential);
                           break;
                        case SecureStoreCredentialType.Password:
                           credentials.Password = GetStringFromSecureString(cred.Credential);
                           break;
                        default:
                           break;
                     }
                  }
               }
            }
         }
         catch (SecureStoreException)
         {
            //No credentials are found into SSS, so return null
            return null;
         }
         catch (Exception e)
         {
            throw new Exception("A general error occured. Please contact your administrator. Error : " + e.Message);
         }
      }
      return credentials;
   }

La méthode doit être appelée comme suit :


private const string TargetApplicationID = "MaTargetApplication";
SSSCredentials credentials = SSSUtils.GetCredentials(SPContext.Current.Site, TargetApplicationID);

Rien de très compliqué toutefois je suis tombé sur quelques exemples de codes et aucun n’a fonctionné chez moi. A noter ici, pas besoin d’impersonation ou de SPSecurity.RunWithElevatedPrivileges(), bien au contraire. Il faut se connecter au provider avec les identifiants de l’utilisateur connecté au portail pour pouvoir récupérer ses identifiants !

 

4/ Ecrire dans le Secure Store Service

Si nous avons lu, il faut bien parvenir à écrire dans le SSS. Ici la méthode est la même pour l’ajout ou la modification de credentials dans le magasin du Secure Store Service. Les paramètres attendus sont :

  • site : collection de sites courante
  • applicationID : identifiant unique (interne) de la Target Application
  • windowslogin : login Windows ou identifiant de l’utilisateur dans le portail SharePoint
  • userName : nom d’utilisateur à stocker dans le Secure Store Service, dans la Target Application
  • userPassword : mot de passe à stocker dans le Secure Store Service, dans la Target Application

 


public static void SetCredentials(SPSite site, string applicationID, string windowslogin, string userName, string userPassword)
   {
      SPClaim claim = SPClaimProviderManager.CreateUserClaim(windowslogin, SPOriginalIssuerType.Windows);
      SecureStoreServiceClaim ssClaim = new SecureStoreServiceClaim(claim);

      SPServiceContext context = SPServiceContext.GetContext(SPServiceApplicationProxyGroup.Default, SPSiteSubscriptionIdentifier.Default);

      SecureStoreServiceProxy ssp = new SecureStoreServiceProxy();
      ISecureStore iss = ssp.GetSecureStore(context);

      IList applicationFields = iss.GetUserApplicationFields(applicationID);

      IList creds = new List(applicationFields.Count);

      using (SecureStoreCredentialCollection credentials = new SecureStoreCredentialCollection(creds))
      {
         foreach (TargetApplicationField field in applicationFields)
         {
            switch (field.CredentialType)
            {
               case SecureStoreCredentialType.UserName:
                  creds.Add(new SecureStoreCredential(GetSecureStringFromString(userName), SecureStoreCredentialType.UserName));
                  break;
               case SecureStoreCredentialType.Password:
                  creds.Add(new SecureStoreCredential(GetSecureStringFromString(userPassword), SecureStoreCredentialType.Password));
                  break;
               default:
                  break;
            }
         }
         iss.SetCredentials(applicationID, credentials);
      }
   }

La méthode doit être appelée comme suit :


SSSUtils.SetCredentials(SPContext.Current.Site, TargetApplicationID, SPContext.Current.Site.RootWeb.CurrentUser.LoginName, "LOGIN_A_STOCKER", "PASSWORD_A_STOCKER");

A savoir, il est important d’exécuter le code avec le compte de l’utilisateur connecté à SharePoint afin de pouvoir lire ses credentials ou écrire/mettre à jour ses credentials. Lorsque j’essayais d’écrire le code pour faire ces manipulations, je suis tombé sur pas mal de bouts de code où ils essayaient d’exécuter cela avec le compte système via de l’impersonation ou bien SPSecurity.RunWithElevatedPrivileges(). Cela n’a pas marché pour moi !

5/ Fonctions annexes

Dans les extraits de codes précédents, j’ai utilisé quelques méthodes supplémentaire pour encoder/décoder les chaines de caractères envoyées ou reçues depuis le Secure Store Service. Pour être totalement complet, les voici.

Cette première méthode permet de décoder une chaine encodée (SecureString) dans une chaine standard (String)


internal static string GetStringFromSecureString(SecureString secStr)
{
   if (secStr == null)
      return null;

   IntPtr pPlainText = IntPtr.Zero;
   try
   {
      pPlainText = Marshal.SecureStringToBSTR(secStr);
      return Marshal.PtrToStringBSTR(pPlainText);
   }
   finally
   {
      if (pPlainText != IntPtr.Zero)
         Marshal.FreeBSTR(pPlainText);
   }
}

Et bien sûr la méthode effectuant la manipulation inverse :


internal static SecureString GetSecureStringFromString(string str)
{
   if (str == null)
      return null;
   var str2 = new SecureString();
   char[] chArray = str.ToCharArray();
   for (int i = 0; i < chArray.Length; i++)
   {
      str2.AppendChar(chArray[i]);
      chArray[i] = '0';
   }
   return str2;
}

6/ Usings…

J’ai un peu oublié d’en parler au début, mais certains peuvent avoir des difficultés pour inclure les bonnes références et using nécessaires au projet (je ne parlerai pas des assemblies standards…).

Références :

  1. Microsoft.BusinessData (à aller cherche dans) : C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.BusinessData.dll
  2. Microsoft.Office.SecureStoreService (à aller rechercher dans le GAC) : C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.Office.SecureStoreService\v4.0_15.0.0.0__71e9bce111e9429c\Microsoft.Office.SecureStoreService.dll
  3. Microsoft.Office.SecureStoreService.Server.Security (à aller cherche dans) : C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.Office.SecureStoreService.Server.Security.dll

Il ne nous reste plus qu’à trouver un usage à tout ceci ! 🙂

Florent.

SP2010–Remplacer les formulaires–Part 2

Posted on Updated on

Bonjour à tous.

Dans la partie précédente, nous avons vu comment créer trois modèles de listes SharePoint 2010 (fonctionnera également avec 2007 et 2013, Server ou Foundation). Avec ces modèles nous avons déployé pour chacun d’eux une instance : Pays, Villes et Commandes.

Le tout bien sûr “packagé” dans une solution SharePoint avec Visual Studio 2010. Ainsi nous avons utilisé une “Feature” pour déployer le tout qui, lorsqu’elle s’active, déploie les modèles, créée les instances de ces listes et remplit les listes Pays et Villes avec un ensemble de données.

Dans cette nouvelle partie, nous allons tenter de remplacer les formulaires standards :

  • DispForm.aspx
  • NewForm.aspx
  • EditForm.aspx

Dans le but de surcharger leur comportement, principalement au niveau des listes déroulantes : la liste des villes disponibles sera filtrée en fonction du pays qui sera sélectionné.

Pour compléter, vous pourriez également faire appel à quelques projets CodePlex fournissant ces listes déroulantes liées par le biais de champs personnalisés (Custom Fields) qui sont réutilisables et en soit plus “propres”. Je vous propose une autre méthode, sans passer par ces fonctionnalités additionnelles, plus dans le cas d’un usage unique.

1/ Comprendre la structure – le pourquoi…

Avant d’entamer la phase technique du développement/déploiement, il est essentiel de comprendre comment fonctionnent les formulaires standards, où ils sont déployés, etc.

Vous pouvez utiliser SharePoint Manager 2010 ou SharePoint Designer 2010 pour explorer la structure utilisé par les listes pour rediriger l’utilisateur vers ces fameux formulaires lorsqu’il souhaitera ajouter/modifier/voir les propriétés d’un élément/document dans une liste/bibliothèque de documents SharePoint. La structure est plutôt simple. Elle se compose de :

  • Un répertoire racine : RootFolder. Ce répertoire est créé par défaut.
  • Des sous-répertoires créés par les utilisateurs
  • Des items/documents créés par les utilisateurs
  • Un répertoire particulier : “Forms” qui contient les formulaires en question pour les bibliothèques de documents
  • Pour les listes, les formulaires en questions sont placés directement dans le RootFolder.

0102

Il m’est arrivé, bien souvent, de reprendre des projets SharePoint, par les biais de missions de conseil, d’assistance et je vois assez régulièrement des développeurs ayant essayé de “surcharger” ces formulaires en créant leurs propres formulaires (par copier/coller)… ayant des nom différents. Et en général… :

  • DispForm.aspx devient DisForm2.aspx
  • NewForm.aspx devient NewForm2.aspx
  • EditForm.aspx devient EditForm2.aspx

Et moi…. ça ne me convient pas ! En effet, les anciens formulaires restent disponibles, ils ne sont pas masqués… et restent donc accessible pour quelqu’un d’observateur qui saura assez rapidement appeler ces url et pourra donc se passer des règles de gestion que l’on souhaite imposer. Nous allons voir maintenant comment écraser ces fichiers standards en déployant notre solution SharePoint et les associer à nos listes Villes et Commandes.

2/ Déployer des Formulaires personnalisés

Reprenons notre solution. On remarque tout de suite que nous n’avons aucun fichier “aspx” dans les répertoires de la solution (répertoires des listes en particulier).

Première manipulation : utiliser SharePoint Designer 2010 pour récupérer les fichiers “aspx” originaux.

On commence donc par lancer SharePoint Designer 2010 (de préférence en 32bits Clignement d'œil), on se connecte donc sur le site et utilise l’explorateur pour atteindre notre liste, Villes par exemple (via l’explorateur à gauche “All Files > Lists > Villes”) :

image

03

On remarque tout de suite la présence des fichiers qui nous intéressent. Manipulation assez simple, on ouvre chacun des fichiers (en mode Avancé : clic droit sur chaque fichier > Ouvrir en mode avancé) et on copie/colle le contenu de chacun dans un fichier (avec Notepad ou autre) le but étant de sauvegarder chacun de ces fichiers dans le répertoire de la solution, à l’intérieur du dossier concernant notre liste et bien sûr avec le nom qui va bien… :

04

On copie le contenu du fichier…

05

Dans un Notepad :

06

On sauvegarde dans les répertoires Windows des définitions des listes Villes et Commandes, puis on inclut les fichiers dans la solution SharePoint :

07

Les nouveaux fichiers sont inclus :

08

Il reste ensuite une dernière manipulation à faire, sur chacun de nos fichiers aspx ajoutés dans la solution, nous allons faire un clic-droit > Propriétés :

09

Et nous allons changer la propriété “Deployment Type” en “ElementFile” (on peut vérifier le répertoire de déploiement qui doit pointer vers le répertoire de sortie de la feature dans le répertoire 14 (SharePointRoot) :

10

On reproduit ceci sur chacun des fichiers aspx. Vous pouvez vérifier dans le fichier “SharePointProjectItem.spdata” (celui au niveau de la déclaration du modèle de liste) que les modifications ont bien été apportées :

11

Notre solution est donc enrichie avec ces nouvelles pages. Toutefois, si l’on déploie ces nouvelles pages aspx directement, l’instance déployée n’utilisera pas directement nos nouvelles pages. Pour cela, nous allons devoir modifier le fichier Schema.xml pour chacune de ces listes, au niveau du nœud “Forms” (tout à la fin du fichier) :

<Forms>
<Form Type=”DisplayForm” Url=”DispForm.aspx” SetupPath=”pages\form.aspx” WebPartZoneID=”Main” />
<Form Type=”EditForm” Url=”EditForm.aspx” SetupPath=”pages\form.aspx” WebPartZoneID=”Main” />
<Form Type=”NewForm” Url=”NewForm.aspx” SetupPath=”pages\form.aspx” WebPartZoneID=”Main” />
</Forms>

Chaque formulaire/page est associé à notre liste SharePoint par le biais d’un nœud <Form />.

Nous allons modifier chacun de ces nœuds <Form /> pour indiquer à SharePoint qu’il doit utiliser nos pages et pas celles par défaut. Nous allons donc supprimer l’attribut SetupPath pour faire pointer chacun des formulaires vers nos pages custom.

Nous allons également ajouter quelques attributs :

  • Path=”NewForm.aspx” => Chemin relatif vers le fichier NewForm.aspx dans notre solution
  • Default=”TRUE” => Page par défaut
  • UseDefaultListFormWebPart=”False” => Ne pas utiliser le WebPart Standard
  • WebPartOrder=”1″ => Le WebPart sera placé en premier dans la zone de WebParts (il n’y en aura qu’un dans la page de toute manière)

Ce qui donne :

<Form Type=”NewForm” Url=”NewForm.aspx” Path=”NewForm.aspx” WebPartZoneID=”Main” Default=”TRUE” UseDefaultListFormWebPart=”False” WebPartOrder=”1″>

</Form>

Nous allons ensuite ajouter le WebPart de type ListFormWebPart dans la page NewForm.aspx pour afficher le formulaire standard. Il existe plusieurs méthodes que vous retrouverez sur Google, Bing ou autre.

Pour ma part, je vais choisir une méthode moins traditionnelle qui consiste à placer ce WebPart directement dans la déclaration de l’association du formulaire d’ajout d’élément et notre page custom (toutes les méthodes sont possible, celle-ci n’est pas meilleure !… juste différente). Nous allons ajouter un tag <WebParts> directement dans le <Form/> précédent, qui contiendra la déclaration du WebPart de type ListFormWebPart. Certains ont déjà du croiser ce type de déclaration, très utilisé lorsqu’on déploie des pages web avec des Modules. On obtiendra :

<Forms>

<Form Type=”NewForm” Url=”NewForm.aspx” Path=”NewForm.aspx” WebPartZoneID=”Main” Default=”TRUE” UseDefaultListFormWebPart=”False” WebPartOrder=”1″>
<WebParts>
<AllUsersWebPart WebPartZoneID=”Main” WebPartOrder=”1″>
<![CDATA[
<WebPart xmlns=”http://schemas.microsoft.com/WebPart/v2″>
<Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
<TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
<PageType>PAGE_NEWFORM</PageType>
</WebPart>]]>
</AllUsersWebPart>
</WebParts>
</Form>
</Forms>

On déclare ici un WebPart de type Microsoft.SharePoint.WebPartPages.ListFormWebPart dans la zone “Main”. Notez également le tag PageType qui a la valeur PAGE_NEWFORM indiquant qu’il s’agit bien de ce WebPart dans le mode de rendu “New” (nouvel élément). Vous trouverez ici les valeurs possibles pour cette énumération : http://msdn.microsoft.com/fr-fr/library/microsoft.sharepoint.pagetype(v=office.12).aspx

On reproduit cela pour chacun des formulaires, sur nos listes Villes et Commandes :

18

Mais me direz-vous, nous avons copié les pages NewForm, DispForm et EditForm avec SharePoint Designer et ce WebPart devrait être déjà présent dans les pages… Oui tout à fait, c’est pour cela que nous allons le supprimer !

On ouvre donc un à un chacun des fichiers NewForm.aspx, EditForm.aspx et DispForm.aspx (pour les listes Villes et Commandes) et on recherche :

<WebPartPages:ListFormWebPart runat=”server” __MarkupType=”xmlmarkup” ……… </WebPartPages:ListFormWebPart>

On sélectionne le tout et on supprime tout le contenu de cet élément (l’élément y compris) :

19

On sauvegarde le tout.

Pour préciser pourquoi on ne conserve pas ce WebPart dans les pages, vous avez peut être remarque qu’il possédait la propriété ListId. Malheureusement, cette propriété est valorisée avec un GUID qui représente l’identifiant unique de la liste… et qui sera différent à chaque redéploiement de notre Solution. Impossible donc de packager ce composant directement avec le bon GUID. Vous pourrez par contre utiliser l’attribut ListName valorisé avec l’url relative de la liste.

Il nous reste à compiler, déployer… Pour vérifier que les fichiers sont bien déployés et écrasent bien les fichiers natifs, il faut changer un peu le contenu de la page (le bon vieux test du TOTO dans la page Clignement d'œil)…

Pour cela, j’ai choisi le formulaire NewForm.aspx de la liste de Commandes. Dans le ContentPlaceHolder “PlaceHolderPageTitle”, j’ajoute un TOTO :

20

On compile avec Visual Studio et on déploie sur notre plateforme SharePoint. Une fois le tout déployé, je me dirige vers ma liste de Commandes dans le navigateur, je clique sur nouveau :

21

On retrouve bien le TOTO dans le titre de la fenêtre !!! (Bien sûr on supprime le TOTO Sourire et on redéploye).

Ca c’est fait.

3/ Modifier le comportement des pages

Nos pages étant maintenant déployées, nous allons modifier leur héritage natif pour les faire hériter de classes contenues dans notre propre assembly (DLL). Pour cela, nous allons créer une classe C# pour chacun des pages NewForm, DispForm & EditForm, et ce pour chacune de nos listes (donc 6 classes dans mon cas).

En général, je créé un répertoire Pages à la racine de mon projet (les pages sont compilées dans la DLL et le fichier .cs n’est pas déployé). Une fois le dossier créé, j’ajoute 6 classes :

14

15

Ensuite, nous allons faire hériter chacune de ces classes de “WebPartPage” et ajouter “using Microsoft.SharePoint.WebPartPages” :

16

Ensuite, dans chacune des pages aspx, nous allons :

  • Ajouter tout au début :  <%@ Assembly Name=”$SharePoint.Project.AssemblyFullName$” %>
  • Modifier le Inherits pour pointer vers notre assembly :

Inherits=”Microsoft.SharePoint.WebPartPages.WebPartPage,Microsoft.SharePoint, Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c”

devient

Inherits=”DEMO1.Pages.CommandesNewForm,$SharePoint.Project.AssemblyFullName$”

Où :

  • DEMO1.Pages.CommandesNewForm = Namespace + nom de la classe
  • $SharePoint.Project.AssemblyFullName$ : nom complet de l’Assembly, valorisé par Visual Studio avant le déploiement.

On recommence la manipulation sur chacune des 6 pages aspx:

22

On compile/déploie à nouveau le tout. Pour tester que le code-behind est bien appelé, on peut passer en debug sur la solution et vérifier que la méthode OnLoad() est bien appelée :

23

Et voilà !

Je me décide enfin à publier cet article…, je continuerai la suite un peu plus tard ! Au programme, personnalisation du comportement des formulaires !

Wait & see (pas trop longtemps j’espère Sourire) !

SharePoint 2010 & Visual Studio 2012–Step 5–Nouveautés & Ma première application Silverlight avec OData

Posted on Updated on

Bonjour à tous.

Encore un nouveau billet concernant les nouveautés de Visual Studio 2012 RC pour le développement SharePoint 2010. Petit rappel :

Nous allons rentrer plus en détail dans le développement avec la création d’un WebPart Silverlight permettant de requêter des données par le biais de OData.

Mais me direz-vous, qu’est-ce que OData ? Je vous conseille pour cela un peu de lecture glanée sur le Web :

Pour résumer, c’est la possibilité d’interroger des données au travers d’un WebService (http/https) via un protocole défini et standardisé retournant du JSON ou ATOM (du XML de reste). Je vous laisse vous documenter sur ce sujet.

Revenons à notre thèmes principal. Comment créer ce WebPart Silverlight, le packager et le déployer dans SharePoint 2010 en utilisant Visual Studio 2012. C’est ce que nous allons voir !

(Je précise que Silverlight n’est pas ma tasse de thé !)

1/ Créer le WebPart dans la solution.

Je vous rappelle que nous avions laissé la solution dans cet état au précédent billet :

100

Nous avons déjà créé une colonne de site, un content type et un modèle de bibliothèque de documents.

Pour créer notre WebPart Silverlight, commençons par faire un clic-droit sur le projet, puis “Add > New Item”

101

Dans la fenêtre qui s’ouvre, sélectionner “Silverlight WebPart” et nommons le “WPSilverlight” puis cliquer sur “Add” :

102

Une nouvelle fenêtre s’ouvre, sélectionner “Create a new…” si ce n’est pas déjà fait. Cela va créer un nouveau projet dans la solution actuelle, de type Silverlight qui abritera tout le projet permettant d’implémenter le contrôle Silverlight. Le projet sera compilé puis les binaires seront copiés dans la solution SharePoint automatiquement. Pratique !

On paramètre donc le nom du projet, le répertoire de création du projet, le langage (C#) puis la version de Silverlight (5.0 dans mon cas, 4.0 est aussi disponible). Puis cliquer sur “Finish” :

103

Après quelques secondes, le nouveau projet est créé et le designer Silverlight se charge :

104

106

Dans le projet SharePoint, une nouvelle fonctionnalité (feature) est créée et référencera tous les fichiers utiles pour notre projet Silverlight en particulier les fichiers XML permettant de référencer notre WebPart dans SharePoint. On retrouve donc le fichier “Elements.xml” et “WPSilverlight.webpart” dans cette feature :

107

Le fichier “Elements.xml” va permettre de déclarer le que SharePoint doit utiliser le fichier “WPSilverlight.webpart” mais également le fichier XAP produit par le projet Silverlight :

108

Et dans le fichier “WPSilverlight.webpart” on déclare à SharePoint comment déployer notre WebPart contenu dans la solution. On va par exemple indiquer dans quelle catégorie placer le WebPart, ses dimensions par défaut, son nom dans la galerie de WebParts ou encore un éventuel message d’erreur qui pourra apparaitre lorsque l’utilisateur ne parviendra pas à ajouter ce composant sur une page :

109

2/ Voyons maintenant ce fameux projet Silverlight :

112

Un bon nombre de références sont déjà ajoutées au projet, essentielles aux WebParts Silverlight pour SharePoint 2010.

Cependant un certain nombre de références vont nous être utilises afin de requêter en OData des données provenant de SharePoint. Nous allons donc ajouter deux références au projet Silverlight :

  • System.Windows.Data
  • System.Data.Services.Client

Pour cela, clic-droit sur le répertoire “References” dans le projet Silverlight puis “Add Reference” :

113

Nous allons rechercher nos deux références dans les Assemblies déjà disponibles sur le serveur :

114

115

116

117

118

3/ Notre projet référence maintenant les bonnes Assemblies. Il va falloir ajouter une référence vers le WebService SharePoint 2010 afin de requêter ces données (créer la DataSource).

Pour cela, nous allons ajouter un “Service Reference”. Clic-droit sur le projet, “Add Service Reference” :

119

Une fenêtre s’ouvre où nous allons saisir l’URL du WebService en question… nous ne la connaissons pas encore, mais cela reste simple ! Pour cela, nous allons juste entrer l’URL de notre site SharePoint. Dans mon cas http://sp2010demo  et on clique sur “Go”. Visual Studio 2012 va rechercher tout seul le service qui doit être exposé par SharePoint :

120

Une fois trouvé, Visual Studio va rajouter seul le bout d’URL manquant, vous n’avez rien à faire. Il va donc rajouter : /_vti_bin/ListData.svc et présenter le service (Panel de gauche) disponible. Il vous suffit de nommer votre nouveau service (“ServiceReference”) et cliquer sur “OK”.

121

La référence au service est bien ajoutée au projet Silverlight dans la solution :

122

4/ Nous allons essayer de compiler la solution afin de vérifier qu’il n’y a aucun problème. Dans mon cas j’ai quelques centaines d’erreurs qui remontent (337 pour être exact) !

123

Rien de grave, en fait en ajoutant nos références aux Assemblies, le compilateur s’y perd un peu mais rien de dramatique. Afin de supprimer ces erreurs, il vous suffira de supprimer deux références qui ont été ajoutées à la création du projet :

  • Microsoft.Data.OData.SL
  • Microsoft.Data.Services.Client.SL

On sélectionne donc ces deux références et on les supprime :

124

125

126

On compile, pas d’erreur… c’est la fête :

127

5/ La référence au service de requêtage des données est ajoutée, nous allons maintenant créer la fameuse DataSource qui nous permettra de “binder” les données provenant de SharePoint à un contrôle Silverlight de manière automatique. Pour cela, on sélectionne la référence au service puis on se dirige sur le menu “DATA” puis “Show Data Sources” :

128

Sur la gauche, une boite à outils s’ouvre présentant la DataSource récupérer par la référence au WebService SharePoint et on voit immédiatement les listes et bibliothèques SharePoint de notre site apparaitre :

129

Et là… rien de plus simple ! Ouvrons notre fichier MainPage.xaml contenant la fenêtre principale de notre application Silverlight…

130

On choisit une liste dans la DataSource (dans mon cas “Premiereliste” qui est l’instance de liste créée lors du déploiement de ma solution SharePoint, à partir du modèle) :

131

Un coup de Drag&Drop (glisser-déposer… Clignement d'œil) et c’est gagné !

132

Immédiatement, Visual Studio ajoute une DataGrid “bindée” sur notre DataSource dans la fenêtre du designer Silverlight.

il nous reste à fixer les dimensions, aligner, … faire du beau quoi !

133

Oh que c’est beau…

6/ Et ce n’est pas encore fini, maintenant il nous reste à mettre en place le mécanisme de chargement Asynchrone de notre DataGrid. Pour cela, nous allons faire un tout petit peu de code.

Ouvrons donc le fichier C# associé à notre MainPage.xaml (F7 depuis le designer Silverlight).

134

Première chose, ajouter les “usings” adéquats :

  • using SilverlightProject.ServiceReference //(référence vers le service créé tout à l’heure)
  • using System.Windows.Data
  • using System.Data.Services.Client

135

On enregistre, compile. Tout est ok.

Ensuite nous allons créer 3 attributs à la classe :

  • private IntranetDataContext context;
  • private CollectionViewSource collviewsource;
  • DataServiceCollection<PremiereListeItem> premierelistitems = new DataServiceCollection<PremiereListeItem>();

136

Et enfin implémenter deux méthodes, celle proposée par Visual Studio (UserControl_Loaded) puis dans un seconde temps une deuxième (premierelistitems_LoadCompleted).

La première sera appelée lorsque le UserControl Silverlight aura été chargé (à la fin du chargement du contrôle) et la seconde à la fin du chargement des données depuis la DataSource et qui bindera les données avec le contrôle.

Je ne détaille pas le code, ce n’est pas vraiment pertinent pour l’exemple.

137

private void UserControl_Loaded_1(object sender, RoutedEventArgs e)
{
    context = new IntranetDataContext(new Uri("http://sp2010demo/_vti_bin/ListData.svc"));
    if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
    {
       collviewsource = (System.Windows.Data.CollectionViewSource)this.Resources["premiereListeViewSource"];
       premierelistitems.LoadCompleted += new EventHandler<LoadCompletedEventArgs>(premierelistitems_LoadCompleted);
       premierelistitems.LoadAsync(context.PremiereListe);
    }           
}
private void premierelistitems_LoadCompleted(object sender, LoadCompletedEventArgs e)
{
    if (e.Error == null)
    {
       collviewsource.Source = premierelistitems;
    }
    else
    {
       MessageBox.Show(string.Format("Une erreur s'est produite : {0}", e.Error.Message));
    }
}

Bien sûr il faut compiler. Tout doit être Ok. Il nous maintenant à déployer sur notre site SharePoint 2010. Mais avant cela nous allons vérifier que le debug pour les application Silverlight est bien activé. Pour cela, il faut se positionner sur le projet SharePoint, clic-droit, “Properties” :

138

Dans la partie SharePoint, il faut vérifier que la checkbox “Enable Silverlight debugging…” soit bien cochée. On sauve, compile.

139

Puis on déploie comme vu dans les précédents billets (F5 pour debugger) :

140

6/ Le navigateur s’ouvre sur l’accueil de notre site SharePoint. Il nous faut éditer la page d’accueil pour ajouter le composant WebPart :

144

Dans le ruban, Insérer > Composant WebPart :

145

Dans la galerie de WebParts, le notre apparait bien dans la section “Custom” => SharePointProject1 – WPSilverlight. On cliquer sur “Ajouter” :

146

Le WebPart est ajouté :

147

On sauvegarde la page :

148

7/ Aucune donnée n’apparait. Normal, la liste est vide ! Ajoutons donc un petit document de test :

149

150

151

152

Revenons sur la page d’accueil :

153

Le document que nous venons d’ajouter apparait bien. Vous pouvez directement debugger votre projet Silverlight depuis Visual Studio 2012 au besoin.

Plutôt simple non ? qu’est-ce qu’à ajouté Visual Studio 2012 sur ce mini-développement ? Principalement de nouvelles interface qui ont été intégrées au niveau des DataSources. On peut maintenant requêter très facilement des données SharePoint au travers des services OData et utiliser la source de données produite dans plusieurs type de projet. Cela ne se limite pas au Silverlight. En effet, on pourrait très bien créer une application cliente Métro/WPF qui présenterait ces données de la même manière. Un bon point pour VS2012 !

SharePoint 2010 & Visual Studio 2012–Step 4–Nouveautés & Ma première colonne de site

Posted on Updated on

 

Dans les précédents épisodes, nous avons vu comment installer Visual Studio 2012 sur notre serveur SharePoint 2010 puis comment créer un modèle de bibliothèque de documents et enfin créer un type de contenu à l’aide des divers assistants proposé par l’IDE :

Nous allons maintenant voir comment créer une colonne de site avec la nouvelle interface de Visual Studio 2012. Nous en étions resté au point où la solution Visual Studio contenait un modèle de bibliothèque de documents et un type de contenu personnalisé.

VS2010 - Solution

 

1/ Nous allons maintenant ajouter une nouvelle colonne de site. Pour cela, il faut faire un clic-droit sur la solution “Add > New Item” :

VS2010 - Ajout colonne

 

Dans la fenêtre de sélection du modèle d’item, on sélection “Site Column” et on nomme cette colonne. On prendra soin de nommer cette colonne sans espace, caractères accentués, ponctuation, etc.

VS2010 - Ajout colonne 2

 

Je vous rappelle que dans Visual Studio 2010, cette option n’existait pas. Nous commençons donc directement avec une nouveauté !

2/ On valide cette fenêtre en cliquant sur “Add”. La fenêtre se ferme et nous arrivons directement sur le fichier XML (“Elements.xml”) contenant la déclaration de la colonne de site. Malheureusement il n’y a pas d’assistant comme pour les types de contenu ou les modèles de listes.

Il va donc falloir directement éditer le fichier XML, mais nous conservons l’usage de l’IntelliSense qui va nous être bien pratique :

VS2010 - XML Colonne

 

On peut noter que grâce au fichier XML, nous avons accès à tous les paramétrages de cette colonne comme le nom d’affichage (“DisplayName”), nom interne ‘(“Name”), le type, etc.

Nous n’avons pas non plus d’assistant pour choisir le groupe de classement dans lequel sera classé notre colonne, il faut le faire dans le XML.

 

Donc mis à part l’entrée dans le menu de sélection du type d’item, rien ne change pour la création de colonnes de site (on a tout de même une icone particulière dans l’arborescence de la solution pour ces colonnes de site, et 1 fichier Elements.xml par colonne).

 

Si nous jetons un coup d’œil à la feature, la colonne apparait bien :

VS2010 - Feature

 

3/ Essayons d’associer cette nouvelle colonne de site au type de contenu créé précédemment. Pour cela, nous allons rouvrir la définition du type de contenu et sur l’onglet “Columns”, nous avons une interface permettant de rechercher des colonnes de site existantes :

VS2010 - Content Type

 

On recherche notre colonne de site :

VS2010 - Content Type 2

 

Elle apparait bien dans la liste des colonnes proposées (et pourtant elle n’est pas encore déployée sur le site SharePoint. Visual Studio propose donc les colonnes existantes sur le site et celles provenant de la solution courante).

VS2010 - Content Type 3

 

On valide et on enregistre la modification :

VS2010 - Content Type 4

 

4/ Il nous reste à vérifier qu’en associant ce type de contenu à notre définition de bibliothèque de documents la nouvelle colonne de site apparaisse bien. Pour cela, on rouvre la déclaration du modèle de bibliothèque :

VS2010 - Liste

 

Et nous utilisons le bouton “Content Types” en bas de page. On reconnait l’interface déjà utilisée dans les précédents billets :

VS2010 - Liste Content Type

 

On recherche notre type de contenu en pointant sur le texte “Click here to add a content type”. Ce contrôle va nous permettre de rechercher les types de contenu disponibles. Ici Encore Visual Studio 2012 se base sur les types de contenu déjà déployés dans SharePoint 2010 mais également sur les types de contenu référencés dans la solution Visual Studio 2012:

VS2010 - Liste Content Type 2

 

On valide et on va spécifier que ce type de contenu est le type de contenu par défaut disponible sur cette bibliothèque (en utilisant le bouton “Set as Default”) :

VS2010 - Liste Content Type 3

 

VS2010 - Liste Content Type 4

 

On valide cette fenêtre. Dans la définition de ce modèle de bibliothèque, on voit tout de suite que la colonne de site créée et associée au type de contenu remonte dans la définition :

VS2010 - Liste Content Type 6

 

5/ Pour bien faire les choses, il nous reste à déployer le tout. On reprend la manipulation décrite dans un précédent billet :

 

Clic-droit sur la solution > Deploy :

VS2010 - Déploiement 1

 

Visual Studio nous précise qu’il y a des conflits lors du déploiement (l’instance de liste a déjà été déployée). Je choisi “Resolve Automatically” et Visual Studio supprime l’instance qui était déjà créée et redéploye le package :

VS2010 - Déploiement 2

Cette résolution d’erreur de déploiement est la même que celle utilisée par Visual Studio 2010.

 

Le déploiement est terminé :

VS2010 - Déploiement 3

 

On retrouve bien le tout dans SharePoint 2010 :

La colonne de site :

VS2010 - Résultat 1

 

Le type de contenu :

VS2010 - Résultat 2

 

Et dans le type de contenu, l’association de la colonne de site :

VS2010 - Résultat 3

 

On retrouve également l’instance de la liste créée à partir du modèle de bibliothèque :

VS2010 - Résultat 4

 

En conclusion, peu de nouveauté pour la création de nouvelle colonnes de site. On notera toutefois qu’avoir une icône spéciale dans l’arborescence est assez agréable (pour une fois ce n’est pas l’icône associée aux fichiers XML Clignement d'œil ).

 

De plus, au final l’ensemble combiné est agréable d’utilisation, on se retrouve facilement dans les menus et le fait que Visual Studio sache récupérer ce qui est déjà implémenté dans SharePoint mais également le contenu dans la solution (dans le menu d’association notamment) est un vrai plus. Les nouvelles interface sont harmonisée bien que de mon point de vue il manque un “assistant avancé” entre le mode facile et l’édition directe de XML.

Mais plus je joue avec l’interface, plus il me tarde la sortie finale de Visual Studio 2012 !!!

Au projet épisode… un peu de… Silverlight (une fois n’est pas coutume…). Stay Tuned !

SharePoint 2010 & Visual Studio 2012–Step 3–Nouveautés & Mon premier type de contenu

Posted on Updated on

 

Dans les derniers épisodes, nous avons vu comment installer Visual Studio 2012 sur notre serveur SharePoint 2010 puis comment créer un modèle de bibliothèque de documents :

Nous allons maintenant voir comment créer un type de contenu avec Visual Studio 2012.

 

Rappelez-vous, dans le précédent billet, nous avions laissé Visual Studio dans cet état :

Visual Studio 2012 - Début

Notre modèle de bibliothèque “PremiereListe” était créé dans la solution Visual Studio.

 

1/ Ajoutons un nouveau type de contenu. Pour cela, clic-droit que la solution, “Add > New Item” :

Visual Studio 2012 - Ajout content type 1

 

Dans la fenêtre de sélection du modèle d’”Item”, nous allons choisir “Content Type” et lui donner un nom :

Visual Studio 2012 - Ajout content type 2

 

2/ Une nouvelle fenêtre se lance permettant de sélectionner le type de contenu parent à celui que nous allons créer. Pour l’exemple, on sélectionne “Document” :

Visual Studio 2012 - Choix du parent

 

Visual Studio 2012 - Choix du parent 2

 

Visual Studio 2012 - Choix du parent 3

Et cliquer sur “Finish”. Toujours aucune nouveauté jusqu’ici. Après avoir validé notre configuration, nous arrivons enfin sur quelque chose de nouveau.

4/ En effet, un nouvel assistant va nous aider à configurer notre type de contenu là où avant nous devions recourir à du XML pour associer des colonnes de site à un type de contenu, paramétrer le groupe de classement, etc.

Visual Studio 2012 - Columns 1

On distingue 2 onglets : Columns et Content Type.

 

5/ Le premier onglet Columns va nous permettre d’associer des colonnes de sites existantes à notre nouveau type de contenu. Nous ne pourrons pas créer de nouvelles colonnes de sites directement depuis cette interface. Pour cela nous devrons recourir à un autre moyen que nous verrons bientôt !

 

Le fonctionnement est très simple, dans la première colonne, on recherche la colonne de site voulue, Visual Studio 2012 remonte automatiquement le type de cette colonne. Nous pourrons spécifier si cette colonne sera obligatoire lors de la saisie faite par l’utilisateur dans l’interface Web de SharePoint :

Visual Studio 2012 - Columns 2

Visual Studio 2012 - Columns 3

Visual Studio 2012 - Columns 4

 

L’interface est simple et intuitive, elle fonctionne exactement comme celle permettant de créer des modèles de listes… on n’est pas perdu !

 

6/ Le second onglet est lui aussi très simple. On retrouve le paramétrage général du type de contenu.

Visual Studio 2012 - Paramètres

Visual Studio 2012 - Paramètres 2

On retrouve le nom du type de contenu, sa description et le groupe dans lequel il sera classé. Petite déception dans cette Release Candidate, impossible de créer notre propre groupe pour classer les types de contenu. On est obligé de choisir dans la liste des groupes existants.

Quelques paramètres supplémentaires : hériter des colonnes du parent, lecture seule du type de contenu et masquer ce type de contenu dans le bouton “Nouveau” des listes/bibliothèques auxquels il sera associé.

 

Pour résoudre le problème de la création d’un nouveau groupe de classement, il nous est possible d’accéder au XML généré (“Elements.xml”) et d’éditer directement ce XML en utilisant en plus l’IntelliSense :

Visual Studio 2012 - IntelliSense

 

7/ Et pour en revenir au billet précédent… comment référencer ce nouveau type de contenu dans notre modèle de bibliothèque de documents précédent ? C’est très simple, pour cela il nous suffit de rouvrir la définition du modèle de bibliothèque de documents et de cliquer sur le bouton “Content Types” :

Visual Studio 2012 - List Definition 1

 

Puis de retrouver dans la liste déroulante :

Visual Studio 2012 - List Definition 2

Visual Studio 2012 - List Definition 3

 

Il est également possible de le paramétrer comme type de contenu par défaut sur notre modèle en utilisant le bouton “Set as Default” (en sélectionnant le bon type de contenu).

Visual Studio 2012 - List Definition 4

 

Pour résumer, Microsoft a intégré des petits assistant simples et pratiques dans sa nouvelle version de Visual Studio (2012 RC) qui vont nous faire gagner du temps et simplifier la création de pas mal d’éléments. On regrettera toutefois de devoir recourir au XML pour les paramétrages avancés !

Mais c’est déjà une belle avancée ! vivement la sortie de la version finale de Visual Studio 2012 !

 

Prochain billet, la création de colonnes de site ! Stay Tuned !

SharePoint 2010 & Visual Studio 2012–Step 2–Nouveautés & Ma première définition de liste

Posted on Updated on

 

Dans un précédent billet, nous avons vu comment installer Visual Studio 2012 et initier un premier projet SharePoint 2010 : https://kazoumoulox.wordpress.com/2012/06/04/sp2010-vs2012-part1/

 

Nous allons maintenant voir les nouveautés apportées par cette nouvelle mouture de l’IDE.

 

Une des premières nouveautés est la possibilité de créer des modèle de listes (list definition) directement depuis Visual Studio grâce à un assistant. Pour rappel, dans Visual Studio 2010 nous pouvions bien sûr créer des listes mais pour cela il fallait modifier le XML des fichiers “schema.xml” et “elements.xml” à la main. Microsoft nous propose donc de nous simplifier ce développement grâce à une interface plutôt complète. Allez on se lance !!!

Petit rappel, nous avions laissé visual Studio 2012 dans l’état où nous avions créé une première solution SharePoint 2010 vide :

Visual Studio 2012 - Solution

 

1/ Nous allons créer un nouvel élément de ce projet en cliquant-droit sur la solution et en se déplaçant sur “Add > New Item” :

Visual Studio 2012 - Ajout item

 

La fenêtre permettant de sélectionner le type d’élément à créer se lance :

Visual Studio 2012 - Gallerie Items 1

Visual Studio 2012 - Gallerie Items 2

 

Pour l’œil expérimenté, on voit tout de suite que de nouveaux éléments sont disponibles comparé à Visual Studio 2010 :

  • Site Column
  • Heu… ben je crois que c’est tout !

Ce n’est donc pas dans ce menu non plus que se situent les nouveautés… mais juste après !

 

2/ Nous allons créer une nouvelle liste SharePoint grâce au menu précédent, pour cela on sélectionne l’entrée : “List” et on choisi un nom pour notre liste (on évitera les espaces, caractère spéciaux, accentués, etc. car cela deviendra le nom interne de la liste. On jouera sur le “Title” de la liste pour le nom d’affichage) :

Visual Studio 2012 - Ajout Liste

On clique sur “Add”.

 

3/ Un nouvel assistant se lance :

Visual Studio 2012 - Modèle Liste

 

Enfin de la nouveauté ! Cet assistant nous propose de se baser sur un modèle existant afin de créer notre modèle de liste/bibliothèque.

Soit on décide d’utiliser la première option : la liste sera personnalisable, nous pourrons ajouter des colonnes, vues, type de contenu.

Soit on décide d’utiliser la seconde option : la liste se basera sur un modèle et ne sera pas personnalisable après ajout.

On notera également une différence dans les modèles de listes/bibliothèque disponibles dans ces deux options. Dans la première option, on retrouve seulement les modèles de base alors que dans la seconde on retrouve tous les modèles disponibles sur la collection de sites à laquelle Visual Studio s’est connecté lors de la création de la solution :

Visual Studio 2012 - Modèle Liste 2

Visual Studio 2012 - Modèle Liste 3

 

Pour l’exemple, j’ai choisi “Document Library” et cliqué sur “Finish”.

 

4/ Après avoir validé l’assistant, Visual Studio 2012 dévoile une nouvelle fenêtre permettant de configurer notre nouvelle liste :

Visual Studio 2012 - Modèle Liste créé

 

Encore de la nouveauté ! Cette fenêtre va nous permettre d’ajouter, modifier ou supprimer des colonnes au modèle de base proposé. Nous allons pouvoir également créer, modifier et supprimer des vues/affichages mais également modifier les paramètres de l’instance de la liste qui sera automatiquement créée.

Visual Studio 2012 - Colonnes 2

Visual Studio 2012 - Colonnes List

 

5/ Commençons par le premier onglet : “Columns”

Dans cette fenêtre nous allons personnaliser les colonnes qui seront associées à notre modèle. Pour cela, il suffit de cliquer sur le message “Type a new or existing column name”.

Pour une nouvelle colonne, il suffit d’entrer son nom (attention, ici encore il s’agit du nom interne : pas d’espace, ponctuation, séparateur, accents, etc.) :

Visual Studio 2012 - Colonnes 1

 

Puis on sélectionne son type parmi les types proposés habituellement par SharePoint :

Visual Studio 2012 - Colonnes 2

 

Ou alors on peut piocher dans les colonnes de sites déjà présentes sur la collection de sites (on ne pourra alors pas changer le type) :

Visual Studio 2012 - Colonnes 3

 

Nous apercevons également juste en dessous un bouton “Content Types”. Ce bouton permet d’associer directement un type de contenu existant ou alors d’en créer un nouveau. Nous verrons cela dans un autre billet…

Visual Studio 2012 - Content Type

 

6/ Si on passe à l’onglet suivant “Views”, nous allons pouvoir gérer les vues qui seront disponibles pour notre modèle :

Visual Studio 2012 - Vues

Nous reconnaissons immédiatement les vues de la bibliothèque de documents : Tous les documents, Mode Explorateur, … avec leur paramétrage par défaut.

On va bien sûr pouvoir modifier ces vues par défaut : Row limit, vue par défaut, colonnes affichées et leur ordre :

Visual Studio 2012 - Vues 2

 

Par contre… pas de groupes, de filtres, d’ordre ! Peut-être que cela sera ajouté à la version finale… je l’espère en tout cas !

7/ Si ce n’est pas le cas, il nous reste toujours notre bon vieux XML…

Visual Studio 2012 - XML1

 

On retrouve toujours l’IntelliSense pour nous aider sur le schéma et la structure XML :

Visual Studio 2012 - XML2

 

8/ Il nous reste l’onglet “List”. Peut de choses dans cet onglet. Juste la possibilité de renommer l’instance de notre modèle qui sera créé, son URL, sa description et deux paramètres : Affichage dans le quicklaunch & masquer la liste :

Visual Studio 2012 - List

 

9/ Il nous reste la dernière étape, le déploiement. On retrouve pour cela les mêmes menus que dans Visual Studio 2010 : Deploy, Publish, Retract.

Visual Studio 2012 - Deploy

 

Visual Studio 2012 - Deploy

Exactement la même procédure que pour Visual Studio 2010, rien de neuf.

 

Au final, quelques nouveautés, surtout concernant l’assistance de création des listes qui peut être bien pratique et vous faire gagner en productivité. On gardera à l’esprit tout de même qu’une certaine vigilance est requise concernant les noms de modèles, colonnes pour éviter les noms internes à rallonge, avec des caractère encodés. Mais là aussi, rien de nouveau !

 

Pour finir ce billet, je vous propose un petit tour du gestionnaire de features, du panneau de paramètres de la solution et de l’explorateur de serveurs :

 

Le gestionnaire de features reste simple et fonctionnellement similaire au précédent IDE. Mêmes scopes (ça c’est normal Clignement d'œil ), titre, description et association des features :

Visual Studio 2012 - Features

Visual Studio 2012 - Features 2

Visual Studio 2012 - Features 3

 

 

Et pour la configuration de la solution, rien de neuf non plus !

Visual Studio 2012 - Solution 1

Visual Studio 2012 - Solution 2

 

Dans l’explorateur de serveurs :

Visual Studio 2012 - Servers 1

Visual Studio 2012 - Servers 2

 

Dans le prochain billet, nous parlerons toujours des nouveautés de Visual Studio 2012 pour SharePoint, mais à propos des types de contenu et des colonnes de site. Stay Tuned !