Publié samedi 22 janvier 2011 12:29 par Arnault Nouvel

SharePoint : Développer des colonnes calculées

Contrairement à ce que l’on pourrait penser, il y a 2 types de colonnes calculées dans SharePoint :

  • les <Field Type="Calculated" /> que l’on peut créer avec l’interface habituelle, dans lesquelles on manipule des formules,
  • et les <Field Type="Computed" /> qu’on ne peut créer que via une définition CAML ou par modèle objet.

Les 2 types permettent de définir des colonnes en lecture seule dont la valeur dépend d’autres champs de l’élément. Le premier permet notamment de faire de très jolies choses lorsqu’il est couplé à du code JavaScript, comme expliqué ici : Using calculated columns to write HTML. Aujourd’hui, nous allons parler du 2ème type, qui m’a permis de répondre à 2 besoins à la fois chez l’un de mes clients. Dans son extranet SharePoint 2007, orienté publication de contenu, celui-ci utilise beaucoup de web parts associées à des bibliothèques. Celles-ci étant plus simples à mettre en place que des web parts requêtes de contenu, c’est elles que mon client utilise pour afficher le contenu de ses bibliothèques à ses utilisateurs.

Son premier besoin est que si le titre d’un document est renseigné, ce soit le titre qui soit affiché au lieu de son nom. Il est très facile de répondre à ce besoin via une web part requête de contenu, mais rien ne permet nativement de le faire dans une web part de bibliothèque.

D’autre part, les utilisateurs se plaignent que, lorsqu’ils cliquent sur un document office, l’application leur demande de se ré authentifier. Cela vient du fait que, dans les web parts de bibliothèques, les liens vers les documents indiquent aux applications office de s’ouvrir et de travailler avec le document de manière distante. L’application Office, qui par définition est executée dans un processus différent, doit donc s’authentifier indépendamment du navigateur.
A contrario, sur un site web classique, un lien vers un document retourne simplement le dit document afin qu’il soit téléchargé par l’utilisateur et que celui-ci travaille avec en local. L’extranet de mon client étant orienté publication de contenu, il souhaite que les documents soient téléchargés et non ouverts de manière distante. Là encore, c’est plutôt simple à mettre en place avec une web part requête de contenu, mais ce n’est pas prévu en standard dans une web part de bibliothèque.

Avec le comportement par défaut, on obtient ceci lorsque l’on clique sur le lien du document (colonne “Nom”) :

f1

Quelque-soit le mode choisit, Word s’ouvre et essaye d’ouvrir le document situé sur le serveur, provoquant une demande d’authentification :

f2

Ce comportement n’est pas souhaitable dans le cadre d’un site de publication. Ce qu’on veut, c’est que le document soit tout simplement téléchargé en local.

Pour proposer un lien de téléchargement de document, on peut utiliser la “page” /_layouts/download.aspx, qui prend en query string un argument SourceUrl permettant de spécifier l’url d’un fichier que l’on souhaite télécharger. Nous allons voir comment proposer un lien dynamique vers cette “page” dans une colonne de bibliothèque. Exemple : http://sncfc.nwtraders.com/_layouts/download.aspx?SourceUrl=/monsite/documents/document1.docx.

Les colonnes calculées (Type=”Computed”) permettent de définir un rendu HTML à partir de patterns XML. Le principe est approximativement le même que pour les transformations XSLT, mais le langage est différent. Ici pas de classe à développer, juste une définition de colonne à écrire en CAML.

Voici la définition de colonne répondant au besoin énoncé ci-dessus :

<Field ID="{19B08457-9C22-4d54-BC74-BC321E1704EC}" Type="Computed" Name="DownloadLinkWithTitleOrName" StaticName="DownloadlinkWithTitleOrName" DisplayName="Document" Hidden="FALSE" CanToggleHidden="FALSE" Sortable="TRUE" Filterable="FALSE" AuthoringInfo="(Lien de téléchargement avec affichage du titre ou du nom)" SourceID="http://schemas.microsoft.com/sharepoint/v3" FromBaseType="TRUE" ReadOnly="TRUE" >

       <FieldRefs>

             <!-- Colonnes utilisées par la colonne calculée -->

             <FieldRef Name="Title"/>

             <FieldRef Name="FileRef"/>

       </FieldRefs>

       <DisplayPattern>

             <!-- Le lien pointe vers /_layouts/download.aspx qui renvoie le fichier dont l'url est en paramètre -->

             <HTML><![CDATA[<a href="http://blogs.developpeur.org/_layouts/download.aspx?sourceUrl=]]></HTML>

             <!-- Url du fichier encodée -->

             <LookupColumn Name="FileRef" URLEncodeAsURL="TRUE"/>

             <HTML><![CDATA[">]]></HTML>

             <!-- Définition d’une variable ItemTitle -->

             <SetVar Name="ItemTitle">

                    <LookupColumn Name="Title" StripWS="TRUE" HTMLEncode="TRUE" />

             </SetVar>

             <Switch StripWS="TRUE">

                    <Expr>

                           <GetVar Name="ItemTitle" StripWS="TRUE" />

                    </Expr>

                    <!-- Si le titre est vide, j'affiche le nom du document -->

                    <Case Value="">

                           <UrlBaseName HTMLEncode="TRUE">

                                  <LookupColumn Name="FileRef"/>

                           </UrlBaseName>

                    </Case>

                    <!-- Si le titre est rempli, j'affiche le titre du document -->

                    <Default>

                           <GetVar Name="ItemTitle" StripWS="TRUE" />

                    </Default>

             </Switch>

             <HTML><![CDATA[</a>]]></HTML>

       </DisplayPattern>

</Field>

On notera qu’il est nécessaire de déclarer les colonnes dont on utilise la valeur, dans l’élémént FieldRefs. Si ce n’est pas fait, à l’éxecution, les colonnes apparaitront comme vides.

On notera aussi l’utilisation de l’instruction Switch qui est résolue pour chaque élément du jeu de résultat, contrairement à FieldSwitch qui n’est résolue que pour le premier résultat et dont la valeur est réutilisée pour tous les éléments du jeu de résultat. Je précise cela car la plupart des exemples trouvés sur internet utilisent FieldSwitch.

Une fois cette colonne associée (par code avec la méthode list.Fields.AddFieldAsXml(xml) ou via une définition de liste custom, on peut l’ajouter à nos vues :

image

Et voici le rendu. Notez que, contrairement à la colonne “Nom”, le lien de la colonne “Document” propose le document au téléchargement :

image

Vous trouverez ici l’ensemble des balises qu’il est possible d’utiliser dans les patterns de rendu : http://msdn.microsoft.com/en-us/library/ms439798.aspx

Notez qu’il existe certaines limitations avec cette méthode lorsqu’elle est utilisée sur des types de contenu, décrites dans ce billet au titre un peu exagéré : Do not use SharePoint Computed fields 

Arnault Nouvel
Winwise

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Classé sous ,

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01