XSL / XPath / Sharepoint : Problème du double encodage des données.

L’esperluette m’a tué
J’ai rencontré ce problème en créant une « DataFormWebPart » sous le Sharepoint Designer. Les données finales affichées (HTML) étaient doublement encodées par rapport à la source de données.
Prenons cet élément d’une liste SharePoint :
L'iPad est nul
A travers une DataFormWebPart créée sous le sharepoint Designer, il ressortira ainsi
L"iPad est nul
 
Cause : il y a eu double encodage : L'iPad est nul -> L"iPad est nul -> L"iPad est nul
Et sur le navigateur, le résultat est celui-ci : L"iPad est nul
 
Le problème vient du XSL, au moment d’afficher la valeur :
<xsl:value-of select="@Valeur"/>
Il faut ajouter l’attribut suivant : disable-output-escaping= »yes »:
<xsl:value-of select="@Valeur" disable-output-escaping="yes" />
 
Sans aller dans les tréfonds du code XLS, le Sharepoint designer peut aider à la tache :

  • Se mettre en mode « création »
  • Survoler l’un des éléments de la webpart
  • Changer le type d’affichage (passer le « texte brut » à « texte enrichi »).

 
 
 

MOSS 2007 : Multi-linguisme

Do you speak moss the most ?
Comment créer un site en plusieurs langues sous MOSS ?
Voici les étapes à suivre, pour la création d’un site simple, à partir de zéro :

  • Définir toutes les langues qui seront utilisées, et installer les Language Pack adéquats dans la ferme SharePoint.
  • Créer son app. web + la collection de site associée (de modèle publication). C’est au moment de la création de la collection de site que la langue principale est choisie.
  • Dans le site : Créer une première étiquette de variation (la principale, par ex le français).
  • Générer la hiérarchie.
  • Construire son site sur la variation principale.
  • Puis enfin créer les étiquette de variantes (en choisissant les langues adéquates) et générer la hiérarchie.
  • Reste à traduire les contenus dans les n variations créées.

Quelques remarques :

  • Une variation n’est qu’un sous-site synchronisé avec un site principal (la variation principale).
  • Par synchronisation, il faut comprendre que si il y a une modification, les auteurs des sous-sites variants seront alertés (workflow).

Pour en savoir plus sur les variations, voir cet article en deux parties :
Les variations – Page 1
Les variations – Page 2
Egalement trouvé sur un forum, cette bonne synthèse .

MOSS : Un bon outil de stats

Voici un outil très simple à déployer et qui permet d’avoir des stats bien plus sympa que l’outil natif de MOSS :
http://www.mapilab.com/download/
(c’est un freeware, il suffit de s’inscrire)
Entre autres :

  • Exports PDF
  • Stats sur les recherches les plus fréquentes
  • Temps de consultations
  • Présentations sous forme de courbes, tableaux (avec tris et groupement…)
  • etc……..

MOSS 2007 : Activer les statistiques d’un site

Comment accéder à de magnifiques rapports d’utilisation du site ? (camemberts, diagrammes…)
Voici les 3 manipulations à effectuer pour activer les statistiques sur un site MOSS :

  • Activer le journal de traitement de l’analyse
  •  » Admin centrale Sharepoint > Opération > Traitement de l’analyse de l’utilisation « 
  • Cocher  » Activer le journal « 
  • Emplacement : Donner (pourquoi pas) le même répertoire que les logs wss.
  • Nombre de fichiers : Nb de serveurs de BDD * 3 (préconisation MS).
  • Cocher  » Activer le traitement « .
  • Donner un intervalle de temps d’au moins 1/2 heure, le midi ou le soir.
  •  » OK « 

Dans les services partagés du site :

  • Cliquer sur « Rapports d’utilisation » dans la section « Rapports d’utilisation d’Office SharePoint ».
  • Cocher les deux cases, et faire « OK »

L’URL de la page qui va contenir les stats du site est :
http://mon_site/_layouts/SPUsageWeb.aspx

