lundi 25 août 2008

Voir les pièces jointes dans une page DispForm.aspx

Problème connu : lorsque vous personnalisez une page dispform.aspx avec un formulaire de liste personnalisé, il n'est plus possible de visualisez les pièces jointes.
Une solution est détaillée ici : Marc Davis: Retaining Attachment functionality when using the Custom List Form control in SharePoint 2007 or WSS 3.0 .Une fois la crise cardiaque passée, on envisagera plutôt une solution de ce type : Displaying List Attachments in Custom List Forms - Maarten Eekels's SharePoint blog

mardi 12 août 2008

Multilinguisme dans SharePoint

Le multilinguisme dans SharePoint donc, tout d'abord les composants :

pour WSS 3.0,
Windows SharePoint Services 3.0 Language Pack
Windows SharePoint Services 3.0 Language Pack Service Pack 1 (SP1)

et si vous avez MOSS 2007, il faut ajouter :
Office System Language Packs for SharePoint Server 2007
The 2007 Microsoft Office Servers Language Pack Service Pack 1 (SP1)

à prendre en version anglaise uniquement, car comme le dit ce précieux document "Plan for building multilingual solutions by using SharePoint Products and Technologies", il contient tout un bundle de langages différents contrairement aux autres.

à la suite de quoi, vous disposez dans le formulaire de création d'un site SharePoint de la petite ComboBox suivante vous permettant de sélectionner une langue pour votre site. Toute l'interface du nouveau site sera alors traduite dans la langue choisie :



Après l'interface, il nous faut gérer les contenus qui devront faire l'objet de traductions. Il existe dans SharePoint (et non WSS) la fonctionnalité "Variantes" pour gérer ce cas de figure.

Pour simplifier, lorsque vous utilisez les variantes, vous disposer d'un contenu maître et de différents contenus esclaves.
A chaque modification du contenu maître, une copie est soumise aux différents contenus esclaves, copies qui devront faire l'objet d'une adaptation puis d'une validation avant d'être publiée (workflow de publication). Ce système est utilisé pour gérer les problématiques multilangues dans SharePoint, mais pourrait tout aussi bien être utilisé dans d'autres contextes je vous renvoi à ce post utile Re : [MOSS2007] Multilinguisme standard et ses limites - Forums du site MSDN France

Pour implémenter notre variante (un site principal français, une variante anglaise) , nous allons :
  1. Créer un nouveau site SharePoint en utilisant le modèle "Site de publication avec flux de travail"
  2. Puis au niveau de la collection, dans Paramètres du site > Variantes, rechercher votre site et cliquer sur Ok
  3. Dans Paramètres du site > Étiquettes de variantes, nous allons définir notre contenu maître avec par exemple les paramètres suivants :


  4. Nous créons maintenant une variante esclave,


  5. Nous créons la hiérarchie dans Paramètres du site > Étiquettes de variantes > Créer des hiérchachies


Nous sommes prêt à tester l'édition de contenu,
  1. Si l'on revient sur le site initial, on constate qu'une nouvelle version a été automatiquement créée avec nos paramètres linguistiques
  2. Modifier votre page et cliquer sur "Soumettre pour approbation"

  3. Au bout de quelques instants, vous recevez des notifications concernant les tâches de contrôles et d'approbations des modifications. Vous devez bien sur archiver et approuver le contenu source afin que les variantes, une foi les jobs de réplication exécutés, soient mises à jour.

    Pour mon cas personnel, la mise à jour des variantes passe par l'exécution de l'option "Variantes de mises à jour" (mal traduite puisque ce devrait être "Mises à jour des variantes") dans "Outils" de la "Barre d'outils de la modification de la page"


J'ai découvert cet article alors que j'écrivai celui-ci, ils sont donc très proche : Planet MOSS: Multilingual MOSS mais j'espère tout aussi utile :)

lundi 11 août 2008

Ajout bouton Toolbar + Création d'un lien

Voici un code à insérer dans une page SharePoint pour intégrer un bouton dans une barre d'outils standard sans passer par une Custom Action comme ceci :


