Archives de catégorie : SharePoint Server

Les meilleures pratiques d’accès aux données avec le modèle objet SharePoint

J’ai dernièrement publié un billet intitulé : « Les meilleures pratiques d’accès aux données avec le modèle objet SharePoint » sur le blog de Technologia.

En voici un aperçu :

Introduction au langage CAML (Collaborative Application Markup Language)

Le CAML est un langage XML utilisé dans SharePoint pour définir les champs et les affichages des sites et des listes. On peut aussi effectuer une requête en CAML pour accéder à du contenu SharePoint avec l’aide de l’objet SPQuery.

  CAML   Le CAML est sensible à la case

Objectif

Optimiser l’accès au contenu SharePoint afin d’améliorer les performances et de respecter les bonnes pratiques de développement.

L’objet SPQuery

  • Exécute des requêtes sur les données efficacement;
  • Utilise le langage CAML pour spécifier le SELECT, le WHERE, le ORDER BY et le GROUP BY de l’instruction SELECT SQL sous-jacente;
  • S’adresse à un objet SPList précis;
  • Est la bonne pratique à utiliser lorsqu’on effectue une requête sur une liste.

Utilisation de l’objet SPQuery

Les objets SPQuery peuvent causer des problèmes de performance quand ils retournent un grand nombre de résultats.

Les recommandations suivantes vous aideront à optimiser votre code de manière à limiter l’impact sur la performance quand vos requêtes retournent un trop grand nombre de résultats :

  • Ne pas utiliser un objet SPQuery illimité (unbounded);
  • L’utilisation d’un objet SPQuery sans spécifier une valeur à la propriété RowLimit ne fonctionnera pas de manière efficace et va échouer sur de grandes listes. Il est recommandé de spécifier un RowLimit entre 1 et 2000;
  • Utilisez des champs indexés.

Si vous effectuez une requête sur un champ non indexé, la requête sera bloquée chaque fois que celle-ci retourne plus d’éléments que le seuil de requête (dès qu’il y aura plus d’éléments dans la liste que dans le seuil de requête). Il est recommandé de spécifier un RowLimit à une valeur qui est plus petite que le seuil de requête.

Pour conclure

Que vous utilisiez le modèle objet serveur (SSOM) ou un modèle de programmation client (CSOM/JSOM), le CAML est indispensable pour réaliser des requêtes performantes en plus de respecter les bonnes pratiques de développement.

Retrouvez l’article complet ici.

Publicités

Envoyer des courriels périodiques pour SharePoint OnPrem avec du PowerShell

Introduction

SharePoint dispose d’un mécanisme d’alerte assez puissant. Celui-ci permet d’envoyer à l’abonné une alerte par courriel basé sur une action qui se produit sur l’élément (il est créé, modifié, etc…). Il comporte cependant des limitations :

  • On ne peut pas recevoir une alerte périodique (ex : tous les trimestres, tous les premiers Lundi du mois, etc…);
  • La modification du gabarit de courriel est complexe;
  • Il n’est pas possible de modifier l’adresse de réponse et le sujet pour une alerte en particulier;
  • Vous devez être que propriétaire du site afin d’envoyer des alertes à d’autres personnes. Sans cela, la seule personne à qui vous pouvez envoyer des alertes à est vous-même.

Alors que faire si on veut contourner ces limitations?

Il y a quelques solutions possibles :

  1. Créer un timer job SharePoint (Exemple)
  2. Créer un flux de travail (Exemple)
  3. Utiliser un logiciel tiers (Exemple)
  4. Créer un script PowerShell s’exécutant dans une tâche planifié (Source)

Je vais mettre l’emphase sur le point 4 dans ce billet car à mon avis c’est la meilleure alternative lorsque les alertes « out-of-the-box » ne répondent pas à votre besoin.

Comparaison des différentes solutions

Alertes SharePoint out-of the-box Timer Job personnalisé

 

Flux de travail personnalisé Outil tiers