MOSS 2007 : Restaurer une liste ne restaure pas les ID des enregistrements !

Catastrophe : vos identifiants d’items de liste n’ont plus rien à voir avec ceux d’antan !
Imaginons qu’une liste contient des enregistrements qui sont référencés par d’autres listes via leur champ ID (champ présent dans toute liste).
Maintenant restaurons cette liste (pour une raison lambda).
Bam ! Là, c’est le drame.Les ID ne sont pas restaurés… C’est une colonne auto-increment, donc les nouveaux ID reprendront là ou le dernier enregistrement s’était arrêté.
Tous les liens vers les autres listes sont cassés…
Moralité : éviter les liens vers cette colonne ID (autant créer son propre champ identifiant).
Solution 1 : Faire des UPDATE AllUserData SET ID = 111 etc. pour remettre d’équerre tous ces ID (bon courage)
Solution 2 : Je ne la connais pas encore, mais il y a sans doute moyen de forcer à quel ID commencer. En supprimer la liste, et en la recréant… A voir.

MOSS 2007 : Error logs 6482 7076 et 6398 toutes les minutes.

Solution naturelle à un bug surnaturel.
Comment réussir à stopper net ces trois erreurs récurrentes du minuteur : 6482, 7076 et 6398 ?
Pour ma part, j’avais toute les minutes ces erreurs de générées dans le journal des événements.
Les messages ressemblaient à ça : “ Old format or invalid type library ” ("Ancien format ou bibliothèque de types non valide") ou “ Not enough storage ” ("Espace insuffisant pour traiter cette commande").
Pour autant, ma ferme SharePoint fonctionnait normalement.
Solution :Installer les deux KB suivants disponibles via ce lien :

  • KB923028
  • KB918642

Ces vilaines traces devraient disparaitre… MSDN ? Lave plus blanc que blanc.

MOSS 2007 : Comment modifier une liste SharePoint via un WebService sous SSIS ?

Tutoriel.

