OSO.Register.to.Newsletter 1.0.2
Auteur : Sébastien Fichot
Date de pulication : 28 July 2010
Article consulté 2501 fois

(22 votes)
Avec l'ouverture de la nouvelle plateforme DotNetNuke France, j'ai décidé
d'offrir à la communauté open-source un certain nombre de ressources
(modules, SkinObjects, ...) développés pour l'occasion sous l'espace
de nom OpenSourceObject (OSO).
Je présenterai dans le futur d'autres modules de ce genre (OSO.Captcha.Anything,
OSO.Container.Title, etc.), mais je souhaite commencer par le module OSO.Register.to.Newsletter.
Le module est publié sur CodePlex : http://rtn.codeplex.com/
OSO.Register.to.Newsletter a fait l'objet de la publication d'une première version en mai 2010, date de la sortie du
site. Aujourd'hui, suite aux retours de certains utilisateurs, une nouvelle version a été développée
: 01.00.02. Pour ceux qui ne veulent pas en savoir plus, vous pouvez télécharger
le fichier . Pour les autres, voici le détail
des fonctionnalités.
Le module OSO.Register.to.Newsletter est le module que vous pouvez voir en
bas de cette page, sous la bannière "Restez informé !". Il se compose
d'un texte d'introduction, d'une zone de texte, et d'un bouton "S'inscrire". Le
module est personnalisé pour DotNetNuke France mais c'est bien le module
que vous téléchargez gratuitement.

