vendredi 24 décembre 2010

Parcours site web en anonyme

Lorsque que vous souhaiter parcourir les web du site courrant en mode anonyme vous ne pourrez pas utiliser de foreach sur la propriété AllWebs de l'objet SPSite. En effet, lorsque vous utiliserez cette propriété en mode anonyme vous aurez une popup d'authentification qui s'ouvrira. Pour éviter ce problème il faudrait plutôt utilisé la méthode:

SPContext.Current.Web.GetSubwebsForCurrentUser();

Utilisation template de mail sous WSS

L'envoi d'un mail par code peut-être une chose fastidieuse quand vous construisez le code html de votre mail dans une de vos fonctions. Le problème de cette méthode c'est que votre code devient vite illisible et si vous(ou un collaborateur utilisant WSS/MOSS) voulez changez le format du mail, vous serez obligez de repasser dans votre code.

Donc pour éviter de vous perdre rapidement dans votre fonction qui écrit votre mail et évitez de repasser dans votre code, utilisez plutôt un template de mail au format html que vous uploaderez dans une doclib (au top level site par exemple).











Du coté code, vous n'avez qu'a ouvrir votre template de mail de la manière suivante:
SPFolder emailTemplatesFolder = rootWeb.GetFolder(rootWeb.Url + "/" + "EmailTemplates");
SPFileCollection fileCollection = emailTemplatesFolder.Files;
SPFile senderMailBodySPFile = fileCollection["monTemplateDeMail.html"];
byte[] senderMailBodyBinary = senderMailBodySPFile.OpenBinary();
string senderMailBody = Encoding.UTF8.GetString(senderMailBodyBinary);



Un petit truc bien sympa aussi, vous pouvez mettre des variables dans votre mail que vous remplacerez dans votre méthode.Pour ma part, j'ai rajoutez des variables dans mon mail qui sont de la forme @@nomVariable@@
Et pour finir, il vous suffit de remplacer vos variables de la manière suivante:

string userName = "dcubesolutions";
senderMailBody = senderMailBody.Replace("@@userName@@", userName );

Find SMTP configuration of a WebApplication or farm

Si un jour vous avez besoin d'envoyer un mail via votre code, plutôt que de mettre l'addresse SMTP pour l'envoi de mail en dur dans votre code, utilisez plutôt le code suivant:

string smtpServerAddress = SPContext.Current.Site.WebApplication.OutboundMailServiceInstance.Server.Address; 
SmtpClient smtpClient = new SmtpClient(smtpServerAddress); 

Ces lignes de code vous permettront de récupérer l'addresse SMTP (configurée dans votre Web Application ou dans la ferme) pour l'envoi de mail et d'instancier un objet smtp que vous utiliserez pour l'envoi de vos mails

Annuler un job bloqué sur le statut Deploying

Lors du déploiement d'un package wsp, il se peut que celui rester bloqué sur le statut "deploying" indéfiniment et vous ne pourrez donc par la suite, ni faire d'upgrade de solution ni aucune autre opération concernant ce package. Pour débloquer le job qui pose problème et pouvoir à nouveau faire des opérations sur le package voici la manipulation à suivre: Lancer la commande stsadm suivante: stsadm -o enumdeployments Le résultat s'affiche alors sous forme de XML. Il vous suffit alors de repérer le nom du package en question dans l'élément et de récuperer l'ID du job qui se trouve dans l'élement







Une fois l'ID récupérer exécuter la commande stsadm suivante: stsadm -o canceldeployment -id votreJobID. Le tour est joué, maintenant vous pourrez à nouveau effectuer des opérations sur votre package

Extension STSADM,STSADM

Les commandes STSADM peuvent s'avérer très utiles mais vous ne trouverez pas forcément la commande utile pour accomplir ce que vous voulez.
Récemment chez un client nous avons eu un petit soucis de modification de navigation.Chaque fois que nous tentions d'utiliser la page de modification de navigation de sharepoint,nous avions une jolie exception générée par Sharepoint.
Un utilisateur avait supprimé une page qui était encore référencée dans la navigation et du coup générait une NullReferenceException.