Script PowerShell

Flexibilité Mark Mark
Permet de modifier le contenu dynamique envoyé facilement Mark Mark Mark Mark
Permet de modifier le visuel du gabarit sans avoir besoin de programmation Mark Mark Mark
Envoyer des courriels à des utilisateurs externes Mark Mark
Nécessite peu d’efforts de configuration Mark Mark
Permet d’envoyer un courriel basé sur un intervalle de temps Mark Mark Mark
Gratuit Mark Mark Mark Mark

 

Utiliser un script PowerShell

Le script pour SharePoint 2013 sur site (OnPrem) est disponible ici :

telecharger-bouton

Assurez-vous de modifier la section « Constantes » et d’y inscrire les valeurs correspondants à votre environnement.

Capture

Celui-ci va créer une liste EmailTemplate :

EmailTemplate

Cette liste permet à un utilisateur de piloter les différentes valeurs sans avoir besoin d’effectuer de la programmation lorsque vient le temps de changer le contenu, le sujet, etc… Bien évidemment, si vous ajoutez d’autres modèles, vous devrez ajuster votre code afin de les utiliser correctement.

Le script va aussi créer une liste Project :

ProjectListView

Celle-ci est uniquement présente à des fins de démonstration. C’est à partir de cette liste que nous allons envoyer du contenu dynamique par courriel. Vous pouvez donc la supprimer et vous alimenter de votre propre liste si vous le souhaitez.

Voici un exemple de courriel envoyé par le script :

EmailResult

Exécution du script PowerShell dans une tâche planifiée

Démarrer -> Exécuter -> Taskschd.msc

Créer une nouvelle tâche :

ScheduledTaskPowerShell_create

Spécifier un compte ayant les droits d’administrateur de la ferme SharePoint.

Spécifier un déclencheur :

ScheduledTaskPowerShell_declencheur

Ajouter une nouvelle action :

ScheduledTaskPowerShell_action

Programme/Script : Powershell.exe

Ajouter des arguments : -ExecutionPolicy Bypass C:\Sources\SharePointerie.OnPrem.SendTimeBasedEmail.ps1

En prenant soin d’adapter le chemin vers votre script.

Cliquer sur OK pour enregistrer la tâche.

Outils de développeur pour faciliter le travail avec les courriels

Pour ma part, j’utilise l’outil SMTP4DEV afin de travailler en mode local. Il suffit de démarrer l’application et celle-ci se chargera d’intercepter les envois de courriel sur le port défini.

smtp4Dev

Source : https://smtp4dev.codeplex.com/

Conclusion

L’utilisation d’un script PowerShell pour envoyer des courriels périodiques permet un maximum de flexibilité autant au niveau du déploiement qu’au niveau du pilotage. Il n’y a pas de période d’indisponibilité lors du déploiement comparativement au déploiement d’un Timer Job. Je crois donc que c’est la meilleure alternative lorsque les alertes out-of-the-box ne répondent pas à votre besoin.

SharePoint 2016 – Les types de contenu, les colonnes de site ainsi que d’autres éléments de sites sont finalement multilingue!

Les éléments suivants prennent maintenant en charge le multilingue dans SharePoint 2016 Preview (et les versions suivantes) :

  • Titre d’un site
  • Description d’un site
  • Titre d’une liste
  • Description d’une liste
  • Nom d’un type de contenu
  • Description d’un type de contenu
  • Titre d’une colonne de site
  • Description d’une colonne de site

Ceci avait été annoncé pour Office 365 en 2014 cependant ce n’était pas disponible pour les versions On-Premise. L’article est donc encore une excellent source de référence.

Dans l’exemple suivant je vais modifier la description d’un site pour la culture « en-US » et « fr-FR » avec du PowerShell.

Avant l’exécution (Affichage en-US) :

MultilangualDescriptionBefore

MultilangualDescriptionPowerShell


