Boite à outils Office

Le nouveau template de Commerce Server 2009 est sortie!

Commerce Server, Installation/Configuration No Comments »

La team Commerce Server vient de mettre à disposition de la communauté un site template pour leur Commerce Site. Vous pouvez télécharger celui-ci à cette adresse: Microsoft Commerce Server 2009 Template Pack (Contemporary Site).

Installation

Que du banal dans cette étape: suivant, suivant, …. terminé!

Configuration générale

image  image  image

image image  image

image

Configuration du module de publicité

image  image  image  image  image  image 

image  image  image

image  image  image

image  image

Exécutez ce script pour associer les droits nécessaires à vos comptes services:

Configuration du canal

Ouvrez le site créer.

image  image  image 

image  image  image

Résultat

That’s it, that’s all, vous voilà avec un magnifique site de e-Commerce sous SharePoint

image

image

5-1-2009 4-00-58 AM

5-1-2009 4-20-01 AM

Configuration / Installation d’un environnement de développement SharePoint / Commerce Server 2009

Commerce Server, Installation/Configuration, Installation/Configuration, Installation/Configuration, SharePoint, SQL Server No Comments »

Dans cet article, je vais vous décrire la procédure à suivre pour installer et configurer votre environnement de développement Commerce Server2009 / SharePoint 2007.

Architecture physique et logicielle

