.comment-link {margin-left:.6em;}

zerosept

jeudi, septembre 30, 2004

Variable session utilisateur

Ajouté la procédure Utils.SessionUser qui initialise un certain nombre de variables sessions liées à l'utilisateur connecté :

  • UserId : identifiant de l'utilisateur (son login)
  • UserName : nom
  • UserEmail : adresse mél

Ces variables sont initialisées uniquement quand :

  • Context.Request.IsAuthenticated est vrai : ce qui signifie que l'utilisateur est bien identifié,
  • Session["UserId"] est différent de Context.User.Identity.Name : pour faire l'initialisation une fois pour toute.

Lorsque Context.Request.IsAuthenticated est faux, ces variables sessions sont supprimés.

Cette procédure est appelée automatiquement par default.aspx.cs de façon à ce que les données soient disponibles et à jour pour toutes les briques.

Par ailleurs, cette procédure met à jour la propriété Uzer.lastLogin permettant de connaitre la date de la dernière connection de l'utilisateur (cf User.Login).

Perte des rôles

Modification de Uzer.Save() de façon à ne pas sauvegarder les rôles de l'utilisateur quand ils n'ont pas été modifié ou lus.

Auparavant, le fait de redemander son mot de passe faisait disparaitre la liste des rôles auxquel l'utilisateur appartenait car Uzer.Save() les ré-enregistrait alors qu'il n'avait pas été lus.

mercredi, septembre 29, 2004

Problème mot de passe oublié

La boite de dialogue pour faire saisir l'adresse mél dans le cas où l'on a oublié son mot de passe ne fonctionne pas lorsque l'écran contient également un module Feedback avec des champs obligatoires. Ceux-ci n'étant bien évidemment pas renseignés, le clic sur le bouton [Mot de passe] provoque l'apparition des messages d'erreurs de validation du module Feedback.

Solution en deux temps dans Login.ascx.*:

  • définir que le bouton btnReminder ne déclenche pas la validation (CauseValidation = "False"),
  • supprimer le test «if (Page.IsValid == true)» dans la procédure btnReminder_Click.

Ca marche dans la mesure où le seul test de validité pour la perte de mot de passe se fait côté serveur.

Erreurs de mails

Modifié Utils.sendMail pour gérer le cas où le serveur SMTP n'est pas configuré dans le Web.config et afficher un message plus approprié. Et idem si jamais l'expéditeur ou le destinataire n'est pas défini.

Modifié editUsers.ascx.cs pour éviter un plantage en création d'utilisateur quand le fichier /uploads/newaccount.txt n'existe pas. Renvoie désormais un message d'erreur explicite.

Modifié login.ascx.cs pour ne pas afficher le lien "Mot de passe perdu" quand le fichier /uploads/sendpassword.txt n'existe pas. Et ajouté gestion des erreurs quand quand les paramètres mailSmtp ou mailFrom ne sont pas définis.

vendredi, septembre 24, 2004

Migration de Integration.Documents

Terminé le passage de Basics.Documents vers Integration.Documents et ajour du module pour paramétrer la gestion des documents.

1° paramètre : possibilité de saisir une liste de valeurs séparées par un point-virgule

2° paramètre : mode de publication

  • Uploader sur le serveur web
  • Partager via le réseau local
  • Uniquement uploader
  • Uniquement partager

Et donc modification de /Integration/Documents/editDocuments.ascx.* pour tenir compte du fait que le champ catégorie peut être une zone de texte ou une liste déroulante.

Graphiques en PHP / SWF

A voir. En fait tout le boulot est fait par le fichier Flash et la partie PHP ne fait que 4 ko. http://www.maani.us/charts/index.php Màj: Sur le même principe, il existe aussi zxXhart en shareware.

jeudi, septembre 23, 2004

Création de la brique Integration.TextPart

Permet d'afficher le contenu d'un simple fichier texte. Brique inspirée de HtmlPart, mais avec un encodage du contenu du fichier de façon à ce que le code html ne soit pas interprété. Deux paramètres :

  • source du fichier à incorporer (doit être sur le serveur web mais pas contrôlé)
  • drapeau pour cacher le module quand le fichier est vide

Création de la brique Integration.HtmlPart

Permet d'incorporer un fragment de code html à partir d'un fichier placé sur le serveur. Peut servir dans les cas suivants :

  • affichage d'un code html trop compliqué pour l'éditeur wysiwyg
  • affichage d'un code html généré par un programme externe et transféré par ftp
  • ...