$web = get-spweb http://sp2016preview
$web.DescriptionResource.SetValueForUICulture("en-US", "Support multilangual")
$web.DescriptionResource.SetValueForUICulture("fr-FR", "Supporte le multilangue")
$web.Update()
$web.DescriptionResource.GetValueForUICulture("en-US")
Support multilangual
$web.DescriptionResource.GetValueForUICulture("fr-FR")
Supporte le multilangue

Après l’exécution (Affichage en-US) :

MultilangualDescriptionAfter

Pour l’instant, nous sommes un peu dans le néant en ce qui concerne les nouveautés au niveau de l’API de SharePoint alors je n’ai pas eu le choix de d’ouvrir la DLL avec Reflector. Il est possible de voir que la propriété « DescriptionResource » est disponible sur plusieurs éléments :

DescriptionResourceClient

Maintenant, les fonctions pour obtenir ou modifier cette propriété :

GetValueForUICulture

SetValueForUICulture

De plus, les fonctions se retrouvent autant au niveau de Microsoft.SharePoint.DLL que dans Microsoft.SharePoint.Client.DLL.

Ceci permet l’appel de ces fonctions avec du code serveur ainsi qu’avec du code client (Ex : CSOM)

Conclusion

Cette amélioration est des plus apprécié pour les entreprises qui désirent offrir une interface multilingue sans avoir à dupliquer les sites, les colonnes, les types de contenu, etc…

Nouveau nom des Apps pour SharePoint : Add-ins SharePoint

Introduction

Cette semaine, lorsque j’effectuais de la veille technologique sur le site d’Office PnP, j’ai été surpris de voir que certaines appellations avaient changées :

addinRename

 

Dans la dernière publication d’Office PnP nous pouvons apercevoir les mots « Add-in pour SharePoint » ainsi que « Add-in model ».

SharePoint Add-in ? Add-in model ?

N’ayez crainte, Microsoft n’a pas sortie un nouveau modèle de développement de son chapeau. Ils ont simplement renommé le terme « App » pour « Add-in » en anglais. En français, on parle maintenant d’un complément pour SharePoint.

Vous trouverez l’annonce officiel de Microsoft ici :

We are currently updating our products, documentation, samples, and other resources to reflect the platform name change from « apps for Office and SharePoint » to « Office and SharePoint Add-ins ». We made this change to better distinguish the extension platform from Office apps (applications). For your reference, the following table lists the names that are changing and the new names.

Nom d’origine Nouveau nom S’applique à
apps for Office Office Add-ins Office
mail app for Outlook Outlook Add-in Office
app for Excel Excel Add-in Office
app for PowerPoint PowerPoint Add-in Office
app for Word Word Add-in Office
Office App Model Office Add-in Model Office
apps for SharePoint SharePoint Add-ins SharePoint
SharePoint App Model SharePoint Add-in Model SharePoint
app part add-in part SharePoint
app web add-in web SharePoint

Source : https://msdn.microsoft.com/en-us/library/office/fp161507.aspx#bk_newname

 

Techniques pour récupérer les éléments HTML d’une WebPart en JavaScript

Introduction

Dans ce billet je vous propose quelque techniques de JavaScript pour pouvoir récupérer les éléments HTML d’une WebPart spécifique. Chez un de mes clients je me suis vite rendu compte qu’il n’était pas évident d’avoir une « poigné » fixe pour appliquer une personnalisation sur une seule WebPart. Le Client Side Rendering (CSR) est à la mode c’est temps-ci mais il comporte une certaine complexité en comparaison aux quelques lignes de JavaScript qui suivront. Pour ce qui est du CSS, il n’est pas évident de l’appliquer seulement à une WebPart.

Examinons le code généré d’une WebPart

En appuyant sur F12 dans une page contenant des WebParts, vous pourrez examiner le code HTML généré par celle-ci.

Voici un exemple :

WebPartByTitle_HTMLElement

Vous remarquerez qu’il y a un ID unique sur chacune des WebParts de la page.