Cela est utile notamment lorsque vous avez affiché une vue de données sur un élément de liste (ex: tous les produits d'une catégorie donnée) et que vous voulez pouvoir créer une nouvelle donnée en envoyant l'identifiant de l'élément courant (ex: ajouter un nouveau produit pour une catégorie particulière). C'est la cas qui est détaillé ici mais il pourra être adapter pour tout autre cas de figure.

Tout d'abord le "bouton" en lui-même qui est un simple div avec quelques propriétés de classes css et de comportements :
<div id="NewLink" class="ms-menubuttoninactivehover" hoverinactive="ms-menubuttoninactivehover" hoveractive="ms-menubuttonactivehover" onmouseover="MMU_PopMenuIfShowing(this);MMU_EcbTableMouseOverOut(this, true)"></div>

Ensuite vous positionnez le script suivant qui écrira ce qu'il faut dans le div (positionner ce script juste avant la balise </asp:Content> , c'est à dire juste avant la fin du panel qui contient votre div)
<script language="javascript" type="text/javascript">
var qs = location.search.substring(1, location.search.length);
var args = qs.split("&");
var vals = new Object();
for (var i=0; i < args.length; i++)
{
var nameVal = args[i].split("=");
if(nameVal[0]=="ID")
{
var temp = unescape(nameVal[1]).split('+');
nameVal[1] = temp.join(' ');
document.getElementById("NewLink").innerHTML="<a href='VOTRE_URL?ListId="+nameVal[1]+"'>Nouvel Elément</a>"; }
}
</script>
Il faut bien sûr modifier VOTRE_URL et ListId avec, respectivement, l'url de destination ainsi que le nom du paramètre qui sera traité par la page de destination (plus d'infos dans Valeurs par defaut de contrôles dans un formulaire SharePoint)

Et pour finir une petit lien bien pratique pour encoder/decoder les entités html lors de passage de paramètres dans l'url Querystring parameters

vendredi 8 août 2008

Valeurs par defaut de contrôles dans un formulaire SharePoint

Besoin récurrent lors de la manipulation de formulaire Sharepoint, pouvoir positionner automatiquement la valeur d'une combobox selon un identifiant présent dans la querystring (exemple au hasard :))

Une méthode fournie par Microsoft SharePoint Team Blog : Using Javascript to Manipulate a List Form Field consiste à utiliser un script Javascript qui va se charger d'analyser la querystring et de retrouver le contrôle pour l'initialiser avec la valeur qui va bien

prévoyez donc un fichier "script.js" avec le code suivant :

// This javascript sets the default value of a lookup field identified
// by <<FIELD DISPLAY NAME>> to the value stored in the querysting variable
// identified by <<QUERYSTRING VARIABLE NAME>>

// Customize this javascript by replacing <<FIELD DISPLAY NAME>> and
// <<QUERYSTRING VARIABLE NAME>> with appropriate values.
// Then just paste it into NewForm.aspx inside PlaceHolderMain

_spBodyOnLoadFunctionNames.push("fillDefaultValues");

function fillDefaultValues() {
var qs = location.search.substring(1, location.search.length);
var args = qs.split("&");
var vals = new Object();
for (var i=0; i < args.length; i++) {
var nameVal = args[i].split("=");
var temp = unescape(nameVal[1]).split('+');
nameVal[1] = temp.join(' ');
vals[nameVal[0]] = nameVal[1];
}
setLookupFromFieldName("<<FIELD DISPLAY NAME>>", vals["<<QUERYSTRING VARIABLE NAME>>"]);
}

function setLookupFromFieldName(fieldName, value) {
if (value == undefined) return;
var theSelect = getTagFromIdentifierAndTitle("select","Lookup",fieldName);
// if theSelect is null, it means that the target list has more than
// 20 items, and the Lookup is being rendered with an input element
if (theSelect == null) {
var theInput = getTagFromIdentifierAndTitle("input","",fieldName);
ShowDropdown(theInput.id); //this function is provided by SharePoint
var opt=document.getElementById(theInput.opt);
setSelectedOption(opt, value);
OptLoseFocus(opt); //this function is provided by SharePoint
} else {
setSelectedOption(theSelect, value);
}
}