Ce module fonctionne suivant le processus suivant :
-
L'utilisateur saisi son adresse courriel et clique sur "S'inscrire".
-
L'adresse courriel est validée et affiche un message d'erreur en fonction
des problèmes de validation.
-
L'adresse sert à créer un compte utilisateur DotNetNuke en générant
le login à partir de la partie de l'adresse courriel se situant avant l'arobase.
Par exemple, si je m'inscris avec l'adresse courriel Toto@dnn.com, mon pseudonyme
sera Toto. Dans ce processus, le nom d'utilisateur et l'adresse email sont validés
suivant le processus défini au sein de DotNetNuke (Site > Utilisateurs
> Configuration des utilisateurs).
-
Le nouveau compte utilisateur est ensuite inscrit à la lettre d'information
(enregistrement dans le rôle-groupe "Subscribers"). Si l'utilisateur est déjà
inscrit au site, il est simplement inscrit à la lettre d'information (Si
ce n'est pas déjà fait).
-
En option, l'utilisateur peut ensuite être connecté au site et redirigé
vers une page choisie (par exemple, une page sur laquelle se trouveraient les anciennes
lettres d'information).
Pour parvenir à ses fins, le module se base techniquement sur l'interception
d'un paramètre de requête HTTP au moment du POST réalisé
en Ajax (jQuery.Ajax();), transformant le module en pseudo WebService.
Voici les captures de l'interface de configuration, et différentes vues du
module (version 01.00.02).
Lorsque l'utilisateur est déjà connecté, son adresse courriel
s'affiche par défaut.
L'adresse courriel est validée par expression régulière.
Sans adresse courriel, le module est bien inutile.
Les messages sont transmis par la méthode Ajax
ce qui permet de ne rafraîchir que le module OSO.RtN.
Un autre message produit par le système de validation DotNetNuke.
Encore un autre...
L'auto-activation des utilisateurs peut aller à l'encontre forcée
des paramètres du site.
L'interface de configuration du module.
Le code source du module est assez simple :
View.ascx.vb
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
' Récupère les paramètres de configuration
If CType(Settings("AutoAcceptRActive"), String) <> "" Then
AutoAcceptRActive = CType(Settings("AutoAcceptRActive"), Boolean)
If AutoAcceptRActive Then
If CType(Settings("AutoAcceptR"), String) <> "" Then
AutoAcceptRValue = CType(Settings("AutoAcceptR"), Integer)
End If
End If
End If
' TODO : Forcer l'utilisateur à mettre à jour son profil à la premièere connexion
' CompleteProfil = CType(DotNetNuke.Entities.Modules.UserModuleBase.GetSetting(PortalId, "Security_RequireValidProfileAtLogin"), Boolean)
If CType(Settings("RedirectAnonymousUsers"), String) <> "" Then
RedirectAnonymousUsers = CType(Settings("RedirectAnonymousUsers"), String)
End If
If CType(Settings("RedirectRegisteredUsers"), String) <> "" Then
RedirectRegisteredUsers = CType(Settings("RedirectRegisteredUsers"), String)
End If
If CType(Settings("ConnectAfterSubscription"), String) <> "" Then
ConnectAfterSubscription = CType(Settings("ConnectAfterSubscription"), Boolean)
End If
' Check for DNN Service
If Convert.ToBoolean(Request.Headers("DNN-Register-Service")) Then
' L'appel est lancé par le Javascript
Response.Clear()
' Set headers
Response.ContentType = "application/json"
Response.Charset = "utf-8"
Response.Expires = 0
Try
Dim json = New JavaScriptSerializer()
' Get Page Source
Dim pageSource As String = String.Empty
Using pageSourceStream = New StreamReader(Request.InputStream)
pageSource = pageSourceStream.ReadToEnd()
pageSourceStream.Close()
End Using
' Parse Request as JSON object
Dim args = DirectCast(json.DeserializeObject(pageSource), Dictionary(Of String, Object))
' Call Methods
Select Case Request.Headers("DNN-Register-Service-Method")
Case "Register"
If Me.UserInfo.IsInRole("Registered users") Then
' Registered user
If Not Me.UserInfo.IsInRole("Subscribers") Then
' The user is not already in the subscribers role
Dim objRCtler As New RoleController
Dim objRole As RoleInfo = objRCtler.GetRoleByName(Me.PortalId, "Subscribers")
objRCtler.AddUserRole(Me.PortalId, Me.UserId, objRole.RoleID, Null.NullDate)
DotNetNuke.Services.Mail.Mail.SendMail(Me.UserInfo, Services.Mail.MessageType.ProfileUpdated, Me.PortalSettings)
' Redirige l'utilisateur après inscription
If Me.RedirectRegisteredUsers <> "" Then
' La redirection se fera client-side
Dim texte As String = Localization.GetString("Result_Success_Redirect.Text", Me.LocalResourceFile).Replace("{0}", Me.RedirectRegisteredUsers)
WriteResult(json, texte, True)
Else
WriteResult(json, Localization.GetString("Result_Success.Text", Me.LocalResourceFile), True)
End If
Else
' TODO : Fournir un autre message
' Redirige l'utilisateur après inscription
If Me.RedirectRegisteredUsers <> "" Then
' La redirection se fera client-side
Dim texte As String = Localization.GetString("Result_Success_Redirect.Text", Me.LocalResourceFile).Replace("{0}", Me.RedirectRegisteredUsers)
WriteResult(json, texte, True)
Else
WriteResult(json, Localization.GetString("Result_Success.Text", Me.LocalResourceFile), True)
End If
End If
Else
' New user
Dim strEmail As String = args("email").ToString
Dim strPart As String = strEmail.Split("@")(0)
' Create and hydrate User
Dim objUser As New UserInfo
objUser.Profile.InitialiseProfile(Me.PortalId, True)
objUser.PortalID = Me.PortalId
objUser.DisplayName = strPart
objUser.Email = strEmail
objUser.FirstName = strPart
objUser.LastName = strPart
objUser.Username = strPart
objUser.Membership.CreatedDate = Date.Now
objUser.Membership.Password = DotNetNuke.Entities.Users.UserController.GeneratePassword(9)
objUser.Membership.UpdatePassword = True
If Me.AutoAcceptRActive Then
' Force l'approbation des comptes créés en fonction des moduleSettings
Select Case Me.AutoAcceptRValue
Case 1 'Oui
objUser.Membership.Approved = True
Case 2 'Non
objUser.Membership.Approved = False
End Select
Else
' s'en remet à la config du portail
Select Case PortalSettings.UserRegistration
Case PortalRegistrationType.PublicRegistration
objUser.Membership.Approved = True
Case Else
objUser.Membership.Approved = False
End Select
End If
' Create the user
Dim objAnswer As UserCreateStatus = UserController.CreateUser(objUser)
Dim boNotify As Boolean = False
Select Case objAnswer
Case UserCreateStatus.Success
'Dim objUserCreated As UserInfo = UserController.GetCachedUser(Me.PortalId, objUser.Username)
boNotify = True
' Redirige le nouvel utilisateur après inscription
If Me.RedirectAnonymousUsers <> "" Then
' La redirection se fera client-side
Dim texte As String = Localization.GetString("Result_Success_Redirect.Text", Me.LocalResourceFile).Replace("{0}", Me.RedirectAnonymousUsers)
WriteResult(json, texte, True)
Else
If objUser.Membership.Approved And Me.ConnectAfterSubscription Then
' On ne redirige pas l'utilisateur mais on le connecte, il faut donc rafraîchir la page
Dim texte As String = Localization.GetString("Result_Success_Redirect.Text", Me.LocalResourceFile).Replace("{0}", Me.Request.Url.ToString)
WriteResult(json, texte, True)
Else
WriteResult(json, Localization.GetString("Result_Success.Text", Me.LocalResourceFile), True)
End If
End If
' Connecte l'utilisateur
If objUser.Membership.Approved And Me.ConnectAfterSubscription Then
Dim strHostName As String = System.Net.Dns.GetHostName()
Dim IP As String = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString()
DotNetNuke.Entities.Users.UserController.UserLogin(Me.PortalId, objUser.Username, objUser.Membership.Password, "", Me.PortalSettings.PortalName, IP, UserLoginStatus.LOGIN_SUCCESS, False)
End If
''''''''''''''''' ERRORs '''''''''''''''''
Case UserCreateStatus.DuplicateEmail
' registration error
boNotify = False
WriteResult(json, Localization.GetString("Result_Error_DuplicateEmail.Text", Me.LocalResourceFile), False)
Case UserCreateStatus.DuplicateUserName, UserCreateStatus.UsernameAlreadyExists, UserCreateStatus.UserAlreadyRegistered
' registration error
boNotify = False
WriteResult(json, Localization.GetString("Result_Error_DuplicateUserName.Text", Me.LocalResourceFile), False)
Case Else
' registration error
boNotify = False
WriteResult(json, Localization.GetString("Result_Error.Text", Me.LocalResourceFile), False)
End Select
If boNotify Then
' 'Send Notification to User
Select Case PortalSettings.UserRegistration
Case PortalRegistrationType.NoRegistration
' Do nothing
Case PortalRegistrationType.PrivateRegistration
DotNetNuke.Services.Mail.Mail.SendMail(objUser, Services.Mail.MessageType.UserRegistrationPrivate, Me.PortalSettings)
Case PortalRegistrationType.PublicRegistration
DotNetNuke.Services.Mail.Mail.SendMail(objUser, Services.Mail.MessageType.UserRegistrationPublic, Me.PortalSettings)
Case PortalRegistrationType.VerifiedRegistration
DotNetNuke.Services.Mail.Mail.SendMail(objUser, Services.Mail.MessageType.UserRegistrationVerified, Me.PortalSettings)
End Select
End If
End If ' End New user
End Select
Catch ex As Exception
' Write JSON error
Response.Write(New JavaScriptSerializer().Serialize(New With { _
.Exception = ex.[GetType]().Name, _
.Message = ex.Message, _
.StackTrace = ex.StackTrace _
}))
End Try
Response.End()
Else
' L'appel n'est pas lancé par le Javascript
If Me.UserInfo.IsInRole("Registered users") Then
Me.txtNewsletterEmail.Text = Me.UserInfo.Email
End If
End If
End Sub
Core.js
//////////////////////////////////////////////
///// Opens Jquery
jQuery(document).ready(function () {
//////////////////////////////////////////////
jQuery("a[id$='_View_cmdSubmitNewsletter']").unbind();
jQuery("a[id$='_View_cmdSubmitNewsletter']").click(function () {
jQuery(".emailError").hide();
var hasError = false;
var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
var emailVal = jQuery("input[id$='_View_txtNewsletterEmail']").val();
if (emailVal == '') {
jQuery(".newsletter").prev().after('Oops ! Vous avez oublié de saisir votre adresse courriel !
');
hasError = true;
} else if (!emailReg.test(emailVal)) {
jQuery(".newsletter").prev().after('Oops ! Cette adresse courriel n\'est pas valide !
');
hasError = true;
};
if (hasError == false) {
jQuery(this).hide();
jQuery.ajax({
type: "POST",
url: window.location,
data: "{ 'email':'" + emailVal + "' }",
contentType: "application/json; charset=utf-8",
dataType: "json",
beforeSend: function(xhr) {
xhr.setRequestHeader("DNN-Register-Service", "true");
xhr.setRequestHeader("DNN-Register-Service-Method", "Register");
},
success: function(msg, textStatus, XMLHttpRequest) {
if (msg.Exception == undefined) {
if (msg.status == 'success') {
jQuery(".newsletter").slideUp("normal", function () {
jQuery(".newsletter").before(msg.result);
});
}else{
// msg.status == 'error'
jQuery(".newsletter").slideUp("normal", function () {
jQuery(".newsletter").before(msg.result);
});
};
}
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
jQuery(".newsletter").slideUp("normal", function () {
jQuery(".newsletter").before(textStatus.result);
});
}
});
return false;
}
return false;
});
//////////////////////////////////////////////
///// Closes Jquery
});
//////////////////////////////////////////////
Le module peut être téléchargé .