From 49637e62febd58b8578a28593cfa40b7482c2f50 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Wed, 28 Aug 2013 17:52:06 +0200 Subject: [PATCH] Updated, more robust versions of the Member template/snippets --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 + .../PartialViews/Templates/EditProfile.cshtml | 52 +++++++++++++++ .../PartialViews/Templates/Login.cshtml | 1 + .../PartialViews/Templates/LoginStatus.cshtml | 1 + .../Templates/RegisterMember.cshtml | 25 +++++--- .../Controllers/LoginStatusController.cs | 10 ++- .../Controllers/ProfileController.cs | 50 +++++++++++++++ .../Controllers/RegisterController.cs | 13 +++- src/Umbraco.Web/Models/LoginStatusModel.cs | 12 ++-- src/Umbraco.Web/Models/ProfileModel.cs | 64 +++++++++++++++++++ src/Umbraco.Web/Models/RegisterModel.cs | 60 ++++++++--------- src/Umbraco.Web/Umbraco.Web.csproj | 3 + src/Umbraco.Web/UmbracoProperty.cs | 9 +++ 13 files changed, 254 insertions(+), 47 deletions(-) create mode 100644 src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/EditProfile.cshtml create mode 100644 src/Umbraco.Web/Controllers/ProfileController.cs create mode 100644 src/Umbraco.Web/Models/ProfileModel.cs create mode 100644 src/Umbraco.Web/UmbracoProperty.cs diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 3a7efed60c..c39964e6da 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -2138,6 +2138,7 @@ + diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/EditProfile.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/EditProfile.cshtml new file mode 100644 index 0000000000..27457c2f7e --- /dev/null +++ b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/EditProfile.cshtml @@ -0,0 +1,52 @@ +@inherits Umbraco.Web.Macros.PartialViewMacroPage + +@using System.Web.Mvc.Html +@using ClientDependency.Core.Mvc +@using umbraco.cms.businesslogic.member +@using Umbraco.Web +@using Umbraco.Web.Models +@using Umbraco.Web.Controllers + +@{ + var profileModel = new ProfileModel(); + + Html.EnableClientValidation(); + Html.EnableUnobtrusiveJavaScript(); + Html.RequiresJs("/umbraco_client/ui/jquery.js"); + Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js"); + Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js"); +} + +@if (Member.IsLoggedOn()) +{ + @Html.RenderJsHere() + + using (Html.BeginUmbracoForm("HandleUpdateProfile")) + { +
+ Edit profile + + @Html.LabelFor(m => profileModel.Name) + @Html.TextBoxFor(m => profileModel.Name) + @Html.ValidationMessageFor(m => profileModel.Name) +
+ + @Html.LabelFor(m => profileModel.Email) + @Html.TextBoxFor(m => profileModel.Email) + @Html.ValidationMessageFor(m => profileModel.Email) +
+ + @for (var i = 0; i < profileModel.MemberProperties.Count; i++) + { + @Html.LabelFor(m => profileModel.MemberProperties[i].Value, profileModel.MemberProperties[i].Name) + @Html.EditorFor(m => profileModel.MemberProperties[i].Value) + @Html.HiddenFor(m => profileModel.MemberProperties[i].Alias) +
+ } + + @Html.HiddenFor(m => profileModel.MemberTypeAlias) + + +
+ } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/Login.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/Login.cshtml index 62b9632ad5..5eb4529001 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/Login.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/Login.cshtml @@ -2,6 +2,7 @@ @using System.Web.Mvc.Html @using ClientDependency.Core.Mvc +@using Umbraco.Web @using Umbraco.Web.Models @using Umbraco.Web.Controllers diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/LoginStatus.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/LoginStatus.cshtml index 72d63e2857..d889c67391 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/LoginStatus.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/LoginStatus.cshtml @@ -1,5 +1,6 @@ @inherits Umbraco.Web.Macros.PartialViewMacroPage @using ClientDependency.Core.Mvc +@using Umbraco.Web @using Umbraco.Web.Models @using Umbraco.Web.Controllers diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/RegisterMember.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/RegisterMember.cshtml index 2c94c04acc..6574c56690 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/RegisterMember.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViews/Templates/RegisterMember.cshtml @@ -2,13 +2,13 @@ @using System.Web.Mvc.Html @using ClientDependency.Core.Mvc +@using Umbraco.Web @using Umbraco.Web.Models @using Umbraco.Web.Controllers @{ var registerModel = new RegisterModel(); - registerModel.FillModel(registerModel, Model.MacroParameters); - + Html.EnableClientValidation(); Html.EnableUnobtrusiveJavaScript(); Html.RequiresJs("/umbraco_client/ui/jquery.js"); @@ -23,6 +23,11 @@
Register Member + @Html.LabelFor(m => registerModel.Name) + @Html.TextBoxFor(m => registerModel.Name) + @Html.ValidationMessageFor(m => registerModel.Name) +
+ @Html.LabelFor(m => registerModel.Email) @Html.TextBoxFor(m => registerModel.Email) @Html.ValidationMessageFor(m => registerModel.Email) @@ -33,14 +38,16 @@ @Html.ValidationMessageFor(m => registerModel.Password)
- @for (var i = 0; i < registerModel.MemberProperties.Count; i++) - { - @Html.LabelFor(m => registerModel.MemberProperties[i].Value, registerModel.MemberProperties[i].Name) - @Html.EditorFor(m => registerModel.MemberProperties[i].Value) - @Html.HiddenFor(m => registerModel.MemberProperties[i].Alias) -
+ @if (registerModel.MemberProperties != null) { + for (var i = 0; i < registerModel.MemberProperties.Count; i++) + { + @Html.LabelFor(m => registerModel.MemberProperties[i].Value, registerModel.MemberProperties[i].Name) + @Html.EditorFor(m => registerModel.MemberProperties[i].Value) + @Html.HiddenFor(m => registerModel.MemberProperties[i].Alias) +
+ } } - + @Html.HiddenFor(m => registerModel.MemberTypeAlias) diff --git a/src/Umbraco.Web/Controllers/LoginStatusController.cs b/src/Umbraco.Web/Controllers/LoginStatusController.cs index 428348f9bb..4dbe5836db 100644 --- a/src/Umbraco.Web/Controllers/LoginStatusController.cs +++ b/src/Umbraco.Web/Controllers/LoginStatusController.cs @@ -16,9 +16,13 @@ namespace Umbraco.Web.Controllers { if (Member.IsLoggedOn()) { - var memberId = Member.CurrentMemberId(); - Member.RemoveMemberFromCache(memberId); - Member.ClearMemberFromClient(memberId); + var member = Member.GetCurrentMember(); + if (member != null) + { + var memberId = member.Id; + Member.RemoveMemberFromCache(memberId); + Member.ClearMemberFromClient(memberId); + } } return Redirect("/"); diff --git a/src/Umbraco.Web/Controllers/ProfileController.cs b/src/Umbraco.Web/Controllers/ProfileController.cs new file mode 100644 index 0000000000..cfa2d387ca --- /dev/null +++ b/src/Umbraco.Web/Controllers/ProfileController.cs @@ -0,0 +1,50 @@ +using System.Linq; +using System.Web.Mvc; +using System.Xml; +using umbraco.cms.businesslogic.member; +using Umbraco.Web.Models; +using Umbraco.Web.Mvc; + +namespace Umbraco.Web.Controllers +{ + public class ProfileController : SurfaceController + { + [HttpPost] + public ActionResult HandleUpdateProfile([Bind(Prefix="profileModel")]ProfileModel model) + { + //TODO: Use new Member API + if (ModelState.IsValid) + { + var member = Member.GetCurrentMember(); + if (member != null) + { + if (model.Name != null) + { + member.Text = model.Name; + } + + member.Email = model.Email; + member.LoginName = model.Email; + + if (model.MemberProperties != null) + { + foreach (var property in model.MemberProperties.Where(p => p.Value != null)) + { + member.getProperty(property.Alias).Value = property.Value; + } + } + + member.Save(); + + member.XmlGenerate(new XmlDocument()); + + Member.AddMemberToCache(member); + + Response.Redirect("/"); + } + } + + return CurrentUmbracoPage(); + } + } +} diff --git a/src/Umbraco.Web/Controllers/RegisterController.cs b/src/Umbraco.Web/Controllers/RegisterController.cs index 402a88b1b9..ef9c8d9e03 100644 --- a/src/Umbraco.Web/Controllers/RegisterController.cs +++ b/src/Umbraco.Web/Controllers/RegisterController.cs @@ -21,13 +21,22 @@ namespace Umbraco.Web.Controllers var mt = MemberType.GetByAlias(model.MemberTypeAlias) ?? MemberType.MakeNew(user, model.MemberTypeAlias); var member = Member.MakeNew(model.Email, mt, user); + + if (model.Name != null) + { + member.Text = model.Name; + } + member.Email = model.Email; member.LoginName = model.Email; member.Password = model.Password; - foreach (var property in model.MemberProperties) + if (model.MemberProperties != null) { - member.getProperty(property.Alias).Value = property.Value; + foreach (var property in model.MemberProperties.Where(p => p.Value != null)) + { + member.getProperty(property.Alias).Value = property.Value; + } } member.Save(); diff --git a/src/Umbraco.Web/Models/LoginStatusModel.cs b/src/Umbraco.Web/Models/LoginStatusModel.cs index 853d265c5e..9be7602541 100644 --- a/src/Umbraco.Web/Models/LoginStatusModel.cs +++ b/src/Umbraco.Web/Models/LoginStatusModel.cs @@ -9,10 +9,14 @@ namespace Umbraco.Web.Models //TODO Use new Member API if (Member.IsLoggedOn()) { - this.Name = Member.GetCurrentMember().Text; - this.Username = Member.GetCurrentMember().LoginName; - this.Email = Member.GetCurrentMember().Email; - this.IsLoggedIn = true; + var member = Member.GetCurrentMember(); + if (member != null) + { + this.Name = member.Text; + this.Username = member.LoginName; + this.Email = member.Email; + this.IsLoggedIn = true; + } } } diff --git a/src/Umbraco.Web/Models/ProfileModel.cs b/src/Umbraco.Web/Models/ProfileModel.cs new file mode 100644 index 0000000000..437a53972c --- /dev/null +++ b/src/Umbraco.Web/Models/ProfileModel.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using umbraco.cms.businesslogic.member; + +namespace Umbraco.Web.Models +{ + public class ProfileModel + { + public ProfileModel() + { + if (Member.IsLoggedOn()) + { + //TODO Use new Member API + var member = Member.GetCurrentMember(); + if (member != null) + { + this.Name = member.Text; + + this.Email = member.Email; + + this.MemberProperties = new List(); + + var memberType = MemberType.GetByAlias(member.ContentType.Alias); + var memberTypeProperties = memberType.PropertyTypes.ToList(); + + if (memberTypeProperties.Where(memberType.MemberCanEdit).Any()) + { + memberTypeProperties = memberTypeProperties.Where(memberType.MemberCanEdit).ToList(); + } + + foreach (var prop in memberTypeProperties) + { + + var value = string.Empty; + var propValue = member.getProperty(prop.Alias); + if (propValue != null) + { + value = propValue.Value.ToString(); + } + + this.MemberProperties.Add(new UmbracoProperty + { + Alias = prop.Alias, + Name = prop.Name, + Value = value + }); + } + } + } + } + + [Required] + [RegularExpression(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", + ErrorMessage = "Please enter a valid e-mail address")] + public string Email { get; set; } + + public string Name { get; set; } + + public string MemberTypeAlias { get; set; } + + public List MemberProperties { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/RegisterModel.cs b/src/Umbraco.Web/Models/RegisterModel.cs index 276170bb6f..be3c314ebe 100644 --- a/src/Umbraco.Web/Models/RegisterModel.cs +++ b/src/Umbraco.Web/Models/RegisterModel.cs @@ -2,12 +2,40 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using umbraco.cms.businesslogic.member; -using Umbraco.Core; namespace Umbraco.Web.Models { public class RegisterModel { + public RegisterModel() + { + this.MemberTypeAlias = "UmbracoMember"; + + var memberType = MemberType.GetByAlias(this.MemberTypeAlias); + + if (memberType != null) + { + this.MemberProperties = new List(); + + var memberTypeProperties = memberType.PropertyTypes.ToList(); + + if (memberTypeProperties.Where(memberType.MemberCanEdit).Any()) + { + memberTypeProperties = memberTypeProperties.Where(memberType.MemberCanEdit).ToList(); + } + + foreach (var prop in memberTypeProperties) + { + this.MemberProperties.Add(new UmbracoProperty + { + Alias = prop.Alias, + Name = prop.Name, + Value = string.Empty + }); + } + } + } + [Required] [RegularExpression(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", ErrorMessage = "Please enter a valid e-mail address")] @@ -16,36 +44,10 @@ namespace Umbraco.Web.Models [Required] public string Password { get; set; } + public string Name { get; set; } + public string MemberTypeAlias { get; set; } public List MemberProperties { get; set; } - - public void FillModel(RegisterModel registerModel, IDictionary macroParameters) - { - registerModel.MemberTypeAlias = macroParameters.GetValueAsString("memberTypeAlias", "UmbracoMember"); - - registerModel.MemberProperties = new List(); - - var memberType = MemberType.GetByAlias(registerModel.MemberTypeAlias); - - var memberTypeProperties = memberType.PropertyTypes.ToList(); - - if (memberTypeProperties.Where(memberType.MemberCanEdit).Any()) - { - memberTypeProperties = memberTypeProperties.Where(memberType.MemberCanEdit).ToList(); - } - - foreach (var prop in memberTypeProperties) - { - registerModel.MemberProperties.Add(new UmbracoProperty { Alias = prop.Alias, Name = prop.Name, Value = string.Empty }); - } - } - } - - public class UmbracoProperty - { - public string Alias { get; set; } - public string Value { get; set; } - public string Name { get; set; } } } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 486ec8cad1..b0fab44ff0 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -291,10 +291,12 @@ + + @@ -398,6 +400,7 @@ ASPXCodeBehind + diff --git a/src/Umbraco.Web/UmbracoProperty.cs b/src/Umbraco.Web/UmbracoProperty.cs new file mode 100644 index 0000000000..4e7f17953e --- /dev/null +++ b/src/Umbraco.Web/UmbracoProperty.cs @@ -0,0 +1,9 @@ +namespace Umbraco.Web +{ + public class UmbracoProperty + { + public string Alias { get; set; } + public string Value { get; set; } + public string Name { get; set; } + } +}