Pour commencer, j’ai mis en place une « mini » architecture afin de séparer mon active directory de mon server front end. J’ai donc deux boites avec :

  • Commerce Server 2007 Enterprise (Attention, la version développeur n’est pas supportée par Commerce Server 2009 pour le moment)
  • Commerce Server 2009

      Utilisateurs

      Concernant l’installation du contrôleur de domaine, il ne sert à rien d’en faire un focus particulier car il y a suffisamment d’articles de qualité traitant de ce sujet. Pour ma part, j’aime travailler avec un AD sur une deuxième machine virtuelle sous Windows 2008 Core. Si vous voulez pousser un peu sur ce sujet, je vous conseille cette excellente ressource sur la configuration de la version core de Windows 2008 : Server Core Installation Option of Windows Server 2008 Step-By-Step Guide

    • Compte utilisateur à créer pour SharePoint

      MOSSfarm (Exécute le service SharePoint – doit être administrateur de la ferme)

      MOSSRunTimeUser (Application Pool pour l’application SharePoint)

      MOSSsspPool (Application Pool pour le Shared Service Provider)

      MOSSsearchService (Exécute le service de recherche de MOSS)

      WSSsearchService (Exécute le service de recherche de WSS)

      WSScontentAccess (Récupère le contenu en dehors de la ferme)

      MOSSsspService (Execute le Shared Services Provider (SSP))

      MOSSprofile (Récupère les profils dans l’AD)

      MOSSsspMySite (Exécute le SSP My Site)

      Compte utilisateur à créer pour SQL Server

      SQLservice (Exécute les services SQL)

      Compte utilisateur à créer pour Commerce Server

      CatalogWebSvc (Application Pool pour le web service catalogue)

      CSDMSvc (Exécute le service Direct Mailer)

      CSHealthMonitorSvc (Execute le service Health Monitor)

      CSStageSvc (Execute le service de Staging)

      CSStagingUser (Utilisateur du staging)

      MarketingWebSvc (Application pool pour le web service marketing)

      OrdersWebSvc (Application pool pour le web service commande)

      ProfilesWebSvc (Application pool pour le web service profil)

      SQL Server 2008

      Pour commencer, vérifiez que tous les composants requis sont bien installés. Pour cela, il vous suffit de cliquer sur l’outil de vérification :

      image  image

    • Une fois les prés requis validés, vous pouvez lancer l’installation :

      image  image  image  image  image  image

      Read the rest of this entry »

    • Un CMS sous MOSS accessible? Yes, we can!

      Réalisation, SharePoint No Comments »

      Durant les 6 derniers mois de l’année 2008, j’ai travaillé sur un projet internet de gestion de contenu sous MOSS 20O7 ECM pour l’équivalent de la sécurité sociale Irlandaise: Department of Social and Family Affair. La grande ambition et le principal challenge de ce projet était d’avoir le site complètement accessible pour les non/mal voyant ou les déficients visuels comme il est convenu de les appeler maintenant.

      En effet, pour ceux ayant déjà travaillé sur ce type de sujet, la grande problématique est essentiellement dû au moteur de rendu par défaut de SharePoint qui n’est absolument pas W3C/WCAG 1.0 AA compliant.

      La première partie de mon travail, à d’abord été d’analyser les différentes solutions du marché qui peuvent permettre de rendre notre site sous MOSS accessible. Autant le dire tout de suite, il n’y a pas grand chose à se mettre sous la dent:

      La solution d’HiSoftware à travers son Accessibility Kit (gratuit) ne répondait en rien à notre problème. Il ne proposait que quelques controls adapter mais rien de vraiment conséquent (ou alors il fallait payer très cher). Quant à SPWorks, la solution a été rejeté par le client qui n’était pas persuadé de la fiabilité de cet outil. A tord me semble t’il, car le framework Alternative Rendering Framework for SharePoint (ARF) semble très puissant et simple à utiliser (il est par exemple utilisé sur la solution CKS:Enhanced Blog Edition). A mon avis, cette solution souffre surtout de ne pas être adossé à un gros éditeur. D’ailleurs, je serais curieux de connaître les retours d’expérience de cette solution. Je n’ai pas trouvé beaucoup de ressources à ce sujet.

      De ce fait, je suis donc parti sur une solution customisée complète. Pour des raisons de confidentialités, je ne peux pas vous soumettre les éléments de ma feature mais je peux vous expliquer en gros ce que j’y ai mis:

      • Des controls adapter pour modifier les web part zones et autres web part container;
      • Master pages et page layouts complètement refaite sur la base du template fournis par notre web designer Open Interface (que je recommande pour leur expertise très poussée de l’accessibilité ainsi que leur gentillesse);
      • Réécriture de certaines web part ou controls SharePoint;
      • Pour l’éditeur de texte, j’ai utilisé le RAD control de Telerik;

      Résultat des efforts, un site XHTML:

      image

      Et une belle récompense du gouvernement Irlandais avec un “eGovernment Award for accessible website”:

      image  image image

      Filtrer et récupérer des éléments d’une liste grâce à Linq et les méthodes d’extensions

      Développement, SharePoint No Comments »

      – UPDATE —

      J’ai changé ma méthode pour récupérer directement une valeur dans ma liste de configuration. Je faisais un query qui me retournais une collection que je filtrais ensuite pour récupérer ma valeur. Alors qu’il suffisait simplement de le faire directement dans mon query Nerd

      – UPDATE —

      Dans mes applications SharePoint, j’utilise très souvent une liste ou je stocke l’ensemble de mes éléments de configuration comme par exemple :

      • Email sender pour mes workflows
      • Sujet d’un email
      • Corps d’un email
      • Url d’un WebService
      • Et bien d’autres choses encore…

      Le gros avantage est que le webmaster du site peut facilement (à ses risques et périls tout de même Nerd) mettre à jour les informations et ceci sans reset de l’application pool ou redémarrage de l’appli web sous IIS dans le cas par exemple de variables stockées dans le web.config.

      La structure de ma liste est toute simple :

      • Key (le champ title de base renommé);
      • Value (la valeur à retourner) de type « Multiline of text » en mode Plain Text;
      • Category, un champ de type « Choice » qui me permet de regrouper mes informations. Par exemple, sur une page, il peut m’arriver d’avoir à récupérer plusieurs valeurs de configuration. Ce regroupement, me permet de les récupérer via un seul CAML Query. Ceci m’évitant donc de faire un query pour chaque élément.

      image 

      J’avais donc implémenté une classe qui me permettait de récupérer ces valeurs via un CAML query sur ma liste. Mais suite à un article posté par sur les , j’ai décidé de refaire cette classe en utilisant ces et les nombreuses autres du framework .Net.

      Pour commencer, j’ai étendu l’objet pour accéder à notre Liste de configuration (dans mon cas, j’ai aussi besoin d’un paramètre « Category » pour me retourner l’ensemble des valeurs car je ne souhaite pas faire une requête pour chaque entrée). Cette méthode, me retourne une interface générique de type Generic Interface . Cette interface, va me permettre ensuite de récupérer très facilement une entrée de ma configuration :

      public static ILookup<String, String> ConfigurationList(this SPWeb spWeb, String Category)
      {
          SPList spListConfiguration;
          ILookup<String, String> configurationEntries = null;
          // La liste n'est pas accessible aux end users.
          // On doit donc s'y connecter sur le compte admin pour y accéder
          // Optionnel, si vous avez décidé de mettre la liste en lecture pour tout vos utilisateurs
          SPSecurity.RunWithElevatedPrivileges(delegate()
          {
              using (SPSite mySite = new SPSite(spWeb.Site.ID))
              {
                  using (SPWeb myWeb = mySite.OpenWeb(spWeb.ID))
                  {

      Je récupère ma liste « Configuration » grâce à la méthode d’extension de :

      if (myWeb.Lists.TryGet("Configuration", out spListConfiguration))
      {

      J’exécute ensuite mon query pour récupérer mes éléments :

          SPQuery spQuery = new SPQuery();
          spQuery.Query = String.Format(<Where><Eq><FieldRef Name='Category' /><Value Type='Choice'>{0}</Value></Eq></Where>", Category);

      Et je stock les résultats dans un document XML Linq () :

      XDocument xml = XDocument.Parse(spListConfiguration.GetItems(spQuery).Xml);

      Je définie mon pour me simplifier la lecture du code :

      XNamespace z = "#RowsetSchema";

      Je renvoie tout ce flux dans mon interface générique en lui spécifiant :

      • Ma clé : key => key.Key;
      • Ma valeur à retourner: element => element.Value;
      • Mon comparateur d’égalité : EqualityComparer<String>.Default (ici comme je travaille sur des Strings je n’ai pas besoin d’en définir de particulier, mais si vous souhaitez le personnaliser, il vous suffit d’écrire une classe qui implémente Generic Interface . Je donne un exemple à la fin de ce post pour implémenter une version qui ne prend pas en compte la casse de la clé) ;
      configurationEntries = (from xmlItems in xml.Descendants(z + "row").ToArray()
          select new ConfigurationEntry { Key = (String)xmlItems.Attribute("ows_Title"), Value = (String)xmlItems.Attribute("ows_Value") })
          .ToLookup(key => key.Key, element => element.Value, EqualityComparer<String>.Default);
              });
          }
      onfigurationEntries;
      }

      J’utile cette classe pour stocker ma clé ainsi que la valeur associée dans mon query Linq :

      public class ConfigurationEntry
      {
          public String Key;
          public String Value;
      }

      Ensuite, il ne me reste plus qu’a écrire la classe qui va me rechercher mon élément dans ma collection (on peut ici choisir de lui donner un objet SPWeb ou d’utiliser le context)

      public sealed class Configuration
      {
          private ILookup<String, String> configurationValues;
          
          public Configuration(SPWeb spWeb, String category)
          {
              if (spWeb == null)
                  throw new ArgumentNullException("A SPWeb object cannot be null");
              if (String.IsNullOrEmpty(category))
                  throw new ArgumentNullException("A category cannot be empty");
      
              configurationValues = spWeb.ConfigurationList(category);
          }
      
          public Configuration(String category)
          {
              if (SPContext.Current == null)
                  throw new ArgumentNullException("SPContext cannot be null. Please ensure that you're running a SharePoint application");
              if (String.IsNullOrEmpty(category))
                  throw new ArgumentNullException("A category cannot be empty");
      
              configurationValues = SPContext.Current.Web.ConfigurationList(category);
          }
      
          public String GetEntry(String key)
          {
              return Convert.ToString(configurationValues[key].FirstOrDefault());
          }
      }

      Notez l’utilisation du générique , qui nous permet ici de nous retourner un String.Empty s’il n’y a pas de valeur à retourner.

      Ensuite, pour l’appel, c’est très simple. Instanciez un objet Configuration et utilisez la méthode GetEntry pour récupérer vos valeurs:

      Configuration configValues = new Configuration(spWeb,"SSRS");
      Console.WriteLine("SSRS URL:" + configValues.GetEntry("SSRSUrl"));
      Console.WriteLine("SSRS Path:" + configValues.GetEntry("SSRSPath"));
      Console.WriteLine("SSRS WebPartPage:" + configValues.GetEntry("SSRSWebPartPage"));

      image

      On peut aussi ajouter une variante à notre méthode d’extension ConfigurationList pour récupérer directement la valeur d’une clé dans notre liste :

      public static String ConfigurationList(this SPWeb spWeb, String Category, String Key) { SPList spListConfiguration; String returnValue = String.Empty; SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite mySite = new SPSite(spWeb.Site.ID)) { using (SPWeb myWeb = mySite.OpenWeb(spWeb.ID)) { if (myWeb.Lists.TryGet("Configuration", out spListConfiguration)) { // Modification du 25 juin 2008
      // J'ai pas fais attention en publiant mon post que cette méthode était stupide
      // En effet, j'utilisais un query qui me retournais une collection que je filtrais ensuite pour retourner ma valeur
      // Alors que je pouvais faire cela dans un seul CAML Query smile_nerd
      SPQuery spQuery = new SPQuery(); spQuery.Query = String.Format("<Where><And><Eq><FieldRef Name='Title' /><Value Type='Text'>{0}</Value></Eq><Eq><FieldRef Name='Category' /><Value Type='Choice'>{1}</Value></Eq></And></Where>", Key, Category); SPListItemCollection items = spListConfiguration.GetItems(spQuery); if (items != null && items.Count > 0) returnValue = Convert.ToString(items[0]["Value"]);

      // SPQuery spQuery = new SPQuery();
      // spQuery.Query = String.Format("<Where><Eq><FieldRef Name='Category' /><Value Type='Choice'>{0}</Value></Eq></Where>", Category);
      // XDocument xml = XDocument.Parse(spListConfiguration.GetItems(spQuery).Xml);
      // XNamespace z = "#RowsetSchema";
      // configurationEntries = (from xmlItems in xml.Descendants(z + "row")
      // select new ConfigurationEntry { Key = (String)xmlItems.Attribute("ows_Title"), Value = (String)xmlItems.Attribute("ows_Value") })
      // .ToLookup(key => key.Key, element => element.Value, EqualityComparer<String>.Default);
      // returnValue Convert.ToString(configurationEntries[Key].FirstOrDefault());

      } } } }); return returnValue; }

      La récupération de votre valeur se faisant comme ceci:

      Console.WriteLine("SSRS Url:" + spWeb.ConfigurationList("SSRS", "SSRSURL"));

      image

      Comme promis, voici ici un exemple de classe qui vous permet de comparer 2 Strings sans distinction de la casse :

      public class StringNoCaseSensitive : IEqualityComparer<String>
      {
          public Boolean Equals(String val1, String val2)
          {
              return (val1.ToLower() == val2.ToLower());
          }
          public int GetHashCode(string obj)
          {
              return obj.ToLower().GetHashCode();
          }
      }

      Dans l’appel du ILookup,remplacer EqualityComparer<String>.Default par new StringNoCaseSensitive() et le tour est joué…

      Mettre à jour le web.config de SharePoint

      Développement, SharePoint No Comments »

      MISE A JOUR DU 06 JUIN 2008
      Pour contourner ce problème, il suffit en fait d’ajouter l’attribut id sur votre tag d’action:

      <add path="configuration/system.web" id="{45C74BC1-DBA5-489f-A6E9-6932C25F1D97}">
          <xhtmlConformance mode="Strict" />
      </add>

      Ceci évitant la recréation multiple de vos actions. Grand merci à pour cet éclaircissement. Comme quoi la communauté SharePoint est plus forte que le SDK Eye-rolling

      ——————————-

      BILLET ORIGINAL

      Je reprend ici un post de , au sujet de .

      Je ne connaissais pas ce système de mise à jour via un flux xml. J’utilisais pour ce genre de déploiement le modèle objet et son .

      Intéressé par son post, j’ai donc essayé de le mettre en place sur un de mes projets.

      J’ai donc ajouté dans un fichier xml (déployé par ma feature dans le répertoire config du 12) cette ligne:

      <add path="configuration/system.web">
          <xhtmlConformance mode="Strict" />
      </add>

      Pour déployer ce fichier dans votre web.config, il vous faut exécuter la commande :

      stsadm -o copyappbincontent

      Lors de la toute première commande tout marche parfaitement bien, mon noeud est bien ajouté là ou je le voulais.

      <system.web>
          ....
          <xhtmlConformance mode="Strict" />
      </system.web>

      Le problème de cette commande add est qu’elle ne vérifie pas la présence du noeud à ajouter. Ce qui fais que si vous exécutez une nouvelle fois la commande stsadm -o copyappbincontent, ce noeud est ajouté une deuxième fois. Et dans le cas précis de cet exemple, cela fais planter mon application web car le noeud xhtmlConformance doit être unique.

      image

      Pour remédier à cela, j’ai simplement ajouté une commande remove juste avant la commande add:

      <remove path="configuration/system.web/xhtmlConformance" />

      Pour info, la valeur de path est une fonction xpath, vous pouvez donc allez chercher l’élément à supprimer même si les noeuds fils ont le même nom.

      <remove path="configuration/system.web/httpModules/add[@name='Session']" />
      <add path="configuration/system.web/httpModules">
          <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      </add>

      ps: Attention pour les fermes, le stipule bien que cette commande doit être exécutée sur chaque serveur de la ferme.

      Ajouter une langue non localisée dans la liste des variations d’un site de publication MOSS

      Installation/Configuration, SharePoint, WCM No Comments »

      Comme vous le savez, toutes les langues ne possèdent pas encore de localisation propre. Ces langues sont souvent celles dite « minoritaire » comme le sont le flamand, le catalan, le gaélique, le basque, etc… Microsoft, prend toutefois soin à en répertorier le maximum et de créer pour ces langues un (pour en avoir une liste : http://www.microsoft.com/globaldev/reference/lcid-all.mspx) en attendant de leur offrir une vrai « » (vous pouvez en trouver une liste ici : http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx) et donc le pour SharePoint (les langues disponibles sont ici: http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=36ee1bf0-652c-4e38-b247-f29b3eefa048) qui vous permettra de voir votre SharePoint « parler » flamand Smile.

      Dans mon cas « client », je dois réaliser un site internet public Irlandais basé sur MOSS. Comme vous ne le savez peut-être pas, mais ici en Irlande, tout site public doit être disponible en gaélique et en anglais. Bien qu’il existe une culture pour l’Irlande qui est « En-Ie » (et un LCID 6153), celle-ci ne fait que « gérer » du formatage comme pour le calendrier (jj/mm/aaaa) ou la devise (€) basé sur la langue anglaise. Donc, comme vu un peu plus haut, le gaélique ne possède pas de « culture » (au sens informatique du terme bien sur ^^) et donc encore moins de module linguistique. Ce qui fait donc, qu’il n’est pas « possible » de le trouver par défaut dans la liste des variations disponibles. Pour y remédier, il vous suffit:

      • d’ajouter dans le fichier xml : RGNLSTNG.XML (qui se trouve ici: C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\1033\XML) et d’ajouter une nouvelle ligne au nœud Locales.

      image

      • d’éditer ce fichier xml : RGNLDFLT.XML (qui se trouve ici : C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG) et d’ajouter une nouvelle ligne au nœud LangIDDefaults.

      clip_image002

      N’oubliez pas le IISRESET pour prendre en compte votre modification et constater le résultat :

      clip_image004

      Attention: si votre langue ne possède pas sa propre ressource, MOSS ne pourra pas vous rediriger par défaut sur celle-ci. En effet, la redirection ce base sur le .

      MOSS ROBOTS meta tag

      Développement, SharePoint No Comments »

      Je suis en train de travailler sur un site internet sous MOSS et j’ai pas mal de travail à faire sur le rendu d’une page MOSS, qui n’est absolument pas accessible.

      Avant de commencer un projet (aussi bien en développement qu’en conseil), j’aime toujours relire les guidances ou autres proof of concepts, afin d’être certains de choisir la bonne solution. Cela me prend souvent beaucoup de temps, mais je pense qu’en prenant soin de lire ce que les autres acteurs on pu faire, on gagne un temps précieux à ne pas commettre les mêmes erreurs. Donc pour en revenir au sujet, je lisais ce qu’il se faisait en termes de modification du rendu de control SharePoint. Ce que j’ai constaté, c’est qu’en majorité, la plupart des articles propose de réécrire son propre custom control afin d’être sur de bien maitriser le rendu. Dans un de ses excellents articles, (je vous recommande la lecture de son blog, qui est une véritable mine d’or) proposait de changer le rendu du tag « RobotsMetaTag » par un custom control : . Ma question a été, pourquoi ne pas utiliser à la place un control adapter ? Cette solution me paraissait plus « propre », car l’on continue à se baser sur le contrôle de base. Stefan a eu la gentillesse de me répondre et d’approuver ma solution Nerd. Il en a profité par la-même pour écrire un poste à ce sujet : .

      Grouper les SPItems renvoyés par SPQuery via une requête linq

      Développement, SharePoint No Comments »

      Auparavant, lorsque je voulais regrouper mes valeurs issues d’un query sur une liste. Je devais faire tout un tas de manipulations, comme :
      -fonction xpath : pour regrouper mes items
      -sur le regroupement faire des calculs si nécessaire
      En effet, le ou l’utilisation d’une vue () avec un regroupement, renvoi a chaque fois l’ensemble des éléments de la liste. Grâce à , on peut maintenant récupérer et regrouper très facilement  nos résultats. Comme par exemple, ici je souhaitais avoir une liste unique de catégories présentent dans ma liste :

      // Ma liste
      SPList spList = null;
      try { spList = SPContext.Current.Site.RootWeb.Lists["MaListe"]; }
      catch { }
      
      // si null, exception
      if (spList == null) throw new NullReferenceException("La liste  n'existe pas");
      
      // Recuperation du nom interne de la colonne
      if (!spList.Fields.ContainsField("Categorie")) throw new NullReferenceException("La colonne categorie n'existe pas");
      String categoryColumnName = spList.Fields["Categorie"].InternalName;
      
      // Recuperation des categories distinctes triees
      SPQuery spQuery = new SPQuery();
      spQuery.Query = String.Format("<OrderBy><FieldRef Name='{0}' /></OrderBy>", categoryColumnName);
      
      // Chargement du Xml
      XDocument xml = XDocument.Parse(spList.GetItems(spQuery).Xml);
      
      // Ajout du namesplace pour recuperer mes valeurs
      XNamespace z = "#RowsetSchema";
      
      // IMPORTANT: n'oubliez pas de typer votre regroupement
      var groupedCategories = from allcategories in xml.Descendants(z + "row")
           group allcategories by (string)allcategories.Attribute("ows_Categorie") into distinctCategories
           select distinctCategories;
      
      // Ensuite il nous suffit de recuperer le resultat
      // Ici en l'ajoutant a un control de type Checkbox list
      foreach (var cat in groupedCategories)
      {
           this.cblCategories.Items.Add(new ListItem((string)cat.Key));
      }

      Simple non?

      WP Theme & Icons by N.Design Studio
      Entries RSS Comments RSS Log in
      Creative Commons License