Le Post Infeeny

Les articles des consultants et experts Infeeny

Archives Mensuelles: novembre 2013

Mettre en place le Change Data Capture (CDC) dans Integration Services (SSIS) 2012

Aucunes données modifiées en baseDans cet article sera présenté une des fonctionnalités de SQL SERVER : CDC (Change Data Capture  ou en français « La capture de données modifiées »). Cette fonctionnalité est présente depuis la version 2008. Cette présentation se fera sur la  version 2012.

Qu’est-ce que le CDC ?

Le CDC  est une fonctionnalité  de SQL SERVER qui permet de suivre et de capturer les différentes modifications ayant eu  lieu sur une table. Les modifications capturées par le « CDC » sont toutes celles effectuées sur la table via les instructions d’insertion (INSERT), de mise à jour (UPDATE) ou de suppression (DELETE).

Quelle est l’importance du CDC ?

Si vous vous demandez à quoi peut bien servir cette fonctionnalité, alors cette section est faite pour vous.  L’objectif du CDC  est d’optimiser l’intégration des données ( du processus ETL)  en requêtant directement les modifications faites sur  une table au lieu de travailler sur l’intégralité de la table et ce faisant augmenter les temps de traitement.  Elle permet entre autres de faire de l’audit de base, de faire de la synchronisation entre deux bases.

Lire la suite

Gestion des rôles avec Analyses Services (SSAS)

Cet article a pour but de présenter les différentes phases de la mise en place des droits d’accès aux dimensions et aux mesures d’un cube. Ceci en fonction du rôle et de la place occupée dans l’entreprise.

Cas d’étude :

Snap1

 

                       

Schéma technique de la solution :

 Snap2

Besoin :

La Direction Générale a fait la demande suivante au service décisionnel:

v  Pour la division COMMERCIALE

  • Afficher la mesure Budget Euros
  • Masquer les mesures Budget Effectif et Effectif Disponible (de la division uniquement)

v  Pour La Division RH

  • Accès aux mesures Budget Effectif et Effectif Disponible de l’entreprise

 

 Conseil :

Utiliser des noms explicites pour les rôles afin de cibler le périmètre et les droits d’accès des membres de ce rôle.
Administrer les droits d’accès au niveau du domaine.

Solution technique :

Créer pour  chaque division un GROUPE dans l’Active Directory.
Ces groupes serviront à restreindre l’accès aux données par division.

Récapitulatif :

Snap3

En  pratique lorsqu’un utilisateur appartient à plusieurs rôles, ces rôles se complètent.

Le rôle administrateur est en règle générale appliqué aux DBAs de l’entreprise.
Le rôle lecteur peut être attribué aux développeurs de la solution et ou aux Power Users.

 

 

Tutoriel:

Ouvrir le projet SSAS dans Visual Studio.
Sous l’onglet Role de votre projet SSAS, faire un clic-droit, New Role :

Snap4

Première étape, on va créer le Role Admin.
On définit le nom du rôle et les autorisations attribuées aux membres du groupe sur le cube en cochant les cases Full Control, Process Database, Read definition dans l’onglet général :Snap5

Sous l’onglet Membership, cliquer sur le bouton Add pour rechercher dans l’Active Directory le groupe ADMINISTRATORS :

Snap6

Deuxième étape, on passe à la création du rôle lecteur dont les membres seront les personnes habilitées à voir toutes les mesures du cube sans exception :

Snap7

Au niveau de l’onglet Data Sources, cocher la case Read Definition et laisser  la colonne Acces à None.

Snap8

L’accès se fait en lecture (Read).
La colonne Local Cube/drillthrough Access à None pour interdire le rapatriement du cube en local.
La case Process est décochée afin d’interdire le traitement du cube.

Snap9

3eme étape :

Même procédé que lors de l’étape précédente.
Nous allons détailler dans notre exemple la création du rôle  dont le nom sera «  RoleCommerce ».

Sous l’onglet Cell Data, sélectionner le cube résultat, puis cocher la case Enable  read-contingent permissions.

La requête à taper en MDX correspondante est:
(NOT [Measures].CurrentMember IS [Measures].[Effectif Disponible]) AND(NOT[Measures].CurrentMember IS [Measures].[Effectif Budget])

Snap10

