2012-07-30

Changer le champ Author (CreatedBy) d'une liste Sharepoint...

...sans une ligne de code!

(enfin, à part un minimum d'édition HTML)

C'était un problème qui m'achalait depuis un bon bout de temps. Les clients voulaient ça: qu'un usager Admin puisser créer un item de liste pour une autre personne. C'est important, car la sécurité de base Sharepoint fait en sorte qu'un usager régulier ne voit que ce qu'il a créé. Bref, si un admin crée un item, il est à son nom et l'usager régulier ne le voit pas (alors que l'inverse est ok: l'usager régulier peut créer de quoi que l'admin va voir, justement parce qu'il est admin).

Comment régler ça?

Voici la solution illustrée. Certaines valeurs ont été brouillées délibérément question de garder la confidentialité.

Ceci se basera sur l'exemple d'une liste Sharepoint 2010 nommée MaListe qui ne contient que le champ Title (par défaut). La présence ou l'absence d'autres champs ne devrait rien changer.

1- Dans Sharepoint Designer (download gratuit de Microsoft), ouvrir le site et choisir la liste MaListe

2- Créer un nouveau formulaire (au milieu à droite) qu'on nommera ici Assignation. C'est un formulaire d'édition, mais pas par défaut. Cocher la case pour créer le lien et lui donner son libellé (pour faire original, Assignation).



3- Dans le formulaire, ajouter une nouvelle ligne après le premier champ. Supprimer les lignes subséquentes (on veut que ce formulaire d'édition change seulement le champ Author, pas les autres alors aussi bien les enlever). Le champ Title peut rester à titre informatif (comme quoi l'usager sait ce qu'il modifie).


4- Aller en mode édition du code (pour voir le HTML). Trouver la ligne qu'on vient d'ajouter (ça devrait suivre Title). Ça devrait ressembler à                    
<tr>
   <td valign="top" class="ms-formlabel" width="190px">
       <xsl:text xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" ddwrt:nbsp-preserve="yes" disable-output-escaping="yes">&amp;nbsp;</xsl:text>
   </td>
   <td valign="top" class="ms-formbody" width="400px">
       <xsl:text xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" ddwrt:nbsp-preserve="yes" disable-output-escaping="yes">&amp;nbsp;</xsl:text>
   </td>
</tr>


5- Remplacer ceci par:
<tr>
   <td width="190px" valign="top" class="ms-formlabel">
       <H3 class="ms-standardheader"><nobr>Nouveau créateur</nobr></H3>
   </td>
   <td width="400px" valign="top" class="ms-formbody">
       <SharePoint:FormField runat="server" id="ff2{$Pos}" ControlMode="Edit" FieldName="Author" __designer:bind="{ddwrt:DataBind('u',concat('ff2',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Author')}"/>
       <SharePoint:FieldDescription runat="server" id="ff2description{$Pos}" FieldName="Author" ControlMode="Edit"/>
   </td>
</tr>



ATTENTION! ff2 est ici un indicateur qui doit être unique d'un champ à l'autre. Si vous gardez plusieurs contrôles sur votre formulaire, cet indicateur devra être différent sur votre formulaire (prenez le plus haut ff + 1)

Ce que ça fait:
-Une première colonne nommée Nouveau créateur

7- Sur le site Sharepoint, Dans le menu contextuel, Assignation devrait maintenant être là.


8- On peut donc choisir la valeur... et le travail est fait.  (je sais que c'est brouillé, mais ça marche, promis!)