mercredi 10 septembre 2008

[Sharepoint] Créer un Delegate Control

Ayant eu le besoin de faire un delegate control facilement déployable, j'ai voulu le créer avec VSeWSS.

Mais, il n'y a pas la possibilité d'ajouter un élément delegate control dans le projet.

Je vais donc présenter ici, ce que j'ai fait pour automatiser mon développement, le déploiement sur ma machine et la génération de la WSP. Cette solution me permet aussi d'avoir une prévisualisation de mon UserControl dans VS2008 et surtout, elle me permet d'avoir l'intellisense :p

Tout d'abord, je créé un site web pour créer, visualiser et tester mon userControl.
Ensuite, je créé un projet VSeWSS vide.

image

Ensuite, dans le site web, on ajoute un élément userControl

image

Voilà le code interne au userControl :

[sourcecode language='html']
< %@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
< %@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

< %@ Import Namespace="Microsoft.SharePoint" %>
< %@ Control Language="C#" ClassName="Xtr.Features.WelcomeControl"%>











[/sourcecode]

 Le fichier default.aspx me permet de tester mon contrôle

Dans le projet VSeWSS, voilà l'architecture que j'ai créé (voir le post  sur la gestion de ressources avec VSeWSS):

image

Le fichier copyAscx.bat permet de copier le .ascx du site web dans le répertoire CONTROLTEMPLATES du projet avant la génération du projet.

Voilà le contenu du fichier .bat :

@ECHO OFF
ECHO Copie du fichier ascx ...
xcopy /y "..\Xtr.DelegateControl\*.ascx" .\Templates\CONTROLTEMPLATES\




Et dans les propriétés du projet il faut ajouter les lignes suivantes :

image

Ensuite on ajoute le fichier module.xml avec le code suivant :

[sourcecode language='xml']

< ?xml version="1.0" encoding="utf-8"?>
http://schemas.microsoft.com/sharepoint/">
 


[/sourcecode]

Ensuite, il vous suffit de déployer votre projet sur votre serveur de développement.

 

Pour tester ce UserControl, j'ajoute la ligne suivante à l'intérieur de ma masterpage :





Voilà le résultat obtenu :

image

mercredi 3 septembre 2008

[Pense-bête] Récupérer le contenu d'un fichier via une URL

Voici juste un petit exemple "pense-bête" pour récupérer le contenu d'un fichier dans, par exemple, le dossier LAYOUTS de sharepoint.

Il fonctionne tout aussi bien avec une autre Url.

[sourcecode language='c-sharp']
string template = string.Empty;
 // Creer la request avec l'Url. 
 WebRequest request = WebRequest.Create(new Uri(SPContext.Current.Site.Url + "/_layouts/test/monFichier.htm", UriKind.Absolute));
                // On envoi les credidentials
                request.Credentials = CredentialCache.DefaultCredentials;
                // On récupère la response.
                using (WebResponse response = request.GetResponse())
                {
                    // On verifie le status renvoyé.
                    if (((HttpWebResponse)response).StatusDescription == "OK")
                    {
                          // On recupère le stream renvoyé par le server.
                            Stream dataStream = response.GetResponseStream();
                            //On l'ouvre pour le lire
                            using (StreamReader sr = new StreamReader(dataStream))
                            {
                                //on lit le contenu et on le copie dans template
                                template = sr.ReadToEnd();
                            }
                       }
                    }

[/sourcecode]

Il ne reste plus qu'à travaller avec notre variable "template".

Ce code est assez simple, mais est un bon début pour allez plus loin avec l'utilisation des WebRequest et WebResponse.

Notamment pour l'utilisation des services web de Sharepoint.

[VSeWSS] Inclure des ressources suppl&eacute;mentaires dans une WSP

Les Extensions pour Visual Studio sont très pratique pour le développement de Features, mais la génération de la WSP n'est pas toujours simple.

Dans le post précédent, nous avons que la "Vue WSP" nous permettez des modifier notre fichier manifest.xml.

Mais comment y inclure des ressources supplémentaires?

Et bien les types de projets de VSeWSS suivent l'arborescence du 12, donc il suffit de recréer l'arborescence dans notre projet.

image

Attention, le répetoire TEMPLATE du 12 est appelé "Templates", il ne faut pas le changer, sinon VSeWSS ne reconnait plus le répertoire.