Par défaut, dans l’onglet dimensions, cocher les cases Read Definition afin que les dimensions soient accessibles  en lecture. Dans un second temps, nous allons rendre visible uniquement le code et le libellé de la division 54195 de la Dimension Division pour le rôle concerné (COMMERCE)

Sous l’onglet Dimension Data -> Attribute : déplier le cube Résultat et sélectionner la dimension cube (Dim Division) La dimension division dont le code de division commerciale est 54195.

Deux modes disponibles, un mode Basic (graphique) et un mode Avancé (code MDX) :

Snap12

Après déploiement et traitement du cube, via SSMS ou Visual Studio, repérer le bouton qui permet de choisir l’utilisateur se connectant au cube :

Snap13

Sélectionner le rôle à tester (COMMERCE dans notre cas), puis cliquer sur OK :

Snap14

En glissant,  la mesure Effectif Disponible, Budget Effectif et Budget Euros :

Snap15

Constats et Résultats :
Les cellules relatives aux mesures Effectif Disponible et Effectif Budget sont indisponibles (#N/A).
La mesure Budget Euros est visible pour les membres de la division concernée.
Un dernier détail qui a son importance, le Grand Total de cette mesure ne doit pas faire apparaître le budget des autres divisions. Pour cela, il faut cocher la case Enable Visual Totals dans l’onglet Dimension Data du rôle  :

Snap16

Pour aller plus loin :

Microsoft SQL SERVER 2008 Ebook Analyses Services Step by Step (free e-book)

Power BI Pour Office 365

Suite à la Présentation IT CAMP de SQL 2014 et Power BI Pour Office 365 par Franck Mercier, voici un résumé des fonctionnalités de Power BI Pour Office 365.

PowerBI1

POWER BI pour Office 365 est composé de plusieurs éléments qui constituent la suite BI incluse dans Excel et qui permet de stocker vos Workbooks dans le Cloud grâce au Site Power BI.

A noter que certaines fonctionnalités ci-dessous ne sont pas présentes seulement dans Power BI pour Office 365, elles sont en faites présentes dans Excel qui lui-même est l’élément principal de la suite Power BI.

On peut donc séparer les éléments en 2 Parties:
1. Excel : rapatrier des données, les modéliser et les visualiser/ analyser.
2. Cloud : partager des rapports sur le Site Power BI qui est une option d’Office 365. Accessibilité via mobile, tablette. Trouver des infos grâce à Q&A, automatiser le rafraichissement des rapports…

Voici un résumé des différents éléments que regroupe Power BI pour Office 365, ainsi que les versions minimum nécessaire :

EXCEL

POWER QUERY « ETL » pouvant   se connecter à tout type de données interne ou externe Excel 2010
POWER PIVOT Modélisation des données pouvant   se connecter à de nombreuses sources de données utilisant un moteur en   mémoire très performant Excel 2010
POWER VIEW Visualisation des données principalement   de type charte / histogramme en mode “Dynamique” Excel 2013
POWER MAP Visualisation des données géographique   sur carte 3D en mode “Dynamique” Excel 2013

Cloud

POWER BI SITE Stockage et partage des   rapports, support bientôt HTML5 (SharePoint Online Amélioré) Office 365 Option Power BI
POWER BI MOBILE App Visualisation des rapports   sur tablette et téléphone Office 365 Option Power BI
POWER BI Q & A Outil inclus dans le site   web pour poser des questions en « langage naturel » (ex : Français   courant) avec réponse en graphique Office 365 Option Power BI
DATA MANAGEMENT GATEWAY / DATA REFRESH Data Catalog ET passerelle entre   les documents dans le Cloud et les sources de données « On Promise »   pour rafraichir les données. Office 365 Option Power BI

Je ne reviendrai pas sur les différents modules d’Excel dont nous avons déjà parlé (Power Query, Power Pivot, Power View and Power Map) et pour lequel nous pouvons déjà trouver pas mal d’articles, Tutos et autre Webcasts.

Je vais faire un focus sur les éléments de Power BI inclus dans Office 365 qui vous permettent de faire de la BI Online et/ou en Cloud Hybride.

Voici tout d’abord l’architecture de Power BI qui est je le rappelle encore une version Preview et qui peut donc être modifié, il vient d’ailleurs d’être enrichi du DATA REFRESH :

PowerBI2

Comme d’écrit plus haut, nous voyons bien les deux parties – Excel sur la droite et Cloud sur la gauche – qui complète la Suite Power BI dans Office 365.

Passons donc à chaque éléments :

POWER BI SITE

Power BI Site est une app pour SharePoint Online, il permet de visualiser et organiser les documents Excel d’une meilleur façon qu’une simple librairie SharePoint. Il inclut également toutes les autres fonctionnalités propres à Power BI dont nous allons parler ci-dessous.

POWER BI MOBILE Apps

Une application propre à Power BI pour Office 365 qui permet de visualiser les rapports stockés sur le site Power BI. L’application est pour le moment seulement disponible sur le Windows Store, une application IPad serait en cour de développement. Power View est actuellement le meilleur outil pour la visualisation sur App grâce à sa visualisation Dynamique.
L’application est gratuite sur le Windows Store, cependant elle permet de visualiser seulement des rapports stockés dans le Site Power BI.

POWER BI Q & A

Cette fonctionnalité permet de poser des questions sur le Site Power BI en langage courant et de visualisé la réponse sous forme de rapport graphique. Pour le moment Q&A est basé seulement sur quelques Workbooks proposés par Microsoft ce qui ne permet pas de vraiment tester la qualité des résultats. Nous reviendrons donc sur ce module lorsqu’une version plus complète sera disponible.

DATA MANAGEMENT GATEWAY

Ce module permet de faire du Reporting en mode Cloud Hybride – j’entends par là le fait d’avoir vos rapports dans Office 365 donc dans le Cloud et d’avoir vos sources de données sur site donc « On Promise » – sans créer une infrastructure complexe.

Le DMG vous permet de créer une passerelle entre les deux environnements.

Pour faire simple, à partir du centre d’administration du Site Power BI vous aller créer une « Passerelle » sécurisée entre votre rapport et le server de donnée source. La création de la passerelle sur le Site Power BI génère une clé unique qu’il faudra installer manuellement sur le Server de donnée source à l’aide d’un agent (une seule fois).

Une fois la passerelle installée il est donc possible de visionner en mode Excel web App un rapport stocké dans Power Bi for Office 365 (un SharePoint Online amélioré) et de rafraichir directement les données!

*A Noter que les crédentials de connections au source qui sont « On Promise » peuvent être stockés dans le Cloud ou « On Promise », donc aucune données ou crédential ne seront stockés dans le Cloud si vous le désirez.
Par contre si votre Workbook contient un modèle Power Pivot celui ci sera stocké dans le Cloud, privilégié donc un modèle SSAS Tabular dans ce cas.

Le DMG permet également de pouvoir se connecter grâce à Power Query à des données « On Promise » qui seront mis à disposition des utilisateurs sous la forme d’un flux Odata. On peut imaginer des Vues qui seront créées par l’IT pour les utilisateurs, par exemple Vue Client, Vente… et mis à disposition sur le Site Power BI pour la Self BI !
Grace à la passerelle créée, les utilisateurs pourront importer les données et créer leurs propres rapports, et ce, même en étant en dehors du réseau de l’entreprise.

Data refresh

Process du flow de donnée au travers du DMG (décrit ci-dessus) qui permet le rafraichissement manuel ou automatique des données des rapports comme dans SharePoint, fonctionnalité très attendu par la communauté et qui vient d’être ajoutée à la Suite Power BI. Il permet de planifier le Refresh automatique des Workbooks et Data Catalog sur le Site Power BI.

DataRefresh

CONCLUSION

Power BI est aujourd’hui une suite complète qui permet de créer ses propres rapports entièrement dans Excel, partager les rapports et automatiser le refresh. Nous sommes donc bien dans le Self-Service BI !
Il y a encore des limitations concernant la taille maximum des fichiers Excel mais cette limitation tant à diminuer (aujourd’hui 250MB pour la visualisation d’un Workbook, 30MB pour le Refresh des données via Power BI).

L’interface du Site Power BI étant différent de SharePoint Online il peut être déroutant au premier abord mais comme tous les nouveaux outils quelques minutes de prise en main seront nécessaires. Espérons que les utilisateurs prendront le temps nécessaire car le Site est avant tout fait pour eux.

D’autres articles suivront dès que possible pour détailler les modules ci-dessus avec quelques tutoriaux.

Essayer Power Bi c’est ici : http://office.microsoft.com/en-ca/excel/power-bi-FX104080667.aspx

SSAS – Processer un cube Analysis Services de 8 manières différentes

SSAS-cube
Dans cet article, nous allons voir ensemble huit méthodes nous permettant de traiter un cube OLAP.
Avant toute chose, faisons un petit rappel sur les différents types de traitement de cube suivants :
Process Default, Process Full, Process Clear, Process Data, Process Update, Process Add, Process Index, Process Structure, Process Clear Structure.

JavaScript, un langage single-thread

JavaScript, il faut le savoir, est un langage single-thread. Cela signifie que le code d’une page s’exécute sur un seul et unique thread, et qu’aucun appel n’est dispatché.

Prenons un exemple concret (on utilise jQuery pour simplifier) et essayons de déterminer dans quel ordre va s’exécuter le code suivant :

// 1. Code principal
console.log("Code principal");
var element = $("#mon-element");
element.on("click", onClick);

alert("Coucou!");

element.trigger("click");

someFunction();

// 2. Gestionnaire d'évènement
function onClick() {
  console.log("Gestionnaire d'évènement");
}

// 3. Méthode arbitraire
function someFunction() {
  console.log("Fonction arbitraire");
}

Et le résultat :

Capture console single-thread

On pouvait à priori s’y attendre, pourtant cet exemple mérite quelques commentaires.

Tout d’abord, l’appel à la fonction alert() a pour effet de bloquer l’exécution du code JavaScript. Tant que l’utilisateur n’aura pas cliqué sur le bouton de la fenêtre modale qui va s’afficher, le reste du code ne sera pas traité. On peut le voir facilement en mettant un point d’arrêt après la fonction.

Ensuite, il est intéressant de noter que le gestionnaire d’évènement sera exécuté dès l’appel à trigger(), et non pas mis en file d’attente comme on aurait pu le croire.

Une conséquence importante de la nature single-thread du JavaScript est que le code s’exécute sur le même thread que le thread graphique. Cela signifie que pendant ce temps l’interface utilisateur est bloquée (impossible de cliquer sur les boutons), et qu’aucun repaint de la page (rafraîchissement de l’affichage) ne peut être effectué.

Par exemple, si l’on essaie de faire tourner une boucle infinie, on constate qu’au bout de quelques secondes le navigateur nous propose d’arrêter le script qui selon lui « ne répond pas ». Tous les navigateurs modernes affichent ce comportement, qui vise à empêcher que des scripts malicieux ou mal conçus ne viennent perturber l’expérience utilisateur.

// Boucle infinie
while(true) {}

Capture firefox blocage

Mais nous allons voir maintenant que certaines fonctions peuvent faire varier l’ordre d’exécution du code JavaScript, et nous aider à résoudre les problèmes dus à des scripts trop longs à s’exécuter.

L’asynchronisme en JavaScript

Certaines tâches en JavaScript peuvent s’exécuter de manière asynchrone, c’est-à-dire de manière décalée par rapport au code principal. Cela peut être soit subi soit provoqué par le développeur lui-même.

Un exemple d’appel asynchrone subi est un appel Ajax. Lorsque l’on contacte le serveur pour récupérer des données, il est impossible de savoir combien de temps celui-ci mettra pour nous répondre, c’est pourquoi on indique une fonction de « callback » qui sera chargée de traiter le résultat retourné. Le navigateur va donc exécuter l’appel Ajax, attendre la réponse du serveur, puis exécuter le callback.

$.ajax("/UNE-URL-QUELCONQUE").done(function () {
  // Callback
});

// Ce code s'exécutera AVANT le callback
var toto = "toto";

Pendant le temps d’attente qui suit l’appel au serveur, deux faits remarquables vont se dérouler. Tout d’abord, le moteur JavaScript va traiter tout code en attente d’exécution, et notamment le code qui pourrait avoir été déclaré à la suite de l’appel Ajax. Ensuite, une fois que tout le code en attente aura été exécuté et si le serveur n’a toujours pas répondu, le moteur JavaScript rendra la main au thread graphique, permettant ainsi à l’utilisateur d’interagir normalement avec la page. Ce n’est que lorsque le serveur aura répondu que le thread graphique sera de nouveau interrompu afin de laisser le moteur JavaScript exécuter notre callback de traitement de la réponse.

Mais il est aussi possible de provoquer volontairement des appels asynchrones. Pour cela on utilise les méthodes JavaScript setTimeout() et setInterval(). Ces méthodes permettent respectivement de retarder l’exécution d’une fonction selon un temps d’attente défini, et de répéter l’exécution d’une fonction selon un intervalle de temps défini.

var timeoutId = setTimeout(function () {
  // Cette fonction s'exécutera dans 1 seconde (1000 millisecondes)
}, 1000);

Pendant le temps qu’attendra le navigateur avant d’exécuter le callback, l’interface utilisateur sera libérée. Ce sont ces fonctions que l’on utilise pour gérer l’affichage d’une animation (sur les vieux navigateurs) et surtout pour permettre au thread graphique de prendre une grande bouffée d’air avant de lancer une routine susceptible de mettre très longtemps à s’exécuter, anticipant ainsi l’affichage de l’avertissement « le script ne répond pas » que nous avons vu plus haut. Ces méthodes renvoient un identifiant unique (un nombre entier en fait) qui permet à tout moment d’annuler l’exécution retardée des callbacks avec respectivement les méthodes clearTimeout() et clearInterval().

// Finalement j'ai changé d'avis
// et je ne souhaite pas que le callback soit exécuté
clearTimeout(timeoutId);

Notez qu’Internet Explorer depuis la version 10 propose également la fonction setImmediate(), qui est l’équivalent d’un setTimeout() avec un délai d’attente de zéro. Son utilisation revient à dire au moteur JavaScript : termine de traiter tout ce qui est en attente, laisse le thread graphique faire un repaint, et ensuite seulement occupe-toi de ce bloc de code. Cette méthode, bien qu’elle n’ait pas été homologuée par le W3C, peut être très utile dans le cadre du développement d’applications Windows Store avec WinJS.

Au chapitre des fonctions introduisant de l’asynchronisme dans JavaScript, on peut aussi citer requestAnimationFrame(), une nouveauté HTML5 qui permet de demander au navigateur ne nous réserver une « fenêtre » avant le prochain repaint. C’est la méthode moderne pour qui veut gérer plus finement l’affichage de ses animations.

Les WebWorkers

Les WebWorkers sont une nouveauté HTML5 permettant d’exécuter du code JavaScript dans une tâche de fond, c’est-à-dire de faire du multi-thread. L’intérêt est de pouvoir effectuer côté client de lourds calculs dans un thread séparé, permettant ainsi de ne pas bloquer le thread graphique.

Pour cela, on doit déporter le code qui sera traité dans un fichier .js séparé. Le thread principal et le thread de tâche de fond que représente ce fichier pourront alors discuter par le biais d’une API de message.

// On créé un WebWorker en indiquant le fichier .js
var backgroundTask = new Worker("background-task.js");

// On s'abonne aux messages que va renvoyer le WebWorker
backgroundTask.addEventListener("message", function (event) {
  // Traitement des données renvoyées par le WebWorker
  var returnedData = event.data;
});

// On poste un message au WebWorker pour le lancer
backgroundTask.postMessage("");

Contenu du fichier « background-task.js » (le WebWorker) :

// Le fait de recevoir un message du code principal
// lance le traitement du WebWorker
onmessage = function (event) {
  var mainThreadData = event.data;

  // On simule une opération longue à s'exécuter
  setTimeout(
        function () {
            postMessage("Coucou du WebWorker!");
        },
        5000
    );
};

Le thread principal et le WebWorker peuvent s’échanger du JSON mais les données seront dupliquées. Comprendre : les modifier d’un côté ne les modifiera pas de l’autre, il faut les échanger grâce à l’API de message. Notez aussi que les WebWorkers reposent sur des threads gérés par le système d’exploitation lui-même.

Les WebWorkers ont toutefois une lourde limitation : ils s’exécutent dans une sorte de « bac à sable » conçu pour limiter les problèmes de sécurité, et à ce titre ils n’ont pas accès aux variables globales de l’objet window, notamment jQuery et document. Autrement dit les WebWorkers n’ont pas accès au DOM.

Ce dernier point peut s’avérer problématique, car JavaScript est souvent utilisé pour manipuler le DOM afin de modifier le rendu de la page web. Il est toutefois possible de résoudre cette difficulté en rusant. Par exemple, imaginons que nous ayons dans notre page un tableau contenant quelques centaines de lignes. Nous voulons trier celles-ci en fonction d’une donnée qu’elles contiennent afin de modifier ensuite leur ordre d’affichage. Le calcul permettant de faire le tri étant assez lourd, nous allons le déléguer à un WebWorker à qui nous enverrons un tableau contenant des paires « id de la ligne / donnée de tri ».

// On invoque un WebWorker et on lui envoie les données à trier
var tableSorter = new Worker("background-task.js");
tableSorter.postMessage([
  { "id": "line-1", "data": "Pierre" },
  { "id": "line-2", "data": "Paul" },
  { "id": "line-3", "data": "Jacques" }
]);

La responsabilité du WebWorker sera alors d’effectuer le plus gros du travail en triant le tableau, avant de renvoyer au thread principal un nouveau tableau contenant les ids dans l’ordre attendu. Il ne restera donc plus qu’à manipuler le DOM pour remettre les lignes dans le bon ordre.

// Le WebWorker se charge de l'opération la plus lourde : le tri
onmessage = function (event) {
  var tableData = event.data;
  tableData.sort(function (a, b) {
    if (a.data > b.data)
      return 1;

    if (a.data < b.data)
      return -1;

    return 0;
  });

  return tableData.map(function (line) {
    return line.id;
  });
};

Conclusion

Si vous voulez aller plus loin je vous invite à lire cette réponse sur StackOverflow, qui donne des détails intéressants sur l’aspect single-thread de JavaScript, notamment sur le fait qu’il est possible de « tricher » pour faire s’exécuter du code lorsque par exemple une fenêtre modale « alert » est affichée.

La Content Search Web Part et les Display Template

Content Search Web Part

Présentation de la CSWP

SharePoint 2013 apporte son lot de nouveautés, l’une d’entre elles est l’ajout d’une Web Part nommé « Content Search », « Recherche de contenu » en français. Cette dernière permet d’interroger le moteur de recherche pour restituer une information. Cette Web Part est une version amélioré de la Content Query Web Part qui ne reste, pour beaucoup, qu’un vestige des versions précédentes de SharePoint. Il faut noter que cette webpart est disponible pour la version Enterprise sur on-premises. Quant aux éditions Office 365 et SharePoint Online, la CSWP est désormais disponible sur les plans Entreprise (E3, E4, A3, A4, G3 et G4) au même titre que la fonctionnalité de Cross-Site Publishing et la navigation par facettes.

Content Search Web Part

Content Search Web Part

Dans les propriétés de cette Web Part, il est possible de définir une requête à l’intérieur de laquelle l’index du moteur de recherche est interrogé. Ces requêtes, une fois exécutée, retournent des résultats suivant plusieurs paramètres, à savoir:

  • Une source de résultats (anciennement l’étendue ou Scope)
  • Des règles de requêtes
CSWP

Propriété Content Search Web Part

Query Builder

Une interface de conception appelée Query Builder est à notre disposition pour créer la requête en sélectionnant la source de résultat, l’ordre avec laquelle les informations doivent remonter, etc. …Il est également possible de passer l’interface en mode avancé.  A partir de là, nous pouvons récupérer certaines propriétés et autres mots clés afin de filtrer le résultat. Le filtre de propriété apporte une grande profondeur dans la formulation de nos requêtes, il est entre autre possible de récupérer directement les paramètres d’URL.

Liste filtre Query Builder

Liste filtre Query Builder

Dans cet exemple, nous utilisons le filtre URLToken sur notre propriété ProductCatalogGroupNumberOWSTEXT afin de récupérer le deuxième paramètre de notre URL.

SPTokenURL

SPTokenURL

Cette propriété nous permet, in fine, de n’afficher que les résultats correspondants au deuxième paramètre d’URL. Dans ce contexte il s’agit de n’afficher que les produits faisant partit du groupe « 2146″.

Query Builder

Query Builder

Les Display Template

Présentation des modèles

Une fois que la requête est définie, il faut mettre en forme les résultats. Je vous vois venir de loin avec vos modifications de fichiers XSLT … Ici, il n’en est pas questions, nous allons utiliser les composants natifs livrés avec notre SharePoint 2013 : les Display Template et Control Display Template.

Ces derniers sont disponibles dans la galerie de pages maitre et mise en pages. De nombreux autres Templates sont également de la partie: Filter Display Template, Group Display Template, HTML Master Page pour ne citer qu’eux, mais ces derniers ne font pas l’objet de ce poste, donc je ne m’arrêterais pas dessus.

Lors des premières manipulations de ces fichiers, vous remarquerez assez rapidement que lorsque vous ajoutez un nouveau Template, un fichier JavaScript y est associé. Un conseil, n’y touchez pas. Le fichier associé est en fait le résultat d’une conversion du fichier source html en JS.  Une propriété « Associated File » est présente pour le fichier HTML.

Fichier associé

Display Template, fichier associé

Gestion des modèles

Dans le cadre de ce poste, nous récupérons des modèles par défaut pour en faire de nouveaux « custom ». Pour le modèle de type Control, nous partons sur le Control_List.html et pour celui de l’Item, nous prendrons le Item_Default.html. Une fois la copie de ces fichiers effectuée, il faut renommer le contenu de la balise <Title> avec quelque chose de plus approprié. Une fois nos modèles téléchargés, nous pouvons les associer à notre Web Part en les sélectionnant dans notre catégorie Display Template.

Control et Item display template

Control et Item display template

L’image ci-dessous illustre le positionnement de nos Display et Control Template dans le cadre d’un tableau de résultats. Ici, l’objectif est d’avoir un tableau dans lequel nous pouvons récupérer les éléments issus de notre requête définies plus haut.

Schéma display template

Schema Display Template

Comme mentionné précédemment, je vous recommande fortement de vous appuyer sur les modèles standard, de renommer les Title et l’ID de notre div et de les utiliser tel quel au début. Ensuite, une fois que vous avez l’assurance qu’il s’agit bien de votre modèle qui est utilisé pour l’affichage, vous pourrez effectuer les modifications dans SharePoint Designer 2013, ou par le biais d’un éditeur de texte comme Notepad++.

Modification des modèles

Plusieurs balises propres à SharePoint sont disponibles dans ces modèles afin de faciliter la récupération et la transformation des éléments issus de la recherche.

  • _#= ctx.RenderGroups(ctx) =#_  et _#= ctx.RenderItems(ctx) =#_ sont des fonctions utilisés pour appeler nos Display Template
  • _#= ctx.CurrentItem.xxx =#_ est une fonction utilisée pour afficher le rendu de notre propriété (ex : Title, Path, etc …).

Les propriétés disponible sont définies au début du modèle, dans la section  <mso:ManagedPropertyMapping msdt:dt= »string »>. Il est possible de rajouter des propriétés gérées dans cette même section. Dans notre cas, nous souhaitons rajouter des propriétés gérés liées à catalogue de produits provenant d’un autre site :

Managed properties display template

Managed properties display template

Un peu plus bas dans notre modèle, nous pouvons ajouter nos CSS et JavaScripts dans la balise <script>

Par exemple:

Javascript display template

Javascript display template

Il suffit ensuite d’éditer le code HTML juste en dessous pour créer notre tableau.

Notre Display Control

<table class="artis-tasktable" id="_#= encodedID =#_">
    <thead>
        <tr>
            <th>Product Model</th>
            <th>Product Name</th>
            <th>Price (in $)</th>
            <th>Color</th>
            <th>Size</th>
            <th>Weight</th>
        </tr>
    </thead>
    <tbody>
         _#= ctx.RenderGroups(ctx) =#_
    </tbody>
</table>      </div>
</body>
</html>

Notre Display Item 

        <div id="_#= containerId =#_" data-displaytemplate="ItemLargePicture">
            <div id="_#= pictureContainerId =#_">
                <h1 id="_#= line1Id =#_"> _#= line1 =#_</h1>
                <a href="_#= linkURL =#_" title="_#= $htmlEncode(line1) =#_" id="_#= pictureLinkId =#_">
                    _#= pictureMarkup =#_
                </a>
            </div>
        <div id="itemdescription">
            <p class="currency">$ _#= Math.round(ctx.CurrentItem.CostOWSCURR * 100) / 100 =#_ </p>
            <ul class="desclist">
                <li><span class="desc">Description:</span> _#= ctx.CurrentItem.Description =#_ </li>
                <li><span class="desc">Color:</span> _#= ctx.CurrentItem.ColorOWSTEXT =#_ </li>
                <li><span class="desc">Weight:</span> _#= ctx.CurrentItem.WeightOWSTEXT =#_ </li>
                <li><span class="desc">Size:</span> _#= ctx.CurrentItem.SizeOWSTEXT =#_ </li>               
            </ul>
         </div>
        </div>
    </div>
</body>
</html>

Et voilà le résultat final. Et surtout, n’oubliez pas de publier vos modèles !

Display Template

Display Template