L’élément DIV avec le ID « MSOZoneCell_WebPartWPQ6 » correspond à l’ensemble de la WebPart.

L’élément DIV avec le ID « WebPartWPQ6_ChromeTitle » correspond à l’entête de la WebPart.

L’élément SPAN avec le ID « WebPartTitleWPQ6 » correspond au titre de la WebPart.

Voyons maintenant quelque techniques pour les récupérer.

Technique 1 – Récupérer les éléments HTML d’une WebPart par son titre

Cette technique consiste à utiliser le titre de la WebPart comme poigné pour récupérer les éléments HTML d’une WebPart précise.

Voici le code pour y arriver :

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
     //Parcours tous les éléments SPAN ayant un ID qui commencent par WebPartTitleWPQ
     $("span[id^=WebPartTitleWPQ]").each(function()
     {
          //Si le titre de la WebPart commence par "Site Collection Documents"
          if($(this).attr('title').indexOf("Site Collection Documents") == 0){
          //Applique une personnalisation sur l'ensemble de la WebPart (Couleur rouge)
               $(this).parent().parent().css('background-color', 'red');
          }
    });
});
</script>

Résultat

Le background-color rouge est appliqué uniquement sur la WebPart avec le titre « Site Collection Documents » :

WebPartByTitle_After

Points à faire attention avec cette technique

  1. Assurez-vous d’avoir un titre unique pour vos WebParts
  2. Assurez-vous d’utiliser un type de chrome incluant le « Titre »

Au besoin, vous pouvez modifier le titre de votre WebPart ou le type de chrome :

WebPartByTitle_MenuWP

Technique 2 – Récupérer les éléments HTML d’une WebPart par son ID

Cette technique consiste à utiliser l’ID comme poigné pour récupérer les éléments HTML d’une WebPart précise.

Voici un exemple de code pour modifier une WebPart par sont ID :

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
 //Applique une personnalisation à l'ensemble de la WebPart (Couleur bleu) par son ID
 $("#MSOZoneCell_WebPartWPQ6").css('background-color', 'blue');
});
</script>

Résultat

Le background-color bleu est appliqué uniquement sur la WebPart avec le ID MSOZoneCell_WebPartWPQ6 :

WebPartByID_After

Points à faire attention avec cette technique

  1. Assurez-vous d’ajuster votre code si une WebPart est déplacé,  ajouté ou supprimé

Que se passe-t’il si on déplace une WebPart ou qu’on en ajoute une nouvelle?

Le ID de la WebPart va tout simplement changer.

Avant la suppression d’une WebPart (2 WebParts) :

WebPartByTitle_HTMLElement_AvantDelete

WebPart 1 : WebPartWPQ4_ChromeTitle

 

Après la suppression d’une WebPart (1 WebPart) :

WebPartByTitle_HTMLElement_ApresDelete

WebPart 1 : WebPartWPQ2_ChromeTitle 

Voici un autre exemple qui utilise cette technique.

Conclusion

Les deux techniques présentés dans cet article peuvent vous permettre facilement d’appliquer des personnalisations sur un élément HTML d’une WebPart. La première technique utilisant le titre de la WebPart n’est pas sans faille si deux WebParts se retrouvent avec le même nom. Pour ce qui en est d’utiliser le ID de l’élément HTML de la WebPart, il faut faire attention si on déplace, supprime ou ajoute une WebPart dans la page car les ID sont susceptible de changer et ainsi de rendre votre code non fonctionnel. Ces techniques peuvent vous permettre d’appliquer des modifications rapidement lorsque ce n’est pas possible de le faire avec du CSS ou que c’est trop complexe avec du Client Side Rendering.

Cheat sheet pour les développeurs SharePoint

Introduction

Règle générale, je vous propose des billets sur des problèmes rencontrés lors de mes expériences avec SharePoint. Cette fois-ci, je vous propose quelque chose de différent avec une Cheat Sheet spécifique pour les développeurs SharePoint. Le concept de Cheat Sheet existe depuis longtemps et présente généralement de la façon la plus concise possible, les grandes lignes d’un logiciel ou d’un langage informatique.