SOMMAIRE

  • 1. INTRODUCTION

     

     
     

  • 2. VERIFIER L’EXISTENCE DU WEB SERVICE
  • 3. CREER LA DLL DE PROXY

     

     
     

  • 4. EXEMPLE DE PROJET SOUS SSIS

  • 1. INTRODUCTION

     

    1.1. Description

     
    Voici une manière rapide de mettre à jour des métadonnées d’éléments d’une liste SharePoint grâce aux web services natifs de l’application. Ces web services seront appelés à partir de Microsoft SQL Server 2005 Integration Services (SSIS).

    1.2. Pré-requis

     
    Les logiciels suivants doivent être installés sur la machine :
     

      • WSS 3.0 et MOSS 2007

     

      • Visual Studio 2005

     

      • SQL Server 2005

     

    2. VERIFIER L’EXISTENCE DU WEB SERVICE

     
    Sous IE, taper l’URL suivante : http://serveur:port/_vti_bin/lists.asmx
     
     » serveur:port  » étant un site SharePoint dans lequel vous souhaitez attaquer les listes.
     
    L’écran suivant devrait s’afficher avec la liste complète des opérations que propose le Web Service :

    3. CREER LA DLL DE PROXY

     
    Une DLL de proxy fournit toutes les classes qui permettent de communiquer avec le Web Service. Il serait possible de développer soi-même ces classes, mais ce serait inutile, car la création de cette DLL est très simple. Elle nous permet de faire abstraction, entre autres, de l’utilisation du protocole SOAP et du formatage des requêtes à envoyer au serveur.
     
    Une DLL de proxy = Un Web Service.
     
    NB : SSIS est capable de communiquer directement avec des Web Services grâce à la  » Web Service Task « . Cependant, le Web Service List.asmx contient des paramètres de type complex qui ne sont pas gérés par SSIS. D’où la création de cette DLL qui sera fournie à SSIS.

    3.1. Création de la DLL

     
    Ouvrir Visual Studio 2005, même une version Express gratuite suffit. Ici nous utiliserons Visual C# 2005 Express Edition.
     
    Ajout d’une référence vers le Web Service :
     

      • Faire Fichier > Nouveau Projet > Class Library

     

      • Donner un nom du genre  » MOSSWebService  » et cliquer sur OK.

     

      • Dans l’explorateur de solution, faites un clic-droit sur  » Références  » et cliquer sur  » Ajouter une référence Web  » :

      • Dans la fenêtre qui apparait, renseigner l’URL du Web Service (la page comme vue précédemment devrait s’afficher en aperçu), et donner un nom à la référence (ici, MOSSWebService_Lists) :

      • Cliquer sur  » Ajouter la référence « .

     

      • NB : A partir de ce moment là, Visual Studio va générer automatiquement tout le code adapté au Web Service en utilisant WSDL.exe (qu’on aurait pu aussi utiliser  » à la main  » directement en ligne de commande).

     

      • Sauvegarder la solution dans un répertoire quelconque.

     
     
    Avant de compiler notre solution, il va falloir signer l’assembly :
     

      • Faire un clic-droit sur le projet (MOSSWebService), et faites  » Propriétés « .

     

      • Cliquer sur l’onglet  » Signature « .

     

      • Cliquer sur  » Signer l’assembly « 

     

      • Dans la liste déroulante en dessous, faire  » <nouveau�> « 

     

      • Une fenêtre surgit, donner un nom au fichier de clé (ici, MOSSWebService_Lists)

     

      • Décocher la case  » Protéger mon fichier par un mot de passe « 

     

      • Faire OK, vous devriez obtenir cet écran :

      • Faites CTRL + S avant de cliquer-droit sur la solution et cliquer sur  » Générer la solution « .

     
     
    La DLL est créée !

    3.2. Enregistrement dans le GAC

  • Copier la DLL, présente dans  » Repertoire_de_la_solution / MOSSWebService / bin / Release / « , vers le répertoire  » C: WINDOWS Microsoft.NET Framework v2.0.xxxxx « .
  • Ouvrir une fenêtre de commandes MSDOS.
  • Aller dans le répertoire  » C:WINDOWSMicrosoft.NETFrameworkv2.0.xxxxx « .
  • Taper  » gacutil –i MOSSWebService.dll  » et faites ENTREE.
  • L’assembly et ajoutée dans le cache et est disponible pour SSIS.
  •  
    NB : Certains diront qu’il suffit de faire un glisser-déposer de la DLL pour la placer dans le GAC. A cela je réponds : « C’est en faisant n’importe quoi qu’on devient n’importe qui » (L.Briand).

    4. EXEMPLE DE PROJET SOUS SSIS

  • Lancer SQL Server Business Intelligence Development Studio, et faire  » Fichier > Nouveau > Projet  » puis sélectionner  » Project Integration Service  » et faire OK.
  • Faire un  » Glisser – déposer  » d’une tâche de script de la boite à outils vers la page Flux de contrôle :
  • Double-cliquer sur la tache de script.
  • Une fenêtre d’édition de la tâche s’ouvre. Cliquer sur  » Script  » à gauche, puis sur le bouton  » Créer un script  » en bas :
  • Une nouvelle fenêtre Visual Studio s’ouvre, avec du code source prédéfini.
  • Dans l’  » explorateur de projet  » (ici à gauche), faire un clic-droit sur  » Références  » et cliquer sur  » Ajouter une référence  » :
  • Choisir la nouvelle DLL fraichement créée (MOSSWebService.dll), faire  » Ajouter  » puis  » OK « .
  • Faire de même pour les deux DLL suivantes :
      • System.XML.dll

     

      • System.Web.Services.dll

     
     

  • Modifier le code comme suit :
      • Ajouter deux lignes d’import :Imports MOSSWebService
        Imports MOSSWebService.MOSSWebService_Lists

     

      • Dans le corps de la fonction Main(), ajouter le code suivant :

     
     

  • Public Sub Main()
            Try
                ’’’ URL du Web Service
                Dim sUrl As String = "http://URL/_vti_bin/lists.asmx"
                ’’’ Objet représentant le Web Service
                Dim oListWS As New Lists
                oListWS.Credentials = System.Net.CredentialCache.DefaultCredentials
                oListWS.Url = sUrl
                ’’’ Génération de la requête CAML de mise à jour de la liste
                Dim xDoc As New System.Xml.XmlDocument
                Dim xBatch As System.Xml.XmlElement = xDoc.CreateElement("Batch")
                xBatch.SetAttribute("OnError", "Return")
                ’’’ Corps de la requête CAML : Cette requête va simplement changer la metadonnée "Title"
                ’’’ de l’item d’identifiant 20.
                Dim sBatch As String = ""
                sBatch += "20"
                sBatch += "Nouveau Titre"
                sBatch += ""
                xBatch.InnerXml = sBatch
                ’’’ Lancement de la fonction de MAJ de la liste "Bibliothèque des sinistres".
                Dim xReturn As System.Xml.XmlNode = oListWS.UpdateListItems("Bibliothèque des sinistres", xBatch)
                ’’’ Affichage de la réponse renvoyée par le serveur.
                Dts.Events.FireInformation(1, "", xReturn.InnerXml, "", 0, False)
                ’’’ La tâche s’est bien passée
                Dts.TaskResult = Dts.Results.Success
            Catch Ex As Exception
                ’’’ La tâche a échoué
                Dts.TaskResult = Dts.Results.Failure
            End Try
    	End Sub
    
  • Faire CTRL + S, et fermer la fenêtre Visual Studio.
  • De retour sur le SSIS, faire F5 pour lancer le package.
  • L’item d’identifiant 20 (s’il existe) aura son titre à  » Nouveau Titre  » (à vérifier sous le site SharePoint).