Ici nous allons vérifier que tout les noeuds de la navigation renvoie vers une page existant dans la doclib "Pages" en créeant une nouvelle commande STSADM.
Cela aurait pu être fait autrement mais nous allons ici aborder l'extension de commandes STSADM.

Notre commande prendrant en paramètre l'url de la site collection dont nous souhaitons vérifier la navigation.

Créer un nouveau projet visual studio de type "Bibliothèque de classe"

Ajouter ensuite le
using Microsoft.SharePoint
et
using Microsoft.SharePoint.StsAdmin

Votre classe doit hériter et implémenter l'interface ISPStsadmCommand.
public interface ISPStsadmCommand
{
string GetHelpMessage(string command);
int Run(string command, StringDictionary keyValues, out string output);
}

public string GetHelpMessage(string command)
{
return "\tCheck navigations node and pages\n" + "\t Using: stsadm -o checkNaviation -siteUrl http://monsite//n/n";
}

public int Run(string command, StringDictionary keyValues, out string output)
{
if (!keyValues.ContainsKey("siteUrl"))
{
output = "Vous devez preciser l'url de la site collection\n";
return 0;
}

_siteUrl = keyValues["siteUrl"];
using (SPSite site = new SPSite(_siteUrl))
{
    using (SPWeb web = site.OpenWeb())
{
      if (!PublishingWeb.IsPublishingWeb(web))
{
Console.WriteLine("Ce site n'est pas un site de type PUBLISHING\nFin du traitement");
return 0;
}

PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web);
foreach (SPNavigationNode navigationNode in pubWeb.CurrentNavigationNodes)
{
if (navigationNode.Children.Count > 0)
{
foreach (SPNavigationNode childrenNavNode in navigationNode.Children)
if (!childrenNavNode.Url.Contains("?")) _urlToTest.Add(childrenNavNode.Url);
}
}

TestPages(web);
}
}
return 1;


private static void TestPages(SPWeb p_web)
{
List pageList = new List();
SPList pagesList = p_web.Lists["Pages"];

foreach (SPListItem pageItem in pagesList.Items)
   pageList.Add(pageItem.Name);

foreach (string pageUrl in _urlToTest)
{
Console.WriteLine("Page testée\t =>{0}", pageUrl);
if (!pageList.Contains(pageUrl))
Console.WriteLine("\t\t => EXISTE PAS\n\n");
else
Console.WriteLine("\t\t => EXISTE\n\n");
}
}

Ajout de notre commande à celles de stsadm. Créez-vous un fichier xml que vous appelerez par exemple stsadmcommands.mesExtensions.xml et ques vous allez ensuite copiez dans le répertoire /12/Config/ de votre installation Sharepoint. Voici la structure du fichier xml NB:Votre fichier doit obligatoirement commencer par "stsadmcommands" Une fois cette étape faite,il ne reste plus qu'à déployer votre DLL dans le GAC et tester votre commande

How to add trigger to an UpdatePanel programmatically

Dans certains cas,notamment lors de développement de webpart où il n'y a pas de page aspx, il peux être intéréssant de pouvoir ajouter des triggers à un updatePanel.

Nous avons un updatePanel qui se nomme updatePanel1 et nous souhaitons ajouter le click du bouton avec pour ID "monBouton1" en tant que trigger asynchrone à l'updatePanel.Voici comment procéder:
AyncPostBackTrigger myAsynPostBackTrigger = new AsyncPostBackTrigger();
myAsynPostBackTrigger.ControlID = "monBouton1";
myAsynPostBackTrigger.EventName = "Click";

//NB:Il faut que votre bouton ait été ajouté aux controls de la page avant d'ajouter votre trigger
updatePanel1.Triggers.Add(myAsynPostBackTrigger);