Deux paramètres :
  • source du fichier à incorporer (doit être sur le serveur web mais pas contrôlé)
  • drapeau pour cacher le module quand le fichier est vide (cas d'un bloc html servant à afficher une alerte temporaire)
Evolutions possibles :
  • utiliser la boite de dialogue "Insérer un document" de l'éditeur wysiwyg pour définir la source du fichier
  • permettre des fichiers hors du serveur web (utilisation de WebRequest)
  • fonctionner avec un simple <!--#include file="filename.html"--> ?

Création de la toolbox Integration

Cette toolbox regroupera des briques permettant de présenter des données en provenance de source externe au portail. Par conséquent, elle va plutôt être destinée à être employée dans le cadre d'un intranet.

Exemples de briques qui pourraient en faire partie :

  • IFrame (ou laisser dans Basics)
  • Documents
  • FileDir (comme Documents mais basé sur contenu réel d'un répertoire => màj par ftp)
  • Xml
  • FeedReader
  • SqlReader (affiche le résultat d'une requête SQL sous forme de <table>
  • AspControl (comme ComponentModule de Rainbow)
  • AspInclude (pour inclure un fragment de code html)
  • Citrix
  • SvgChart (?)
  • UserTable (?)

Créer une nouvelle Brick en C#

Ce document explique comment créer une nouvelle Brick à l'intérieur d'une Toolbox. Une brique est le code ASP.NET qui servira à créer des modules dans portal. L'exemple qui suit montre de façon détaillée comment ajouter une brique Contacts à la toolbox Exemples.

  1. Lancer Visual Studio 2003 et ouvrir la solution portal.
  2. Créer un dossier pour la brique
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur le projet "inPortal.Exemples" et choisir Ajouter - Nouveau dossier
    • cliquer sur le dossier "NewFolder1" qui vient d'être créé et le renommer en "Contacts"
  3. Créer le contrôle utilisateur pour l'affichage
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur le dossier "Contacts" du projet "inPortal.Exemples"
    • choisir Ajouter - Ajouter un contrôle utilisateur Web
    • donner "ViewContacts.ascx" comme nom et valider
    • sélectionner le contrôle utilisateur créé et choisir Afficher le code
    • repérer la définition de la classe et remplacer "System.Web.UI.UserControl" par "inPortal.Core.ModuleControl" de façon à obtenir la ligne de code suivante : "public class ViewContacts : inPortal.Core.ModuleControl"
  4. Créer le contrôle utilisateur pour le paramétrage
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur le dossier "Contacts" du projet "inPortal.Exemples"
    • choisir Ajouter - Ajouter un contrôle utilisateur Web
    • donner "EditContacts.ascx" comme nom et valider
    • sélectionner le contrôle utilisateur créé et choisir Afficher le code
    • repérer la définition de la classe et remplacer "System.Web.UI.UserControl" par "inPortal.Core.ModuleControl" de façon à obtenir la ligne de code suivante : "public class EditContacts : inPortal.Core.ModuleControl"
  5. Créer la classe pour gérer l'objet Contacts
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur le dossier "Contacts" du projet "inPortal.Exemples"
    • choisir Ajouter - Ajouter une classe
    • donner "Contacts.cs" comme nom et valider
  6. Générer la solution
    • dans la barre de menu, cliquer sur Générer - Générer la solution (Ctrl+Maj+B)
    • le résultat doit être de la forme "Génération : 9 a réussi, 0 a échoué, 0 a été ignoré"

Créer une nouvelle Toolbox en C#

Ce document explique comment créer une nouvelle Toolbox sous forme de Private Assembly. Une Toolbox regroupe logiquement plusieurs briques dans une même Private Assembly et physiquement les sous-répertoires relatifs à chacune de ces briques dans un même répertoire. L'exemple qui suit montre de façon détaillée comment créer la Toolbox Exemples. Plus tard, nous verrons comment ajouter des briques à l'intérieur de celle-ci.

  1. Lancer Visual Studio 2003 et ouvrir la solution portal.
  2. Créér le projet correspondant à la Private Assembly
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur la solution "portal" et choisir Ajouter - Nouveau Projet
    • dans la boite de dialogue sélectionner le type de projet "Projet Visual C#" et le modèle "Projet Web Vide"
    • définir l'emplacement à http://localhost/inportal/Exemples et valider en cliquant sur OK
  3. Renommer le projet
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur le projet qui vient d'être créé (Animation dans le cas présent) et choisir Renommer puis indiquer "inPortal.Exemples"
    • cliquer à nouveau avec le bouton droit sur le projet et choisir Propriétés
    • dans la boite de dialogue, sélectionner Propriété communes - Général
    • définir Nom de l'assembly à "inPortal.Exemples"
    • définir Espace de noms par défaut à "inPortal.Exemples"
  4. Ajouter des références
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur le dossier "Références" du projet "inPortal.Exemples" et choisir Ajouter une référence
    • cliquer sur l'onglet "Projets"
    • sélectionner "inPortal" et valider
  5. Référencer le projet
    • dans l'explorateur de solutions, cliquer avec le bouton droit sur le dossier "Références" du projet "inPortal.Framework" et choisir Ajouter une référence
    • cliquer sur l'onglet "Projets"
    • sélectionner "inPortal.Exemples" et valider
  6. Générer la solution
    • dans la barre de menu, cliquer sur Générer - Générer la solution (Ctrl+Maj+B)
    • le résultat doit être de la forme "Génération : 9 a réussi, 0 a échoué, 0 a été ignoré"

Meta Robots

Modifié /Default.aspx.cs de façon à insérer automatiquement une balise <meta name="robots" content="noindex,nofollow"> lorsque la page n'est pas une page "publique".

Liste des cas où la balise n'est pas générée :

  • une page de consultation pour laquelle viewRoles contient "All Users"
  • une page de modification pour laquelle editRoles contient "All Users"

Ainsi, si une page "privée" est liée depuis une page "publique", elle ne sera pas indexée dans Google.

Référence : Ce que je préfère chez MSN par rapport à Google

Utils.applicationPath

Modifié la propriété applicationPath de la classe Utils de façon à gérer le problème apparu suite au passage en mode Private Assemblies.

Utils.applicationPath d'une page aspx de portal.Toolbox renvoyait «http://localhost/portal/Toolbox/» alors qu'auparavant, une page aspx du répertoire «/portal/Toolbox/» renvoyait «http://localhost/portal/».

Désormais, si le fichier Utils.applicationPath/Default.aspx n'existe pas, le dernier sous-répertoire est supprimé du chemin avant d'être renvoyé.

Par ailleurs, une fois qu'elle a été définie, la valeur de la propriété applicationPath est conservée dans la variable Session["applicationPath"] pour éviter de passer son temps à tester l'existence de Default.aspx.

mercredi, septembre 22, 2004

Modules.configRoles

Ajouté le champ configRoles à la table Modules pour gérer les droits concernant le paramétrage du module suite à la mise en oeuvre de configSource.

  • /Core/Components/Modules.cs : ajout de la propriété configRoles à la classe Module
  • /Core/Components/Modules.cs : prise en compte du champ configRoles dans la classe ModulesDB
  • /Core/Pages/editModules.ascx.* : gestion du champ configRoles
  • /Core/Setup/maj_Portal.sql : modification script création table Modules
  • /Core/Setup/maj_Temp.sql : instructions pour màj de la table Modules
  • mise à jour manuelle du contenu de la table Modules

Bricks.configSource

Ajouté le champ configSource à la table Bricks pour définir l'url du contrôle .ascx à utiliser pour paramétrer le module. Dans le cas du module Documents par exemple, cela permet d'avoir à la fois un contrôle pour la modification du contenu (ajout, modification et suppression d'un document) et un autre pour le paramétrage (définir la liste des catégories possible, le mode de publication par défaut...).

  • /Core/Components/Bricks.cs : ajout de la propriété configSource à la classe Brick
  • /Core/Components/Bricks.cs : prise en compte du champ configSource dans la classe BricksDB
  • /Core/Pages/editBricks.ascx.* : gestion du champ configSource
  • /Core/Setup/maj_Portal.sql : modification script création table Bricks
  • /Core/Setup/maj_Temp.sql : instructions pour màj de la table Bricks
  • mise à jour manuelle du contenu de la table Bricks

Bricks.cacheTime

Ajouté le champ cacheTime à la table Bricks afin de paramétrer la durée du cache (en secondes) par défaut pour une brique donné.

  • /Core/Components/Bricks.cs : ajout de la propriété cacheTime à la classe Brick
  • /Core/Components/Bricks.cs : prise en compte du champs cacheTime dans la classe BricksDB
  • /Core/Pages/editBrick.ascx.* : gestion du champ cacheTime
  • /Core/Pages/editModules.ascx.cs : initialise Module.cacheTime à Brick.cacheTime lorsque l'utilisateur n'a pas saisi de durée de cache (en création comme en modification)

<body> Styling

Ajouté la macro IdScreen() pour permettre de faire apparaitre l'identifiant de l'écran dans la page HTML.

A utiliser par exemple dans <body id="<%= IdScreen() %>"> pour paramétrer les styles CSS en fonction de l'écran en cours.

Référence : Crafting Lightweight Page Templates with CSS.

Users.lastLogin

Ajout du champ lastLogin à la table Users pour enregistrer la date de dernière connexion de l'utilisateur. Cela facilitera le ménage dans les comptes inutilisés.

  • /Core/Components/Utils.cs : ajout de la propriété lastLogin à la classe Uzer
  • /Core/Components/Utils.cs : prise en compte du champ lastLogin dans la classe UsersDB
  • /Core/Users/listUsers.ascx.cs : ajouté l'information lastLogin à la liste des utilisateurs
  • /Core/Users/editUser.ascx.cs : initialisation de lastLogin = 01/01/2000 lors de la création d'un nouveau compte utilisateur
  • /Core/Setup/maj_Portal.sql : modification script création table Users
  • /Core/Setup/maj_Temp.sql : instructions pour màj de la table Users

Note: il reste à faire la mise à jour de lastLogin lorsque l'utilisateur se connecte, y compris dans le cas où il avait coché "Connexion automatique" (fait le 30 septembre).