Concernant le fichier FEATURES, il faut le laisser à l'extèrieur du dossier "Templates" sinon, VSeWSS ne considère pas le contenu comme des features.

 

Pour notre exemple, je vais ajouter un fichier html dans le répertoire "LAYOUTS" (je suis parti d'un projet de type webpart existant)

image

Quand on ouvre la "Vue WSP", voilà ce qu'on voit :

image

et les lignes suivantes sont ajoutées au fichier manifest.xml


  

[VS2008] Afficher la vue WSP (VSeWSS 1.2)

Lorsque l'on est dans un projet de type VSeWSS, pour dévelloper une webpart par exemple.

Nous avons souvent besoin d'éditer le fichier manifest.xml.

Or, si l'on modifie celui qu est généré dans le bin/debug, à chaque génération nos modifs disparaissent.

Avec VSeWSS, il y a un affichage qui nous permet de personnaliser notre WSP, c'est la vue WSP.

Pour avoir cette vue,

Menu>Affichage>Autres fenêtres>Affichage WSP

image

[Sharepoint] Cr&eacute;ation d'une Webpart avec VSeWSS

 

Juste un petit tutoriel très simple sur la création d'une Webpart avec VSeWSS 1.2. Il faut donc avoir installé VSeWSS 1.2 ;)

Tout d'abord, ouvrons VS2008 et créons un nouveau projet.

Nous allons donc choisir comme type de projet : Sharepoint et comme modèle : Webpart


image 

Une fois le projet créé, voilà comment il est composé

image
Étape 1 : Analyse de la composition du projet

L'assembly est par défaut signée.

On remarque que le projet est composé d'un dossier Webpart1 qui contient l'ensemble des éléments nécessaire à la création et au déploiement de la Webpart.

Webpart1.cs : Le fichier .cs contient le code .Net de la Webpart

[sourcecode language='c-sharp']

using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace Xtr.Features.ListeBureaux
{
    [Guid("3e6334ce-5973-4ecd-8575-1bf4db962c75")]
    public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart
    {
        public WebPart1()
        {
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            // TODO: add custom rendering code here.
             Label label = new Label();
             label.Text = "Hello World";
             this.Controls.Add(label);
        }
    }
}

[/sourcecode]

Webpart1.xml : Contient les informations sur la feature

[sourcecode language='xml']

< ?xml version="1.0" encoding="utf-8"?>
http://schemas.microsoft.com/sharepoint/" >
 
   
 



[/sourcecode]

 

Webpart1.Webpart : Permet de gérer les informations de la webpart

Elle définie son titre, sa description et le groupe auquel elle appartiendra (après son activation).

[sourcecode language='xml']

< ?xml version="1.0" encoding="utf-8"?>

  http://schemas.microsoft.com/WebPart/v3">
   
     
     
      Cannot import WebPart1 Web Part.
   

   
     
        WebPart1 Web Part
        WebPart1 Description
     

   

 



[/sourcecode]

 
Etape 2 : Configuration

Dans notre cas cette étape est très simple, car il ne s'agit que de configurer notre seveur de développement pour le projet.

Pour se faire, vous devez :

  • ouvrir la page de propriété du projet

  • choisir l'élément "déboguer" dans le menu

  • sélectionner "Démarrer le navigateur avec l'URL"dans la partie "Action de démarrage"

  • saisir l'URL de déploiement de votre environnement de développment


image
Etape 3 : Déploiement du projet

Faites un clic droit sur votre projet et choisissez "Déployer"

image

Cette action va déployer votre webpart sur votre environnement (que vous avez choisi dans l'étape précédente)

Maintenant allons voir sur notre site de Dev si la webpart est bien déployée.
Tout d'abord, allons dans les fonctionnalités du site pour voir si celle-ci apparaît.

image

Elle y est et est même activée.

Ajoutons la sur notre page et voyons le résultat.

image

La webpart est donc fonctionnelle.

 
Etape 4 : Le package de déploiement généré.

Le déploiement de notre projet, génére dans le dossier bin/debug les éléments suivants :

image

Nous avons donc tout ce qu'il nous faut pour déployer la webpart sur d'autres serveurs.

C'est la fin de ce tutoriel qui est finalement très simple.
La création de webpart basique n'est donc pas compliquée.

jeudi 28 août 2008

[Sharepoint] CamlViewer sur Codeplex

En voulant créer des query en CAML, je suis tombé sur un superbe outil développé par Renaud Comte.
Il s'agit du CamlViewer pour SharePoint 2007.





Cet outil permet donc de choisir une liste et d'y récupérer le CAML.
Ce qui peut être très pratique comme base de départ pour créer une Query.

mercredi 27 août 2008

[SharePoint] Créer une Webpart et son EditorPart

Voici un petit tutoriel qui explique simplement comment créer une webpart et son editorpart.


Dans notre cas, nous prendrons comme exemple une visionneuse de pages web.
Son fonctionnement est simple, on lui passe une url dans l'Editorpart et la webpart affiche le site.


Etape 1 : Le projet


  1. Création d'un nouveau projet dans VS 2008. Dans mon cas, j'utilise l'extension VSeWSS 1.2 pour VS2008.

  2. Choisir le projet Sharepoint Webpart


  3. Configurer comme vous les souhaitez les fichiers .xml et .webpart.


Etape 2 : La Webpart


Voici le code permettant l'affichage simpliste de notre IFrame qui permettra à notre webpart de visionner les pages.
Par défaut, votre projet aura créé une classe nommée Webpart1, c'est celle que nous utiliserons pour notre webpart.

public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart, IWebEditable
{

private string m_pageUrl = string.Empty;

//Url passé dans l'editorpart, elle sera renseignée par l'editorpart
[Browsable(false),
Personalizable(PersonalizationScope.Shared)]
public string PageUrl
{
get {return m_pageUrl;}
set {m_pageUrl = value;}
}

Protected override void RenderContents(HtmlTextWriter writer)
{
EnsureChildControls();
RenderIFrame(writer);
}

///
/// Gére l'affichage du IFrame avec la bonne URL
///

///
protected void RenderIFrame(HtmlTextWriter writer)
{
 

string frame = "outputIFrame_" + base.ClientID;
writer.AddStyleAttribute("display", "inline");
writer.AddAttribute(HtmlTextWriterAttribute.Id, frame);
writer.AddAttribute(HtmlTextWriterAttribute.Name, frame);
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%");
writer.AddAttribute("frameBorder", "0");
 




if (!string.IsNullOrEmpty(m_pageUrl))
{
writer.AddAttribute(HtmlTextWriterAttribute.Src, m_pageUrl);
}
writer.RenderBeginTag(HtmlTextWriterTag.Iframe);
writer.RenderEndTag();
}
 

 

 



Etape 3 : L'EditorPart


Nous allons maintenant gérer notre editorpart.


  1. Votre projet>Ajouter>Classe…


  2. Le code pour l'editorpart :


public class Webpart1EditorPart : EditorPart
{

private TextBox txtPageUrl;
protected override void CreateChildControls() {

base.CreateChildControls();
//Affiche la textbox et son label
this.Controls.Add(new
LiteralControl("Url du site :
"
));
txtPageUrl = new TextBox();
this.Controls.Add(txtPageUrl);
}

///
/// Applique les valeurs de l'editor part dans la webpart
///

///
public override bool ApplyChanges() {

 
EnsureChildControls();

 

 
WebPart1 webPart = this.WebPartToEdit as WebPart1;

if (webPart != null) {
webPart.PageUrl = txtPageUrl.Text;
}
return true;
}

///
/// Envoi les valeurs enregistrées de la webpart vers l'editorpart (au moment de l'Edition de la Webpart
///

public override void SyncChanges() {

EnsureChildControls();

WebPart1 webPart = this.WebPartToEdit as WebPart1;



if (webPart != null) {
txtPageUrl.Text = webPart.PageUrl;
}
}
}

 

 

 



Etape 4 : Lier l'EditorPart et la WebPart


Voici ce qu'il faut rajouter à la suite du code dans le fichier Webpart1.cs :

public
override
EditorPartCollection CreateEditorParts(){
List<EditorPart> editorParts = new List<EditorPart>(1);
EditorPart part = new WebPart1EditorPart();
part.ID = this.ID + "_Webpart1EditorPart";
editorParts.Add(part);
EditorPartCollection baseParts = base.CreateEditorParts();
return new EditorPartCollection(baseParts, editorParts);
}
    

 


Il ne vous reste plus qu'à déployer votre webpart sur votre serveur de test.

 

La visionneuse personnalisée de site est terminée ;)