x First time here? Check out the FAQ
  • Avatar1175posts3415karma
    admin

    Create member with properties in Umbraco 6.x

    Dan started this topic March 29, 2013 @ 05:06, Go directly to the topic solution

    Hi,

    I've developed membership systems on Umbraco 4.x websites before, using code like this:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    using umbraco.cms.businesslogic.datatype;
    using umbraco.cms.businesslogic.web;
    using umbraco.cms.businesslogic.member;
    using umbraco.cms.businesslogic.property;
    
    namespace DocumentMembership
    {
        public partial class Register : System.Web.UI.UserControl
        {
            protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
            {
                // add member to role
                Roles.AddUserToRole(this.CreateUserWizard1.UserName, "WebsiteUser");
    
                // set member property
                Member member = Member.GetMemberFromLoginName(this.CreateUserWizard1.UserName);
                if (member != null)
                {
                    Property FirstNameProperty = member.getProperty("firstName");
                    if (FirstNameProperty != null)
                    {
                        TextBox FirstNameTextBox = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("FirstName");
                        FirstNameProperty.Value = FirstNameTextBox.Text;
                    }
                    Property SurnameProperty = member.getProperty("surname");
                    if (SurnameProperty != null)
                    {
                        TextBox SurnameTextBox = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Surname");
                        SurnameProperty.Value = SurnameTextBox.Text;
                    }
                    Property EmailProperty = member.getProperty("email");
                    if (EmailProperty != null)
                    {
                        TextBox EmailTextBox = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Email");
                        EmailProperty.Value = EmailTextBox.Text;
                    }
                    // Log user in automatically
                    FormsAuthentication.SetAuthCookie(this.CreateUserWizard1.UserName, true);
                    Response.Redirect("/registration-successful/");
                }
            }
    
        }
    }

    Now I'm trying to do the same (essentially, create a member via a registration form, assign the member to a group and populate a couple of properties on the member type, such as 'firstName' and 'lastName') but on Umbraco 6.0.2.

    In Umbraco 6(.0.2) it seems the umbraco membership methods like 'GetMemberFromLoginName' are obsolete.  So instead I'm using the standard .NET membership provider, so I've created the member like this:

    MembershipUser member = System.Web.Security.Membership.GetUser(this.CreateUserWizard1.UserName);

    However, I'm not sure now how to assign the property values (firstName etc) to this member.  I've Googled and I the examples I've found seem to assume more knowledge than I have.  I've also read the umbraco WIKI article but I'm never quite sure if that stuff is up to date and it actually loses me around the 'creating profiles' part (is a profile just the name for a collection of Umbraco member properties, so I need to create a profile on my Umbraco member and then I can set the properties on this as they are in my Umbraco member type?  Then I also need to add all of the properties from the member type to the web.config file?)

    I know this stuff is probably second nature for a .NET dev, which is why it's largely assumed knowledge, but I'd really appreciate some practical pointers here to help me understand it a little more and help to populate my member with the full set of properties.

    Thanks for any pointers folks!


  • Tom Fulton posted this reply March 29, 2013 @ 05:28

    Hi Dan,

    The way we usually do this is using a ProfileBase class.  See this excellent explanation by Aaron (yes, it's from 2010 but still valid :) ):  http://www.aaron-powell.com/umbraco-members-profiles

    With this setup, we can do things like this after creating the member:

     

    // Save member properties
    var profile = MemberProfile.GetUserProfile(member.UserName);
    profile.FirstName = firstName;
    profile.LastName = lastName;
    profile.ScreenName = username;
    profile.Save();
    Hope this helps,
    Tom 

     


  • Avatar1175posts3415karma
    adminComment with ID: 144989
    Dan posted this reply March 29, 2013 @ 06:02

    Thanks Tom.  Aaron's article seems to be an extended version of the Wiki article, so it gives more background on it, which is useful.  It does seem a bit odd having to delcare member properties in the web.config file, but at least I know that's the right way to do it and having tested just now, it works!

    Thanks


  • Avatar1087posts1553karma
    Comment with ID: 145029
    Charles Afford posted this reply March 30, 2013 @ 09:46

    Hi you dont need to define in the web config and your code. Please see my blog post below. Might be a bit rough. Still finishing it, but should be correct. Charlie :)

    In version 4 of Umbraco the membership model changed from Umbraco's to ASP.net's implementation. Something I have noticed being asked a lot on the Umbraco boards was how to access custom properties against members in code. A lot of the advice pointed towards one of two implementations.  A web config implementation, which meant you have your properties defined in the web config as well as you code or a strongly typed implementation which meant no properties in the web config, but as you will see throws a error in some cases.

     

    For this example we must assume that I have a member in Umbraco with:

     

    User nameuser@yahoo.com

    Custom property name: FirstName

    Custom property alias: firstname

    Type: Textstring

     

    WEB CONFIG IMPLEMENTATION : This means having properties defined in your web config and your code

     

    <!--WEB CONFIG -->

     <profile defaultProvider="UmbracoMemberProfileProvider" enabled="true">

          <providers>

            <clear/>

            <add name="UmbracoMemberProfileProvider" type="umbraco.providers.members.UmbracoProfileProvider, umbraco.providers"/>

          </providers>

          <properties>

         <add name="surname" allowAnonymous ="false" provider="UmbracoMemberProfileProvider" type="System.String" />

            <clear/>

          </properties>

     <!-- END WEB CONFIG -->

     

    Next we simply get or set the property's from or to our profile base within a model or class.

     

    namespace somenamespace

    {

    public someclass : ProfileBase

    {

    public const FIRSTNAME = “firstname”;

     

    //get the current user by their user name (Umbraco member) 

     

    public static someclass METHODNAME()

    {

    return(someclass)Create(Membership.GetUser().UserName);

    }

     

    //pass the current user's user name as a parameter and setup a profile base

     

    public static someclass GetProfile(string username)

    {

    (someclass)Create(userName);

    }

     

    public string Somemethod(some parameters)

    //Assign the value to the profile base

    base[“FIRSTNAME”] = property;

    //Or get the value from the profile base

    property = base["FIRSTNAME"];

    }

    }

    }

     

    //END OF WEB CONFIG IMPLEMENTATION

     

    STRONGLY TYPED IMPLEMENTATION : This means not having properties defined in your web config 

    Another implementation attempted is strongly typed access to the member properties. 

     

    //No properties defined in the web config 

     

    <!--WEB CONFIG -->

     

    <profile defaultProvider="UmbracoMemberProfileProvider" enabled="true" inherits="BSD.PCSG.Configuration.MemberProfile">

          <providers>

            <clear/>

            <add name="UmbracoMemberProfileProvider" type="umbraco.providers.members.UmbracoProfileProvider, umbraco.providers"/>

          </providers>

          <properties>

          </properties>

    </profile>

     

     <!-- END WEB CONFIG -->

    namespace somenamespace

    {

    public someclass : ProfileBase

    {

    public const FIRSTNAME = “firstname”;

     

    //get the current users user name 

    public static someclass METHODNAME()

    {

    return(someclass)Create(Membership.GetUser().UserName);

    }

     

    //pass the current users user name as a parameter and setup a profile base

    public static someclass GetProfile(string username)

    {

    (someclass)Create(usernName);

    }

     

    public string firstname

    {

    get

    {

    base[“FIRSTNAME”] = value

    }

    set

    {

    value = base[“FIRSTNAME”]

    }

    }

    }

    }

     

    Now after much frustration and a lot of help, the conclusion was that Umbraco was doing some sort of case-insensitive match on the property alias.  Thus if you have a property and alias of the same name it thinks there are two values because they have both been changed to lower case. So what you have to do is insure that the alias and name of your property(s) are not identical when they are both made lower case.

     

    In our example we will changed the alias like so:

     

    User nameuser@yahoo.com 

    Custom property name: FirstName

    Custom property alias: _firstname

    Type: Textstring

     

    namespace somenamespace

    public someclass : ProfileBase

    {

    public const FIRSTNAME = “_firstname”;

     

    //get the current users user name 

    public static someclass METHODNAME()

    {

    return(someclass)Create(Membership.GetUser().UserName);

    }

     

    //pass the current users user name as a parameter and setup a profile base

    public static someclass GetProfile(string username)

    {

    (someclass)Create(usernName);

    }

    public string _firstname

    {

    get

    {

    base[“FIRSTNAME”] = value

    }

    set

    {

    value = base[“FIRSTNAME”]

    }

    }

    }

    }

     

    Now you should be have strongly typed access to your custom member properties and no properties needing to be defined in the web config.  

    Thanks for reading, please comment, suggest new topics and correct me if you think there is a better way of doing something

    Charlie :).


Please login or Sign up To post replies