Migrer de JSLink vers les Extensions SharePoint Framework
Depuis Microsoft SharePoint 2013, la plupart des solutions d’entreprise conçues en complément de Microsoft 365 et de SharePoint Online ont utilisé la propriété JSLink
des affichages de champ et de liste pour personnaliser le rendu des champs.
Dans l’interface utilisateur « moderne » de SharePoint Online et SharePoint Server 2019, la plupart de ces personnalisations ne sont plus disponibles. Heureusement, les extensions SharePoint Framework vous permettent de fournir des fonctionnalités similaires dans l’interface utilisateur « moderne ».
Dans ce didacticiel, vous allez découvrir comment passer des anciennes personnalisations « classiques » au nouveau modèle basé sur les extensions SharePoint Framework.
Remarque
Pour obtenir plus d’informations sur la procédure de création d’extensions SharePoint Framework, reportez-vous à l’article Vue d’ensemble des extensions de SharePoint Framework.
Tout d’abord, voici les options disponibles lors du développement des extensions de SharePoint Framework :
- Personnalisateur d’application : étend l’IU native « moderne » de SharePoint en ajoutant des éléments HTML personnalisés et du code côté client à des espaces réservés prédéfinis dans les pages « modernes ». Pour plus d’informations sur les personnalisateurs d’application, consultez Créer votre première extension SharePoint Framework (Hello World 1re partie).
- Jeu de commandes : ajoutez des éléments de menu BCE personnalisés ou des boutons personnalisés à la barre de commandes d’un affichage de liste pour une liste ou une bibliothèque. Vous pouvez associer n’importe quelle action côté client à ces commandes. Pour plus d’informations sur les jeux de commandes, consultez Créer votre première extension de jeu de commandes ListView.
- Personnalisateur de champ : personnalisez le rendu d’un champ dans un affichage de liste à l’aide d’éléments HTML personnalisés et de code côté client. Pour plus d’informations sur les personnalisateurs de champ, consultez Créer votre première extension de personnalisateur de champ.
L’option la plus utile dans notre cas est l’extension du personnalisateur de champ.
Imaginez que vous êtes dans SharePoint Online et que vous avez une liste personnalisée avec un champ personnalisé intitulé « Couleur », qui est de type Choice et qui propose les valeurs suivantes : Rouge, Vert, Bleu, Jaune. Supposons que vous ayez une valeur personnalisée pour la propriété JSLink
du composant WebPart chargé du rendu en mode liste de la liste personnalisée.
Dans l’extrait de code suivant, vous pouvez voir le code JavaScript référencé par la propriété JSLink
(customColorRendering.js).
// Define a namespace for the custom rendering code
var customJSLinkRendering = customJSLinkRendering || {};
// Define a function that declare the custom rendering rules for the target list view
customJSLinkRendering.CustomizeFieldRendering = function () {
// Define a custom object to configure the rendering template overrides
var customRenderingOverride = {};
customRenderingOverride.Templates = {};
customRenderingOverride.Templates.Fields =
{
// Declare the custom rendering function for the 'View' of field 'Color'
'Color':
{
'View': customJSLinkRendering.RenderColorField
}
};
// Register the custom rendering template
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(customRenderingOverride);
};
// Declare the custom rendering function for the 'View' of field 'Color'
customJSLinkRendering.RenderColorField = function (context)
{
var colorField = context.CurrentItem.Color;
// Declare a local variable to hold the output color
var color = '';
// Evaluate the values of the 'Color' field and render it accordingly
switch (colorField)
{
case 'Red':
color = 'red';
break;
case 'Green':
color = 'green';
break;
case 'Blue':
color = 'blue';
break;
case 'Yellow':
color = 'yellow';
break;
default:
color = 'white';
break;
}
// Render the output for the 'Color' field
return "<div style='float: left; width: 20px; height: 20px; margin: 5px; border: 1px solid rgba(0,0,0,.2);background:" + color + "' />";
};
// Invoke the custom rendering function
customJSLinkRendering.CustomizeFieldRendering();
Vous pouvez voir comment la propriété JSLink
est configurée dans le composant WebPart d’affichage de liste.
Si vous avez chargé le fichier JavaScript dans la bibliothèque Éléments du site, la valeur de la propriété JSLink
peut être "~site/SiteAssets/customColorRendering.js"
.
Vous pouvez voir comment fonctionne le rendu personnalisé de la liste.
Comme vous le voyez, les champs Couleur restituent une case remplie de la couleur sélectionnée au niveau de l’élément.
Remarque
Pour configurer ce type de solution dans un site « classique », vous pouvez, finalement, utiliser un modèle de configuration de PnP, capable de configurer la liste avec à la fois le champ personnalisé et la propriété JSLink
.
Pour migrer la solution précédente vers SharePoint Framework, suivez les étapes ci-dessous.
Créer une nouvelle solution SharePoint Framework
À partir de la console, créez un dossier pour votre projet comme suit :
md spfx-custom-field-extension
Accédez au dossier du projet :
cd spfx-custom-field-extension
Dans le dossier du projet, exécutez le générateur Yeoman pour SharePoint Framework afin de structurer un projet SharePoint Framework :
yo @microsoft/sharepoint
Lorsque vous y êtes invité, entrez les valeurs suivantes (sélectionnez l’option par défaut pour toutes les invites qui ne sont pas mentionnées ci-dessous) :
- Quel est le nom de votre solution ? : spfx-custom-field-extension
- Quel type de composant côté client voulez-vous créer ? : Extension
- Quel type d’extension côté client créer ? Personnalisateur de champ
- Quel est le nom de votre personnalisateur de champ ? CustomColorField
- Quel modèle voulez-vous utiliser ? : Pas de framework JavaScript
Démarrez Visual Studio Code (ou l’éditeur de code de votre choix) et commencez à développer la solution. Pour démarrer Visual Studio Code, vous pouvez exécuter l’instruction suivante.
code .
Définir le nouveau personnalisateur de champ avec JavaScript
Pour reproduire le comportement du rendu de champ personnalisé JSLink
, vous devez implémenter la même logique à l’aide du code côté client au sein de la nouvelle solution SharePoint Framework. Pour accomplir cette tâche, procédez comme suit.
Ouvrez le fichier dossier./src/extensions/customColorField/CustomColorFieldFieldCustomizer.manifest.json. Copiez la valeur de la propriété
id
et stockez-la dans un endroit sûr, car vous en aurez besoin plus tard.Ouvrez le fichier ./src/extensions/customColorField/CustomColorFieldFieldCustomizer.ts, puis modifiez le contenu en fonction de l’extrait de code suivant :
import { Log } from '@microsoft/sp-core-library'; import { override } from '@microsoft/decorators'; import { BaseFieldCustomizer, IFieldCustomizerCellEventParameters } from '@microsoft/sp-listview-extensibility'; import * as strings from 'CustomColorFieldFieldCustomizerStrings'; import styles from './CustomColorFieldFieldCustomizer.module.scss'; /** * If your field customizer uses the ClientSideComponentProperties JSON input, * it will be deserialized into the BaseExtension.properties object. * You can define an interface to describe it. */ export interface ICustomColorFieldFieldCustomizerProperties { // This is an example; replace with your own property sampleText?: string; } const LOG_SOURCE: string = 'CustomColorFieldFieldCustomizer'; export default class CustomColorFieldFieldCustomizer extends BaseFieldCustomizer<ICustomColorFieldFieldCustomizerProperties> { @override public onInit(): Promise<void> { // Add your custom initialization to this method. The framework will wait // for the returned promise to resolve before firing any BaseFieldCustomizer events. Log.info(LOG_SOURCE, 'Activated CustomColorFieldFieldCustomizer with properties:'); Log.info(LOG_SOURCE, JSON.stringify(this.properties, undefined, 2)); Log.info(LOG_SOURCE, `The following string should be equal: "CustomColorFieldFieldCustomizer" and "${strings.Title}"`); return Promise.resolve(); } @override public onRenderCell(event: IFieldCustomizerCellEventParameters): void { var colorField = event.fieldValue; // Declare a local variable to hold the output color var color = ''; // Evaluate the values of the 'Color' field and render it accordingly switch (colorField) { case 'Red': color = 'red'; break; case 'Green': color = 'green'; break; case 'Blue': color = 'blue'; break; case 'Yellow': color = 'yellow'; break; default: color = 'white'; break; } // Render the output for the 'Color' field event.domElement.innerHTML = "<div style='float: left; width: 20px; height: 20px; margin: 5px; border: 1px solid rgba(0,0,0,.2);background:" + color + "' />"; } @override public onDisposeCell(event: IFieldCustomizerCellEventParameters): void { // This method should be used to free any resources that were allocated during rendering. // For example, if your onRenderCell() called ReactDOM.render(), then you should // call ReactDOM.unmountComponentAtNode() here. super.onDisposeCell(event); } }
Comme vous le voyez, le contenu de la méthode
onRenderCell()
est presque identique à la méthodeRenderColorField()
dans l’implémentation desJSLink
. Les seules différences sont les suivantes :- Pour récupérer la valeur de champ active, vous devez impérativement lire la propriété
event.fieldValue
de l’argument d’entrée de la méthodeonRenderCell()
. - Afin de renvoyer le code HTML personnalisé pour afficher le champ, vous devez attribuer une valeur à la propriété
innerHTML
de l’objetevent.domElement
, qui représente le conteneur HTML de sortie du rendu du champ.
Hormis ces modifications mineures, vous pouvez réutiliser le même code JavaScript qu’auparavant.
Dans l’illustration suivante, vous pouvez voir le résultat obtenu.
- Pour récupérer la valeur de champ active, vous devez impérativement lire la propriété
Tester la solution en mode de débogage
Revenez à la fenêtre de la console et exécutez la commande suivante pour créer la solution et lancer le serveur local Node.js qui l’hébergera.
gulp serve --nobrowser
Ouvrez votre navigateur préféré et accédez à une liste « moderne » qui comporte un champ personnalisé avec pour nom Couleur et pour type Choice, avec les mêmes options de valeur qu’avant (Rouge, Vert, Bleu, Jaune). Vous pouvez utiliser la liste que vous avez créée dans le site « classique », en l’affichant simplement avec la nouvelle expérience « moderne ». À présent, ajoutez les paramètres de chaîne de requête suivants à l’URL de la page AllItems.aspx.
?loadSPFX=true&debugManifestsFile=https://localhost:4321/temp/manifests.js&fieldCustomizers={"Color":{"id":"c3070978-d85e-4298-8758-70b5b5933076"}}
Dans la chaîne de requête, remplacez le GUID par la valeur
id
enregistrée à partir du fichier CustomColorFieldFieldCustomizer.manifest.json. Le nom de la propriété Color fait référence au nom du champ à personnaliser. Si vous le souhaitez, vous pouvez également fournir un objet de configuration personnalisé, sérialisé au format JSON, comme paramètre supplémentaire pour la construction du personnalisateur de champ.Notez que, lors de l’exécution de la demande de page, une boîte de message d’avertissement intitulée « Autoriser scripts de débogage ? » apparaît pour vous demander l’autorisation d’exécuter du code à partir de l’hôte local pour des raisons de sécurité. Si vous souhaitez déboguer localement et tester la solution, vous devez autoriser l’action « Charger les scripts de débogage ».
Remarque
Par ailleurs, vous pouvez créer des entrées de configuration du serveur dans le fichier config/serve.json dans votre projet pour automatiser la création des paramètres de chaîne de requête de débogage comme indiqué dans ce document : Débogage de solutions SharePoint Framework sur des pages SharePoint modernes
Définir le nouveau personnalisateur de champ avec TypeScript
Vous êtes prêt à remplacer le code JavaScript par du code TypeScript pour tirer parti de l’approche entièrement saisie de TypeScript.
Ouvrez le fichier /src/extensions/customColorField/CustomColorFieldFieldCustomizer.module.scss. Ce fichier est de type CSS SASS qui représente le style de l’interface utilisateur pour le personnalisateur de champ. Remplacez le contenu du fichier SCSS par le contenu suivant.
.CustomColorField { .cell { float: left; width: 20px; height: 20px; margin: 5px; border: 1px solid rgba(0,0,0,.2); } .cellRed { background: red; } .cellGreen { background: green; } .cellBlue { background: blue; } .cellYellow { background: yellow; } .cellWhite { background: white; } }
Remplacez l’implémentation de la méthode
onRenderCell()
par l’extrait de code suivant.@override public onRenderCell(event: IFieldCustomizerCellEventParameters): void { // Read the current field value let colorField: String = event.fieldValue; // Add the main style to the field container element event.domElement.classList.add(styles.CustomColorField); // Get a reference to the output HTML let fieldHtml: HTMLDivElement = event.domElement.firstChild as HTMLDivElement; // Add the standard style fieldHtml.classList.add(styles.cell); // Add the colored style switch(colorField) { case "Red": fieldHtml.classList.add(styles.cellRed); break; case "Green": fieldHtml.classList.add(styles.cellGreen); break; case "Blue": fieldHtml.classList.add(styles.cellBlue); break; case "Yellow": fieldHtml.classList.add(styles.cellYellow); break; default: fieldHtml.classList.add(styles.cellWhite); break; } }
Notez que la nouvelle implémentation de la méthode utilise une approche entièrement saisie et affecte la classe CSS
cell
à l’élément enfantDIV
de l’élément de champ actuel, avec une autre classe CSS personnalisée définissant la couleur cible duDIV
, basée sur la valeur du champ sélectionnée.Exécutez une fois de plus le personnalisateur de champ en mode de débogage et observez le résultat.
Empaqueter et héberger la solution
Si vous êtes satisfait du résultat, vous êtes maintenant prêt à empaqueter la solution et à l’héberger dans une infrastructure d’hébergement réelle. Avant de générer l’offre groupée et le package, vous devez déclarer un fichier XML d’infrastructure de fonctionnalité afin de configurer l’extension.
Vérification des éléments d’infrastructure de fonctionnalité
Dans l’éditeur de code, ouvrez le fichier /sharepoint/assets/elements.xml. Dans l’extrait de code suivant, vous pouvez voir à quoi le fichier doit ressembler.
<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Field ID="{40475661-efaf-447a-a220-c992b20ec1c3}" Name="SPFxColor" DisplayName="Color" Title="Color" Type="Choice" Required="FALSE" Group="SPFx Columns" ClientSideComponentId="c3070978-d85e-4298-8758-70b5b5933076"> </Field> </Elements>
Comme vous le voyez, il rappelle un fichier SharePoint Feature Framework, mais il définit un élément
Field
personnalisé avec un type de champChoice
, qui utilise l’attributClientSideComponentId
pour faire référence à l’id
du personnalisateur de champ, et il peut y avoir un attributClientSideComponentProperties
pour configurer les propriétés de configuration personnalisées requises par l’extension.Ouvrez le fichier ./config/package-solution.json. Dans le fichier, vous trouverez une référence au fichier elements.xml dans la section
assets
.{ "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", "solution": { "name": "spfx-custom-field-extension-client-side-solution", "id": "ab0fbbf8-01ba-4633-8498-46cfd5652619", "version": "1.0.0.0", "features": [{ "title": "Application Extension - Deployment of custom action.", "description": "Deploys a custom action with ClientSideComponentId association", "id": "090dc976-878d-44fe-8f8e-ac603d094aa1", "version": "1.0.0.0", "assets": { "elementManifests": [ "elements.xml" ] } }] }, "paths": { "zippedPackage": "solution/spfx-custom-field-extension.sppkg" } }
Regrouper, empaqueter et déployer la solution
Ensuite, vous devez regrouper et empaqueter l’offre groupée de solutions dans le catalogue d’applications. Pour réaliser cette tâche, procédez comme suit.
Préparez et déployez la solution pour le client SharePoint Online :
Exécutez la tâche suivante pour regrouper votre solution. Cette procédure crée une version Release de votre projet :
gulp bundle --ship
Exécutez la tâche suivante pour créer un package pour votre solution. Cette commande crée un package *.sppkg dans le dossier sharepoint/solution .
gulp package-solution --ship
Chargez ou glissez-déplacez le nouveau package de solution côté client dans le catalogue d’applications de votre client, puis sélectionnez le bouton Déployer.
Installer et exécuter la solution
Ouvrez le navigateur et accédez à n’importe quel site cible « moderne ».
Accédez à la page Contenu du site, puis ajoutez une nouvelle application.
Installez une nouvelle application De votre organisation pour parcourir les solutions disponibles dans le catalogue des applications.
Sélectionnez la solution nommée spfx-custom-field-extension-client-side-solution et installez-la sur le site cible.
Une fois l’installation de l’application terminée, créez une liste personnalisée, modifiez les paramètres de liste et ajoutez une nouvelle colonne aux colonnes de site existantes. Sélectionnez le groupe de colonnes appelé Colonnes SPFx et ajoutez le champ Couleur.
Modifiez le nouveau champ et configurez des valeurs de couleur (telles que Rouge, Vert, Bleu, Jaune), puis enregistrez les paramètres de champ.
Ajoutez des éléments à la liste et observez le résultat dans l’affichage de liste. Il doit ressembler à l’une des captures d’écran suivantes.
Profitez de votre personnalisateur de champ créé à l’aide des extensions de SharePoint Framework !