• Email : info@istep.fr

Blog et publications d'iStep

Restez informé !

Le blog d'istep

La mise à jour de la propriété SPField.Title par code ne fonctionne pas ?

La mise à jour de la propriété SPField.Title par code ne fonctionne pas ?

 

Lors de la création de colonnes de site, une des bonnes pratiques est de créer le champ avec un nom technique (sans espaces ni caractères spéciaux) et de le renommer après avec un nom plus "user friendly" par la suite.

"Simple !" Me direz vous ? C'est ce que je pensais aussi...

Dans le contexte d'un projet, des colonnes de sites sont créées par programmation au travers d'une feature event receiver. Or le renommage des champs ne fonctionnait pas correctement.

 

Données du problème

Activation de la feature depuis :

  • Visual Studio : renommage OK
  • l'interface graphique de ma collection de site : renommage OK
  • PowerShell : renommage KO

OS : Windows Server 2008 RC EN

SharePont : 2013 Standard EN + Language Pack FR

Collection de site : Portail de publication - FR

Scénario

Je souhaite avoir une colonne de site avec un InternalName à "DescriptionElement" et un DisplayName à "Description de l'élément".

Voici donc le code initial :

public override void FeatureActivated(SPFeatureReceiverProperties properties)
       {
           using (SPWeb web = (SPWeb) properties.Feature.Parent)
           {
               const string internalName = "DescriptionElement";
               const string displayName = "Description de l'élement";

               web.Fields.Add(internalName, SPFieldType.Text, false);

               SPField field  = web.Fields[internalName];
               field .Title = displayName;
               field .Group = "iStep - Blog";
               field .Update();
           }
       }

Problème : Ce code fonctionne très bien depuis l'activation de fonctionnalté de l'interface graphique de SharePoint mais pas depuis PowerShell. 

Pourquoi ?

La propriété DisplayName d'un SPField est la traduction de la propiété Title dans la langue de l'interface graphique : CurrentUICultureUICulture. Or étant donné que mon site Sharepoint est en fançais la mise à jour du Title modifie la valeur française de la propriété DisplayName. En revanche, étant donné que mon OS est en anglais la propriété CurrentUICulture de PowerShell est en Anglais.

Démonstration

Depuis l'interface garphique SharePoint

1 - Activation de la feature depuis l'interface graphique

2 - La langue utilisée pour le renommage des champs est le français (1036)

3 - Le display name a été modifié correctement avec la valeur "Description de l'élément"

4 - L'internal name a bien gardé la valeur "DescriptionElement"

Depuis PowerShell

1 - Attachement du debugger Visual Studio au processus PowerShell

 2 - Activation de la feature depuis PowerShell

Enable-SPFeature -Url http://sp2013-istepblog -Identity ce937720-dc84-40a6-94cd-49cccc2a0bc4

3 - La langue utilisée pour le renommage des champs est l'anglais (1033)

4 - Le display name n'a pas été modifié correctement (dans mon interface graphique qui est en français)

Solution

Après une multitude de tentatives, allant de l'exploration de la base de données de contenu jusqu'à la décompilation des assemblies SharePoint pour étudier les accèsseurs de la propriété SPField.Title, je me suis penché sur la méthode SetFieldAttibute.

 

La méthode SetFieldAttibute semble être la solution, un appel direct à celle-ci permet d'aviter le traitement dépendant à la culture d'exécution actuelle. Le problème est que depuis SharePoint 2010, cette méthode est passée de public à internal. Il est donc nécessaire d'utiliser la réflection pour faire appel à cette méthode :

// using System.Reflection;
Type baseType = field.GetType().BaseType;
object obj = baseType.InvokeMember("SetFieldAttributeValue",
                        BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
                        null,
                        field,
                        new object[] { "DisplayName", displayName });;

Pour différentes raisons, dont les performances, je ne conseille pas forcément l'utilisation de la réflexion mais dans le contexte actuel cette solution est plus que convenable.

Une autre piste de solution serait de modifier la propriété UICulture de PowerShell en utilisant les PSSessionOption. Cela dit, je préfère que ma solution SharePoint soit fonctionnelle indépendament des scripts de déploiement.

Catégories: Articles Techniques (Knowledge Base), Publications

Post a Comment

Recherche Blog
Historique