Jump to:

17452 Posts in 4473 Topics by 1971 members

Archive

SilverStripe Forums » Archive » Extending ForumRole.php for more registration fields

Our old forums are still available as a read-only archive.

Moderators: martimiz, Sean, biapar, Willr, Ingo, simon_w

Page: 1
Go to End
Author Topic: 10957 Views
  • Josh
    Avatar
    SilverStripe Developer
    65 Posts

    Extending ForumRole.php for more registration fields Link to this post

    Hey!

    Still getting my head around SS code but slowly getting there.

    I am trying to add a couple more fields the user registration process but the following script just makes the registration go blank.

    (I haven't modified the CMS fields part yet, but this should still work?)

    <?php

    /**
    * ForumRole
    *
    * This decorator adds the needed fields and methods to the {@link Member}
    * object.
    */
    class ForumRole extends DataObjectDecorator {

       /**
        * Edit the given query object to support queries for this extension
        */
       function augmentSQL(SQLQuery &$query) {}

       /**
        * Update the database schema as required by this extension
        */
       function augmentDatabase() {
          $exist = DB::query( "SHOW TABLES LIKE 'ForumMember'" )->numRecords();
          if( $exist > 0 ) {
             DB::query( "UPDATE `Member`, `ForumMember` " .
                "SET `Member`.`ClassName` = 'Member'," .
                "`Member`.`ForumRank` = `ForumMember`.`ForumRank`," .
                "`Member`.`Occupation` = `ForumMember`.`Occupation`," .
                "`Member`.`Country` = `ForumMember`.`Country`," .
                "`Member`.`Nickname` = `ForumMember`.`Nickname`," .
                "`Member`.`FirstNamePublic` = `ForumMember`.`FirstNamePublic`," .
                "`Member`.`SurnamePublic` = `ForumMember`.`SurnamePublic`," .
                "`Member`.`OccupationPublic` = `ForumMember`.`OccupationPublic`," .
                "`Member`.`CountryPublic` = `ForumMember`.`CountryPublic`," .
                "`Member`.`EmailPublic` = `ForumMember`.`EmailPublic`," .
                "`Member`.`AvatarID` = `ForumMember`.`AvatarID`," .
                "`Member`.`LastViewed` = `ForumMember`.`LastViewed`" .
                "WHERE `Member`.`ID` = `ForumMember`.`ID`"
             );
             echo("<div style=\"padding:5px; color:white; background-color:blue;\">The data transfer has succeeded. However, to complete it, you must delete the ForumMember table. To do this, execute the query \"DROP TABLE 'ForumMember'\".</div>" );
          }
       }

       /**
        * Define extra database fields
        *
        * Return an map where the keys are db, has_one, etc, and the values are
        * additional fields/relations to be defined
        */
       function extraDBFields() {
          return array(
             'db' => array(
                'ForumRank' => 'Varchar',
                'Occupation' => 'Varchar',
                'Country' => 'Varchar',
                'Nickname' => 'Varchar',
                'DateOfBirth' => 'Varchar',
                'MobilePhone' => 'Varchar',
                'HomePhone' => 'Varchar',
                'Address' => 'Varchar',
                'Suburb' => 'Varchar',
                'City' => 'Varchar',
                'FirstNamePublic' => 'Boolean',
                'SurnamePublic' => 'Boolean',
                'EmailPublic' => 'Boolean',
                'LastViewed' => 'SSDatetime'
             ),
             'has_one' => array(
                'Avatar' => 'Image'
             ),
             'defaults' => array(
                'ForumRank' => 'Community Member'
             )
          );
       }

       function FirstNamePublic() {
          return $this->owner->FirstNamePublic || Permission::check('ADMIN');
       }
       function SurnamePublic() {
          return $this->owner->SurnamePublic || Permission::check('ADMIN');
       }
       function OccupationPublic() {
          return $this->owner->OccupationPublic || Permission::check('ADMIN');
       }
       function CountryPublic() {
          return $this->owner->CountryPublic || Permission::check('ADMIN');
       }
       function EmailPublic() {
          return $this->owner->EmailPublic || Permission::check('ADMIN');
       }

       function NumPosts() {
          if(is_numeric($this->owner->ID)) {
             return (int)DB::query("SELECT count(*) FROM Post WHERE AuthorID = '" .
                                              $this->owner->ID . "'")->value();
          } else {
             return 0;
          }
       }

       function Link() {
          return "ForumMemberProfile/show/" . $this->owner->ID;
       }

       /**
        * Get the fields needed by the forum module
        *
        * @param bool $addMode If set to TRUE, the E-mail field will be editable,
        * otherwise it will be read-only
        * @param bool $showIdentityURL Should a field for an OpenID or an i-name
        * be shown (always read-only)?
        * @return FieldSet Returns a FieldSet containing all needed fields for
        * the registration of new users
        */
       function getForumFields($addMode = false, $showIdentityURL = false) {
          $fieldset = new FqieldSet(
             new HeaderField("Personal Details"),

             new LiteralField("Blurb","<p id=\"helpful\">Tick the fields to show in public profile</p>"),

             new CheckableOption("UnnecessaryNicknamePublic", new TextField("Nickname", "Nickname"), true, true),
             new CheckableOption("FirstNamePublic", new TextField("FirstName", "First name")),
             new CheckableOption("SurnamePublic", new TextField("Surname", "Surname")),
             new CheckableOption("DateOfBirthPublic", new TextField("DateOfBirth", "Date Of Birth")),
             new CheckableOption("SurnamePublic", new TextField("Surname", "Surname")),
             new CheckableOption("MobilePhonePublic", new TextField("MobilePhone", "Mobile Phone")),
             new CheckableOption("HomePhonePublic", new TextField("HomePhone", "Home Phone")),
             new CheckableOption("AddressPublic", new TextField("Address", "Address")),
             new CheckableOption("SuburbPublic", new TextField("Suburb", "Suburb")),
             new CheckableOption("CityPublic", new TextField("City", "City")),

             new HeaderField("User Details"),
             new CheckableOption("EmailPublic", ($addMode)
                ? new EmailField("Email", "Email")
                : new ReadonlyField("Email", "Email")),
             new PasswordField("Password", "Password") ,
             new PasswordField("ConfirmPassword", "Confirm Password"),
             new SimpleImageField("Avatar", "Upload avatar"),
             new ReadonlyField("ForumRank", "User rating")
          );

          if($showIdentityURL) {
             $fieldset->insertBefore(new ReadonlyField('IdentityURL', 'OpenID/i-name'),
                                                 'Password');
             $fieldset->insertAfter(new LiteralField('PasswordOptionalMessage',
                '<p>Since you provided an OpenID respectively an i-name the ' .
                   'password is optional. If you enter one, you will be able to ' .
                   'log in also with your e-mail address.</p>'),
                'IdentityURL');
          }

          return $fieldset;
       }

       function updateCMSFields(FieldSet &$fields) {
          if(Permission::checkMember($this->owner->ID, "ACCESS_FORUM")) {
             $fields->insertBefore(new TextField("Nickname", "Nickname"), "FirstName");
             $fields->insertAfter(new TextField("Occupation", "Occupation"), "Surname");
             if(!$fields->fieldByName('Country')) $fields->insertAfter(new CountryDropdownField("Country", "Country"), "Occupation");

             $fields->insertAfter(new PasswordField("ConfirmPassword", "Confirm Password"), "Password");
             $fields->push(new ImageField("Avatar", "Upload avatar"));
             $fields->push(new DropdownField("ForumRank", "User rating", array(
                "Community Member" => "Community Member",
                "Administrator" => "Administrator",
                "Moderator" => "Moderator",
                "SilverStripe User" => "SilverStripe User",
                "SilverStripe Developer" => "SilverStripe Developer",
                "Core Development Team" => "Core Development Team",
                "Google Summer of Code Hacker"   => "Google Summer of Code Hacker",
                "Lead Developer" => "Lead Developer"
             )));
          }
       }

       /**
        * Can the current user edit the given member?
        *
        * @return true if this member can be edited, false otherwise
        */
       function canEdit() {
          if($this->owner->ID == Member::currentUserID()) return true;

          if($member = Member::currentUser()) return $member->can('AdminCMS');

          return false;
       }

       /**
        * Used in preference to the Nickname field on templates
        *
        * Provides a default for the nickname field (first name, or "Anonymous
        * User" if that's not set)
        */
       function Nickname() {
          if($this->owner->Nickname) return $this->owner->Nickname;
          else if($this->owner->FirstName) return $this->owner->FirstName;
          else return "Anonymous user";
       }
    }

    /**
    * ForumRole_Validator
    *
    * This class is used to validate the new fields added by the
    * {@link ForumRole} decorator in the CMS backend.
    */
    class ForumRole_Validator extends Extension {

       /**
        * Client-side validation code
        *
        * @param string $js The javascript validation code
        * @return string Returns the needed javascript code for client-side
        * validation.
        */
       function updateJavascript(&$js, &$form) {

          $formID = $form->FormName();
          $passwordFieldName = $form->dataFieldByName('Password')->id();
          $passwordConfirmFieldName =
             $form->dataFieldByName('ConfirmPassword')->id();

          $passwordcheck = <<<JS
    Behaviour.register({
       "#$formID": {
          validatePasswordConfirmation: function() {
             var passEl = _CURRENT_FORM.elements['Password'];
             var confEl = _CURRENT_FORM.elements['ConfirmPassword'];

             if(passEl.value == confEl.value) {
              clearErrorMessage(confEl.parentNode);
                return true;
             } else {
                validationError(confEl, "Passwords don't match.", "error");
                return false;
             }
          },
          initialize: function() {
             var passEl = $('$passwordFieldName');
             var confEl = $('$passwordConfirmFieldName');

             confEl.value = passEl.value;
          }
       }
    });
    JS;
          Requirements::customScript($passwordcheck,
                                                  'func_validatePasswordConfirmation');

          $js .= "\$('$formID').validatePasswordConfirmation();";
          return $js;
       }
    }

    /**
    * Email template for topic notifications
    */
    class ForumMember_TopicNotification extends Email_Template {
       // TODO Figure out why '$Nickname <$Email>' doesn't work for protected $to
       protected
          $to = '$Email',
          $subject = 'New reply to \'$Title\'',
          $ss_template = 'ForumMember_TopicNotification';

       /**
        * This only exists because you can't do
        * "protected $from = Email::getAdminEmail()" with PHP
        */
       function __construct() {
          $this->setFrom(Email::getAdminEmail());

          parent::__construct();
       }
    }

    ?>

  • dio5
    Avatar
    Community Member
    501 Posts

    Re: Extending ForumRole.php for more registration fields Link to this post

    Wow.. this is hard to read here..

    maybe you can try to paste your code on

    http://pastie.caboo.se/ or http://pastebin.com/

    and link to it from here, might give you a higher chance of getting an answer

  • Josh
    Avatar
    SilverStripe Developer
    65 Posts

    Re: Extending ForumRole.php for more registration fields Link to this post

    Cheers dude,

    Done

    http://pastebin.com/m48a0cad9

    Thanks!

    10957 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.