samedi 31 juillet 2010

DNN : Comment modifier le "username" d'un utilisateur

DNN vous offre les méthodes pour modifier toutes les propriétés d'un utilisateur sauf une : le username. Pour se faire vous êtes donc condamnés à modifier directement en base cette propriété mais attention, celle-ci ne se trouve pas que dans une table.

Voici les tables et les champs devant être impactées pour que la modification de la propriété soit efficace :

  • Table "Users", champ "UserName"
  • Table "aspnet_Users", champ "UserName" ET "LoweredUserName"
Pour être un peu plus complet, voici une petite fonction mettant à jour ces différentes tables :

       Public Sub UpdateUserName(ByVal NewUserName As String, ByVal OldUserName As String)
            Dim oConnexion As SqlConnection = New SqlConnection(_connectionString)
            oConnexion.Open()
            Dim sSQL As String
            sSQL = "update users set username=@NewUserName where username=@OldUserName"
            Dim oCommand As SqlCommand = New SqlCommand(sSQL, oConnexion)
            oCommand.Parameters.AddWithValue("@NewUserName", NewUserName)
            oCommand.Parameters.AddWithValue("@OldUserName", OldUserName)
            oCommand.ExecuteNonQuery()
            sSQL = "update aspnet_Users set username=@NewUserName ,loweredusername=@NewUserName where username=@OldUserName"
            oCommand = New SqlCommand(sSQL, oConnexion)
            oCommand.Parameters.AddWithValue("@NewUserName", NewUserName)
            oCommand.Parameters.AddWithValue("@OldUserName", OldUserName)
            oCommand.ExecuteNonQuery()
            oConnexion.Close()
        End Sub

Vous remarquerez la variable "_connectionString", vous penserez bien à la valoriser et puis vérifiez que votre table "User" n'est pas préfixée (cela est possible si la propriété "objectQualifier" dans votre web.config a été valorisé à l'installation de votre DNN). Le but de cette fonction n'est pas de couvrir tous les besoins mais juste de vous donner une piste.

mardi 20 juillet 2010

SQL Server : Ramener sur une seule ligne les informations provenant de plusieurs lignes

J'avais déjà été confronter à ce petit soucis il y a quelque mois, j'ai dû me replonger dans mes souvenirs pour ressortir la solution à ce problème.