function setSelectedOption(select, value) {
var opts = select.options;
var l = opts.length;
if (select == null) return;
for (var i=0; i < l; i++) {
if (opts[i].value == value) {
select.selectedIndex = i;
return true;
}
}
return false;
}

function getTagFromIdentifierAndTitle(tagName, identifier, title) {
var len = identifier.length;
var tags = document.getElementsByTagName(tagName);
for (var i=0; i < tags.length; i++) {
var tempString = tags[i].id;
if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {
return tags[i];
}
}
return null;
}
Remplacer les valeurs <<FIELD DISPLAY NAME>> et <<QUERYSTRING VARIABLE NAME>> par vos valeurs.
Insérer , via SharePoint designer par exemple, la ligne suivante dans votre page :
<script language="javascript" src="script.js"></script>
Selon les cas cela demandera un d'adaptation mais l'essentiel est là.

jeudi 7 août 2008

Intellisense SharePoint dans Visual Studio

La petite astuce qui mange pas de pain et permet d'augmenter votre intellisense!! :)

Copier
"C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\12\TEMPLATE\XML\wss.xsd"
dans
"c:\program files\Microsoft Visual Studio 8\XML\Schemas"
Bien sûr, modifier les chemins selon votre configuration

Importer correctement un fichier html

Avec cette petite méthode vous pouvez downloader un fichier HTML avec un encodage correct sans tous les caractères spéciaux et autres entité html

internal string Download(string source, string destination)
{

HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create(source);
string chemin = string.Empty;

using (WebResponse Response = WebRequestObject.GetResponse())
{
using (Stream WebStream = Response.GetResponseStream())
{
System.Text.Encoding encod = System.Text.Encoding.GetEncoding("iso-8859-1");
using (StreamReader Reader = new StreamReader(WebStream,encod))
{
string nom = "NomDuFichier";
chemin = Path.Combine(destination, nom);
using (StreamWriter sw = new StreamWriter(chemin))
{
sw.Write(HttpUtility.HtmlDecode(Reader.ReadToEnd()));
}
}

}

}
return chemin;

}

lundi 4 août 2008

LinksList 04

.NET
  1. “How Do I?” Videos — Data Platform Development
  2. LINQ to Objects : l'envers du décor
  3. Développement avec Visual Studio Tools pour Office
  4. LINQ To SQL Tutorial
  5. Utiliser LINQ to SQL (Partie 1)
  6. LINQ to SQL (Partie 2 - Définition de nos classes du modèle de données)
  7. [.NET] Comprendre la philosophie des exceptions sous .NET
  8. [Silverlight] Comment bien débuter avec Silverlight 2.0 ?

SHAREPOINT
  1. SitePoint CSS Reference
  2. Créer une activité personnelle pour les workflows Sharepoint Designer
  3. Introduction to data calculations
  4. Aide de l'Administration centrale (Office SharePoint Server 2007)
  5. Notes: 70-541 MCTS SharePoint Services 3.0 - Application Development
  6. Paul Andrew : MSSharePointDeveloper Content
  7. Docs Table
  8. patterns & practices SharePoint Guidance

Tout pour les Customs Actions...

...et notamment pour créer une Custom Action (CA) uniquement pour une liste précise.
  1. Créer une feature spécifique de la liste concernée à l'aide de SharePoint Solution Generator (option "Définition de liste")
  2. Dans le dossier "12\TEMPLATE\FEATURES\{Votre Feature}\{Votre Feature}", ouvrir le fichier "ListDefinition.xml" et modifier l'argument Type du noeud ListTemplate avec un chiffre supérieur à 10000
  3. Dans le dossier "12\TEMPLATE\FEATURES\{Votre Custom Action}", ouvrir "elements.xml" et modifier l'argument RegistrationId du noeud CustomAction avec le chiffre que vous avez choisi à l'étape numéro 2
  4. iisreset
Quelques liens pour la route :
Creating Menu Item for a Specific List/Document Library Template
Sharepoint 2007 : Les Custom Actions
CustomAction Element (Custom Action)
How to: Add Actions to the User Interface