MOSS 2007 : Problème de MAJ de workflow et cache du Designer

Les modifications apportées aux workflows dans le designer ne sont pas pris en compte !
Voici la manipulation à effectuer, inspirée de cet article de MSDN.

  • Fermer de Designer
  • Recherche le répertoire %System Drive%Documents and Settings\%user%Local SettingsApplication DataMicrosoftWebSiteCache.
  • Supprimer le répertoire dont le nom correspond au site concerné.
  • Les modifications apportées au designer seront prises en compte.

La meilleure chose à faire serait de créer un batch qui supprime ces fichiers à la demande…

MOSS 2007 : Les liens relatifs vers les bibliothèques de connexions de données situées sur des collections de sites SharePoint différentes ne sont pas pris en charge.

Cette erreur peut arriver lorsque vous publiez un formulaire Infopath même si vos connexions de données viennent de la même bibliothèque !
Cette erreur n’a alors aucune raison d’être, vu que toutes vos connexions font bien partie de la même collection de site.
Que se passe-t-il ? Voici le problème que j’ai rencontré, et qui arrive assez fréquemment :
Editez le fichier manifest.xsf avec le bloc note.
Allez sur les lignes où sont déclarées toutes les connexions (xsf2:adoAdapterExtension ou xsf2:webServiceAdapterExtension).
Maintenant comparez bien les attributs siteCollection… la moindre majuscule de différence, et l’erreur surgira !
Il faut bien que toutes les attributs siteCollection des balises xsf2:connectoid soient parfaitement identiques, à la majuscule près !

MOSS 2007 : Problème de style en mode anonyme.

Il peut arriver que certains fichiers (images, feuilles CSS) soient inaccessibles en mode anonyme, notamment dans les sous-sites d’une collection de sites SharePoint.
La solution est simple : tous les fichiers inhérents au style que vous avez créés doivent être placés dans le répertoire _catalogs/masterpage.
Ainsi, tous vos fichiers seront accessibles, même via une connexion anonyme. De plus, cela permet de centraliser vos sources autour de votre nouvelle masterpage.