Connexion



Register
Forgot Password ?

Inscription

L'inscription à DotNetNuke France est entièrement gratuite et vous permet de profiter pleinement des outils mis à votre disposition. L'inscription ne donne néanmoins pas le statut d'adhérent à l'association.

  • Discutez sur le forum et suivez son activité
  • Répondez aux articles
  • Soutenez l'association
  • Téléchargez les traductions

 

DotNetNuke France

Association francophone

OSO.Register.to.Newsletter 1.0.2

Auteur : Sébastien Fichot

Date de pulication : 28 July 2010

Classement : Développement, Module à découvrir

Article consulté 2501 fois Article Rating (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 en cliquant sur ce lien. 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 :

  1. L'utilisateur saisi son adresse courriel et clique sur "S'inscrire".
  2. L'adresse courriel est validée et affiche un message d'erreur en fonction des problèmes de validation.
  3. 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).
  4. 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).
  5. 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é en cliquant sur ce lien.


 

Notez cet article !

DotNetNuke c'est ...

  • Facile à utiliser
  • Open Source et gratuit
  • 100% personnalisable
  • Des milliers d'extensions
  • Multilingue
  • Multi-site
  • Maintenu par une communauté d'experts
  • Sécurisé

Restez informé !

Inscrivez vous pour recevoir notre lettre d'information.

x

Restez connecté !

Le fichier que vous téléchargez sera probablement mis à jour très bientôt.

Inscrivez vous
et nous vous informerons des mises à jour