Voici le besoin (ce n'est pas mon besoin, c'est un cas d'école) : je souhaite afficher sur une seule ligne le nom des 10 premiers utilisateurs présent dans ma base. Comment faire cela en une seule requête SQL sans rien de plus ?

Petite précision qui a son importance, je suis sous SQL Server Express 2008, cette syntaxe fonctionne pour la version 2005 mais antérieure à cela... rien n'est moins sûr.

Voici la syntaxe "magique" :

SELECT TOP 10 UserName + ' ' FROM Users FOR XML PATH('')

Et nous voilà donc avec les noms des 10 premiers utilisateurs sur une seule ligne (et une seule colonne) séparés par un espace (attention un espace se trouve à la fin de la ligne).

lundi 19 juillet 2010

Problème d'affichage de texte lors d'un upload d'image dans le module "Text/HTML" (RadEditor) de DNN

Voici un problème auquel j'ai été confronté et pour lequel je n'ai trouvé aucune information sur le net. Deux possibilités pouvant expliquer cela :
  • je n'ai pas utilisé les bons termes de recherche dans google,
  • personne n'a le problème.
Aucun où quelqu'un d'autre tomberait sur ce soucis, en voici les symptômes, lorsque j'édite le contenu d'un module "Text/HTML", j'utilise le composant RadEditor de Telerik. Il se trouve que toutes les fenêtres filles que j'ouvre à partir de ce composant sont sans texte. 

Exemple : La fenêtre permettant d'insérer une image


Aucun texte n'est visible sur les onglets, les boutons,...

Pour remédier à cela il faut placer dans le dossier "Providers\HtmlEditorProviders\Telerik\App_LocalResources" de votre instance DNN les fichiers ressources français de Telerik, en voici la liste :
  • RadEditor.Dialogs.fr-FR.resx
  • RadEditor.Main.fr-FR.resx
  • RadEditor.Modules.fr-FR.resx
  • RadEditor.Tools.fr-FR.resx
Voici le même fenêtre que ci-dessus après avoir rajouté les fichiers listés :



Suite aux différents commentaires échangés sur le sujet, voici un petit rajout : pour que tout fonctionne correctement il faut aussi modifier le fichier "SharedResources.fr-FR.resx" se trouvant dans le répertoire "App_GlobalResources" de DNN. La clef à modifier est "PortalRoot.Text", il faut lui affecter la valeur d'origine qui est "Portal Root". Cette modification est essentielle.

jeudi 15 juillet 2010

Utilisation d'un RadTreeview dans un RadComboBox

Dans le cadre d'un projet sous DNN, j'ai dû utiliser les contrôles Telerik, notemment un RadComboBox contenant un RadTreeview, celui-ci étant chargé dynamiquement. Je me suis trouvé confronté au problème suivant : à la sélection d'un node du treeview, je souhaitais afficher dans la combobox le libellé de l'élément sélectionné.

On trouve sur le site de Telerik (éditeur de ces contrôles) pas mal d'exemples de ce type, la réponse passe par du code javascript exécuté lors du click sur le node, voici un exemple de code à mettre en place :

function nodeClicking(sender, args)
{
var comboBox = $find("RadComboBox1");

var node = args.get_node();

comboBox.set_text(node.get_text());

comboBox.hideDropDown();
}


Comme vous pouvez le constater dans ce script, le nom de la combobox est connu. Mais dans le cas d'une utilisation sous DNN, le problème est légèrement différent.

En effet, nous pouvons trouvez plusieurs modules utilisant ce fonctionnement sur une même page et dans ce cas, le nom de la combobox change bien entendu. Il faut donc procéder autrement. Nous n'utiliserons plus la fonction $find, il faut ici récupérer la combobox parente du treeview à l'origine de l'appel à la fonction nodeClicking. Voilà ce que nous pourrions avoir :


function nodeClicking(sender, args)
{
//Récupération du client Id du treeview à l'origine de l'appel
var treeviewId=sender.get_id();
//Ce Client Id contient le nom de la combobox parente
//On récupère sa position dans le client Id du treeview (ici l'Id serveur de la combobox est "RadComboBox1")
var index=treeviewId.lastIndexOf(""RadComboBox1"");
//Récupération du client Id de la combobox parente, le 12 correspond à la longueur de l'Id serveur de la combobox
var comboBoxId=treeviewId.substring(0,index+12);

//Récupération de l'instance de la combobox
var comboBox = $find(ClientID);

var node = args.get_node();

comboBox.set_text(node.get_text());

comboBox.hideDropDown();
}



Voici les deux liens qui m'ont permis de rédiger ce billet :
http://www.telerik.com/community/forums/aspnet-ajax/treeview/radcombobox-radtreeview-loadondemand.aspx
http://www.telerik.com/community/forums/aspnet-ajax/combobox/access-radtreeview-parent-control.aspx

Visual SourceSafe et Visual Studio 2010

Petit problème auquel je suis confronté aujourd'hui : comment intégrer une application dans Visual SourceSafe à partir de Visual Studio 2010. De prime abord, c'est TFS (Team Foundation Server) qui est utilisé par défaut, cela veut-il dire que SourceSafe n'est plus supporté ?

Du tout, il suffit d'activer la bonne option, la difficulté est là : il faut juste trouver la bonne option. Pour cela, passez par le menu "Outils / Options" et là cochez la case "Afficher tous les paramètres" se trouvant en bas à gauche de l'écran. Vous verrez alors apparaître dans la liste déroulante l'option "Contrôle de code source", placez vous dessus et sélectionnez le plug-in "Microsoft Visual SourceSafe".

A partir de là vous retrouverez le fonctionnement classique de SourceSafe.

dimanche 11 juillet 2010

Récupération du mot de passe d'un utilisateur sous DNN

Ce matin j'avais besoin d'exporter les informations relatives aux utilisateurs présents dans mon portail DNN. Mais je me suis rapidement heurté à un petit soucis (auquel je m'attendais) : la propriété "Password" n'est pas valorisée lorsque je récupère les informations d'un utilisateur.

Voici déjà l'extrait de code me permettant de récupérer les informations de chaque utilisateurs :

Dim oUsers as ArrayList = UserController.GetUsers(0) '0 étant l'Id de mon portail que j'ai mis ici en dur
For Each oUser as UserInfo in oUsers
...
Next

Auparavant j'ai déclaré un "import" sur le namespace "DotNetNuke.Entities.Users".

Alors comment récupérer le mot de passe de chaque utilisateur ? Comme toujours cela n'est pas bien compliqué il faut juste le savoir. Voici le code que j'ai rajouté dans ma boucle :

UserController.GetPassword(oUser, oUser.Membership.PasswordAnswer)

 Cela entraine une valorisation (complémentaire) de la variable "oUser" (qui est passée ici en référence), mais il faut fournir aussi en paramètre la réponse à la question sur le mot de passe. Le mot de passe est alors accessible ainsi : "oUser.Membership.Password".