Pourquoi une Cheat Sheet ?

Lorsqu’on forme des développeurs SharePoint, on a beau leurs donner plusieurs trucs, il y a tellement de chose à savoir que souvent ils ont de la difficulté à retrouver toute l’information qu’ils recherchent.

C’est alors qu’on se fait poser plusieurs questions du genre :

  • Quel est le Token pour avoir le URL de la collection de site dans un Custom Action?
  • Comment je peux éviter d’hardcoder le URL absolue de mon site SharePoint?
  • Comment je peux récupérer le GUID de ma liste?
  • Comment je peux supprimer une WebPart qui a brisé ma page?
  • Comment je peux afficher un formulaire dans une boite de dialogue?
  • etc…

Si vous vous posez souvent ce genre de question, je vous inviter a télécharger et imprimer ma cheat Sheet.

telecharger-bouton

Voici un bref aperçu :

cheetSheetPreviewEffect

N’hésiter pas à commenter si vous avez des suggestions!

Message d’erreur lors de la publication d’un flux de travail SharePoint 2010 contenant plus de 5 processus d’approbation

Introduction

Dernièrement, nous avons réalisé un flux de travail assez complexe en terme de logique pour un de nos client. Il contient 7 formulaires Infopath et il utilise plusieurs processus d’approbation. Le diagramme Visio entre difficilement dans dans une page 8½ x 11 !

Malheureusement, nous avons rencontré un problème majeur lors de la publication de ce flux de travail.

Voici le contexte de l’environnement :

  • Flux de travail de liste
  • Flux de travail SharePoint 2010
  • Créé à partir de SharePoint Designer 2013
  • Ferme SharePoint 2013

Lors de nos tentatives de publication on obtient toujours ce message d’erreur :

« Erreur lors de la compilation du flux de travail »

« Erreur inattendue sur le serveur associant le flux de travail »

wf

Investigations et problématique

On a alors investigué plusieurs pistes sans succès :

  • Augmenter les « timeout » dans les fichiers web.config et dans les pool applicatifs
  • Investiguer les fichiers de Logs ULS / Obsérvateur d’événements
  • Essayer sur d’autres postes
  • Vider la cache de SharePoint Designer 2013
  • Vider la cache du serveur
  • Redémarrer le serveur

Puis on est tombé sur cette article à propos du même message d’erreur lorsqu’on a plusieurs processus d’approbation. On a donc réalisé que notre flux de travail complexe contenait trop d’étape d’approbation (8) ! On en a alors enlevé (3) et suite à cela on a été en mesure de le publier sans problème.

Solutions possibles

  • Rendre le flux de travail moins complexe en retirant des processus d’approbation
  • Séparer le flux de travail en plusieurs flux de travail
  • Remplacer quelque processus d’approbation par des processus de tâche personnalisée qui sont moins complexe

Reproduire le problème

Pour reproduire le problème, suivre les étapes suivantes :

1. Créer un flux de travail de liste sur une liste de votre choix :

wf_step1

2. Donner un nom à votre flux et sélectionner « Flux de travail SharePoint 2010 » :

wf_step2

3. Ajouter 5 processus d’approbation avec le menu « Action -> Démarrer le processus d’approbation » :

wf_processus

4. Choisir au moins un utilisateur dans le champ « Utilisateur » :

wf_5processus

5. Publier le flux de travail

wf_step5

6. La publication se déroulera alors sans problème.

7. Ajouter un autre processus d’approbation :

wf_6processus

On obtient alors le message d’erreur.

Conclusion

Ce problème ne semble pas être documenté auprès de Microsoft et à mon avis, il s’agit d’une limitation au niveau de la complexité des flux de travail. Je vous suggère donc de faire plusieurs flux de travail simple au lieu d’un seul gros flux de travail complexe qui est susceptible de se déployer difficilement.