ForumRole::OccupationPublic()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 2
eloc 2
nc 2
nop 0
1
<?php
2
/**
3
 * ForumRole
4
 *
5
 * This decorator adds the needed fields and methods to the {@link Member}
6
 * object.
7
 *
8
 * @package forum
9
 */
10
class ForumRole extends DataExtension
11
{
12
13
    /**
14
     * Edit the given query object to support queries for this extension
15
     */
16
    public function augmentSQL(SQLQuery &$query)
17
    {
18
    }
19
20
21
    /**
22
     * Update the database schema as required by this extension
23
     */
24
    public function augmentDatabase()
25
    {
26
        $exist = DB::tableList();
0 ignored issues
show
Deprecated Code introduced by
The method DB::tableList() has been deprecated with message: since version 4.0 Use DB::table_list instead

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
27
        if (!empty($exist) && array_search('ForumMember', $exist) !== false) {
28
            DB::query("UPDATE \"Member\", \"ForumMember\" " .
29
                "SET \"Member\".\"ClassName\" = 'Member'," .
30
                "\"Member\".\"ForumRank\" = \"ForumMember\".\"ForumRank\"," .
31
                "\"Member\".\"Occupation\" = \"ForumMember\".\"Occupation\"," .
32
                "\"Member\".\"Country\" = \"ForumMember\".\"Country\"," .
33
                "\"Member\".\"Nickname\" = \"ForumMember\".\"Nickname\"," .
34
                "\"Member\".\"FirstNamePublic\" = \"ForumMember\".\"FirstNamePublic\"," .
35
                "\"Member\".\"SurnamePublic\" = \"ForumMember\".\"SurnamePublic\"," .
36
                "\"Member\".\"OccupationPublic\" = \"ForumMember\".\"OccupationPublic\"," .
37
                "\"Member\".\"CountryPublic\" = \"ForumMember\".\"CountryPublic\"," .
38
                "\"Member\".\"EmailPublic\" = \"ForumMember\".\"EmailPublic\"," .
39
                "\"Member\".\"AvatarID\" = \"ForumMember\".\"AvatarID\"," .
40
                "\"Member\".\"LastViewed\" = \"ForumMember\".\"LastViewed\"" .
41
                "WHERE \"Member\".\"ID\" = \"ForumMember\".\"ID\"");
42
            echo("<div style=\"padding:5px; color:white; background-color:blue;\">" . _t('ForumRole.TRANSFERSUCCEEDED', '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>" );
43
        }
44
    }
45
46
    private static $db =  array(
47
        'ForumRank' => 'Varchar',
48
        'Occupation' => 'Varchar',
49
        'Company' => 'Varchar',
50
        'City' => 'Varchar',
51
        'Country' => 'Varchar',
52
        'Nickname' => 'Varchar',
53
        'FirstNamePublic' => 'Boolean',
54
        'SurnamePublic' => 'Boolean',
55
        'OccupationPublic' => 'Boolean',
56
        'CompanyPublic' => 'Boolean',
57
        'CityPublic' => 'Boolean',
58
        'CountryPublic' => 'Boolean',
59
        'EmailPublic' => 'Boolean',
60
        'LastViewed' => 'SS_Datetime',
61
        'Signature' => 'Text',
62
        'ForumStatus' => 'Enum("Normal, Banned, Ghost", "Normal")',
63
        'SuspendedUntil' => 'Date'
64
    );
65
66
    private static $has_one = array(
67
        'Avatar' => 'Image'
68
    );
69
70
    private static $has_many = array(
71
        'ForumPosts' => 'Post'
72
    );
73
74
    private static $belongs_many_many = array(
75
        'ModeratedForums' => 'Forum'
76
    );
77
78
    private static $defaults = array(
79
        'ForumRank' => 'Community Member'
80
    );
81
82
    private static $searchable_fields = array(
83
        'Nickname' => true
84
    );
85
86
    private static $indexes = array(
87
        'Nickname' => true
88
    );
89
90
    private static $field_labels = array(
91
        'SuspendedUntil' => "Suspend this member from writing on forums until the specified date"
92
    );
93
94
    public function onBeforeDelete()
95
    {
96
        parent::onBeforeDelete();
97
98
        $avatar = $this->owner->Avatar();
99
        if ($avatar && $avatar->exists()) {
100
            $avatar->delete();
101
        }
102
    }
103
104
    public function ForumRank()
105
    {
106
        $moderatedForums = $this->owner->ModeratedForums();
107
        if ($moderatedForums && $moderatedForums->Count() > 0) {
108
            return _t('MODERATOR', 'Forum Moderator');
109
        } else {
110
            return $this->owner->getField('ForumRank');
111
        }
112
    }
113
114
    public function FirstNamePublic()
115
    {
116
        return $this->owner->FirstNamePublic || Permission::check('ADMIN');
117
    }
118
    public function SurnamePublic()
119
    {
120
        return $this->owner->SurnamePublic || Permission::check('ADMIN');
121
    }
122
    public function OccupationPublic()
123
    {
124
        return $this->owner->OccupationPublic || Permission::check('ADMIN');
125
    }
126
    public function CompanyPublic()
127
    {
128
        return $this->owner->CompanyPublic || Permission::check('ADMIN');
129
    }
130
    public function CityPublic()
131
    {
132
        return $this->owner->CityPublic || Permission::check('ADMIN');
133
    }
134
    public function CountryPublic()
135
    {
136
        return $this->owner->CountryPublic || Permission::check('ADMIN');
137
    }
138
    public function EmailPublic()
139
    {
140
        return $this->owner->EmailPublic || Permission::check('ADMIN');
141
    }
142
    /**
143
     * Run the Country code through a converter to get the proper Country Name
144
     */
145
    public function FullCountry()
146
    {
147
        $locale = new Zend_Locale();
148
        $locale->setLocale($this->owner->Country);
149
        return $locale->getRegion();
150
    }
151
    public function NumPosts()
152
    {
153
        if (is_numeric($this->owner->ID)) {
154
            return $this->owner->ForumPosts()->Count();
155
        } else {
156
            return 0;
157
        }
158
    }
159
160
    /**
161
     * Checks if the current user is a moderator of the
162
     * given forum by looking in the moderator ID list.
163
     *
164
     * @param Forum object to check
165
     * @return boolean
166
     */
167
    public function isModeratingForum($forum)
168
    {
169
        $moderatorIds = $forum->Moderators() ? $forum->Moderators()->getIdList() : array();
170
        return in_array($this->owner->ID, $moderatorIds);
171
    }
172
173
    public function Link()
174
    {
175
        return "ForumMemberProfile/show/" . $this->owner->ID;
176
    }
177
178
179
    /**
180
     * Get the fields needed by the forum module
181
     *
182
     * @param bool $showIdentityURL Should a field for an OpenID or an i-name
183
     *                              be shown (always read-only)?
184
     * @return FieldList Returns a FieldList containing all needed fields for
185
     *                  the registration of new users
186
     */
187
    public function getForumFields($showIdentityURL = false, $addmode = false)
188
    {
189
        $gravatarText = (DataObject::get_one("ForumHolder", "\"AllowGravatars\" = 1")) ? '<small>'. _t('ForumRole.CANGRAVATAR', 'If you use Gravatars then leave this blank') .'</small>' : "";
190
191
        //Sets the upload folder to the Configurable one set via the ForumHolder or overridden via Config::inst()->update().
192
        $avatarField = new FileField('Avatar', _t('ForumRole.AVATAR', 'Avatar Image') .' '. $gravatarText);
193
        $avatarField->setFolderName(Config::inst()->get('ForumHolder', 'avatars_folder'));
194
        $avatarField->getValidator()->setAllowedExtensions(array('jpg', 'jpeg', 'gif', 'png'));
195
196
        $personalDetailsFields = new CompositeField(
197
            new HeaderField("PersonalDetails", _t('ForumRole.PERSONAL', 'Personal Details')),
198
            new LiteralField("Blurb", "<p id=\"helpful\">" . _t('ForumRole.TICK', 'Tick the fields to show in public profile') . "</p>"),
199
            new TextField("Nickname", _t('ForumRole.NICKNAME', 'Nickname')),
200
            new CheckableOption("FirstNamePublic", new TextField("FirstName", _t('ForumRole.FIRSTNAME', 'First name'))),
201
            new CheckableOption("SurnamePublic", new TextField("Surname", _t('ForumRole.SURNAME', 'Surname'))),
202
            new CheckableOption("OccupationPublic", new TextField("Occupation", _t('ForumRole.OCCUPATION', 'Occupation')), true),
0 ignored issues
show
Documentation introduced by
true is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
203
            new CheckableOption('CompanyPublic', new TextField('Company', _t('ForumRole.COMPANY', 'Company')), true),
0 ignored issues
show
Documentation introduced by
true is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
204
            new CheckableOption('CityPublic', new TextField('City', _t('ForumRole.CITY', 'City')), true),
0 ignored issues
show
Documentation introduced by
true is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
205
            new CheckableOption("CountryPublic", new ForumCountryDropdownField("Country", _t('ForumRole.COUNTRY', 'Country')), true),
0 ignored issues
show
Documentation introduced by
true is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
206
            new CheckableOption("EmailPublic", new EmailField("Email", _t('ForumRole.EMAIL', 'Email'))),
207
            new ConfirmedPasswordField("Password", _t('ForumRole.PASSWORD', 'Password')),
208
            $avatarField
209
        );
210
        // Don't show 'forum rank' at registration
211
        if (!$addmode) {
212
            $personalDetailsFields->push(
213
                new ReadonlyField("ForumRank", _t('ForumRole.RATING', 'User rating'))
214
            );
215
        }
216
        $personalDetailsFields->setID('PersonalDetailsFields');
217
218
        $fieldset = new FieldList(
219
            $personalDetailsFields
220
        );
221
222
        if ($showIdentityURL) {
223
            $fieldset->insertBefore(
224
                new ReadonlyField('IdentityURL', _t('ForumRole.OPENIDINAME', 'OpenID/i-name')),
225
                'Password'
0 ignored issues
show
Documentation introduced by
'Password' is of type string, but the function expects a object<FormField>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
226
            );
227
            $fieldset->insertAfter(
228
                new LiteralField(
229
                    'PasswordOptionalMessage',
230
                    '<p>' . _t('ForumRole.PASSOPTMESSAGE', '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>'
231
                ),
232
                'IdentityURL'
0 ignored issues
show
Documentation introduced by
'IdentityURL' is of type string, but the function expects a object<FormField>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
233
            );
234
        }
235
236
        if ($this->owner->IsSuspended()) {
237
            $fieldset->insertAfter(
238
                new LiteralField(
239
                    'SuspensionNote',
240
                    '<p class="message warning suspensionWarning">' . $this->ForumSuspensionMessage() . '</p>'
241
                ),
242
                'Blurb'
0 ignored issues
show
Documentation introduced by
'Blurb' is of type string, but the function expects a object<FormField>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
243
            );
244
        }
245
246
        $this->owner->extend('updateForumFields', $fieldset);
247
248
        return $fieldset;
249
    }
250
251
    /**
252
     * Get the fields needed by the forum module
253
     *
254
     * @param bool $needPassword Should a password be required?
255
     * @return Validator Returns a Validator for the fields required for the
256
     *                              registration of new users
257
     */
258
    public function getForumValidator($needPassword = true)
259
    {
260
        if ($needPassword) {
261
            $validator = new RequiredFields("Nickname", "Email", "Password");
262
        } else {
263
            $validator = new RequiredFields("Nickname", "Email");
264
        }
265
        $this->owner->extend('updateForumValidator', $validator);
266
267
        return $validator;
268
    }
269
270
    public function updateCMSFields(FieldList $fields)
271
    {
272
        $allForums = DataObject::get('Forum');
273
        $fields->removeByName('ModeratedForums');
274
        $fields->addFieldToTab('Root.ModeratedForums', new CheckboxSetField('ModeratedForums', _t('ForumRole.MODERATEDFORUMS', 'Moderated forums'), ($allForums->exists() ? $allForums->map('ID', 'Title') : array())));
275
        $suspend = $fields->dataFieldByName('SuspendedUntil');
276
        $suspend->setConfig('showcalendar', true);
0 ignored issues
show
Bug introduced by
The method setConfig() does not exist on FormField. Did you maybe mean config()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
277
        if (Permission::checkMember($this->owner->ID, "ACCESS_FORUM")) {
278
            $avatarField = new FileField('Avatar', _t('ForumRole.UPLOADAVATAR', 'Upload avatar'));
279
            $avatarField->getValidator()->setAllowedExtensions(array('jpg', 'jpeg', 'gif', 'png'));
280
281
            $fields->addFieldToTab('Root.Forum', $avatarField);
282
            $fields->addFieldToTab('Root.Forum', new DropdownField("ForumRank", _t('ForumRole.FORUMRANK', "User rating"), array(
283
                "Community Member" => _t('ForumRole.COMMEMBER'),
284
                "Administrator" => _t('ForumRole.ADMIN', 'Administrator'),
285
                "Moderator" => _t('ForumRole.MOD', 'Moderator')
286
            )));
287
            $fields->addFieldToTab('Root.Forum', $this->owner->dbObject('ForumStatus')->scaffoldFormField());
288
        }
289
    }
290
291
    public function IsSuspended()
292
    {
293
        if ($this->owner->SuspendedUntil) {
294
            return strtotime(SS_Datetime::now()->Format('Y-m-d')) < strtotime($this->owner->SuspendedUntil);
295
        } else {
296
            return false;
297
        }
298
    }
299
300
    public function IsBanned()
301
    {
302
        return $this->owner->ForumStatus == 'Banned';
303
    }
304
305
    public function IsGhost()
306
    {
307
        return $this->owner->ForumStatus == 'Ghost' && $this->owner->ID !== Member::currentUserID();
308
    }
309
310
    /**
311
     * Can the current user edit the given member?
312
     *
313
     * @return true if this member can be edited, false otherwise
314
     */
315
    public function canEdit($member = null)
316
    {
317
        if (!$member) {
318
            $member = Member::currentUser();
319
        }
320
321
        if ($this->owner->ID == Member::currentUserID()) {
322
            return true;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return true; (boolean) is incompatible with the return type documented by ForumRole::canEdit of type true.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
323
        }
324
325
        if ($member) {
326
            return $member->can('AdminCMS');
327
        }
328
329
        return false;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return false; (false) is incompatible with the return type documented by ForumRole::canEdit of type true.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
330
    }
331
332
333
    /**
334
     * Used in preference to the Nickname field on templates
335
     *
336
     * Provides a default for the nickname field (first name, or "Anonymous
337
     * User" if that's not set)
338
     */
339
    public function Nickname()
340
    {
341
        if ($this->owner->Nickname) {
342
            return $this->owner->Nickname;
343
        } elseif ($this->owner->FirstNamePublic && $this->owner->FirstName) {
344
            return $this->owner->FirstName;
345
        } else {
346
            return _t('ForumRole.ANONYMOUS', 'Anonymous user');
347
        }
348
    }
349
350
    /**
351
     * Return the url of the avatar or gravatar of the selected user.
352
     * Checks to see if the current user has an avatar, if they do use it
353
     * otherwise query gravatar.com
354
     *
355
     * @return String
356
     */
357
    public function getFormattedAvatar()
358
    {
359
        $default = "forum/images/forummember_holder.gif";
360
        $currentTheme = Config::inst()->get('SSViewer', 'theme');
361
362
        if (file_exists('themes/' . $currentTheme . '_forum/images/forummember_holder.gif')) {
363
            $default = 'themes/' . $currentTheme . '_forum/images/forummember_holder.gif';
364
        }
365
        // if they have uploaded an image
366
        if ($this->owner->AvatarID) {
367
            $avatar = Image::get()->byID($this->owner->AvatarID);
368
            if (!$avatar) {
369
                return $default;
370
            }
371
372
            $resizedAvatar = $avatar->SetWidth(80);
373
            if (!$resizedAvatar) {
374
                return $default;
375
            }
376
377
            return $resizedAvatar->URL;
378
        }
379
380
        //If Gravatar is enabled, allow the selection of the type of default Gravatar.
381
        if ($holder = ForumHolder::get()->filter('AllowGravatars', 1)->first()) {
382
            // If the GravatarType is one of the special types, then set it otherwise use the
383
            //default image from above forummember_holder.gif
384
            if ($holder->GravatarType) {
385
                $default = $holder->GravatarType;
386
            } else {
387
                // we need to get the absolute path for the default forum image
388
                return $default;
389
            }
390
            // ok. no image but can we find a gravatar. Will return the default image as defined above if not.
391
            return "http://www.gravatar.com/avatar/".md5($this->owner->Email)."?default=".urlencode($default)."&amp;size=80";
392
        }
393
394
        return $default;
395
    }
396
397
    /**
398
     * Conditionally includes admin email address (hence we can't simply generate this
399
     * message in templates). We don't need to spam protect the email address as
400
     * the note only shows to logged-in users.
401
     *
402
     * @return String
403
     */
404
    public function ForumSuspensionMessage()
405
    {
406
        $msg = _t('ForumRole.SUSPENSIONNOTE', 'This forum account has been suspended.');
407
        $adminEmail = Config::inst()->get('Email', 'admin_email');
408
409
        if ($adminEmail) {
410
            $msg .= ' ' . sprintf(
411
                _t('ForumRole.SUSPENSIONEMAILNOTE', 'Please contact %s to resolve this issue.'),
412
                $adminEmail
413
            );
414
        }
415
        return $msg;
416
    }
417
}
418
419
420
421
/**
422
 * ForumRole_Validator
423
 *
424
 * This class is used to validate the new fields added by the
425
 * {@link ForumRole} decorator in the CMS backend.
426
 */
427
class ForumRole_Validator extends Extension
428
{
429
430
    /**
431
     * Client-side validation code
432
     *
433
     * @param string $js The javascript validation code
434
     * @return string Returns the needed javascript code for client-side
435
     *                validation.
436
     */
437
    public function updateJavascript(&$js, &$form)
438
    {
439
440
        $formID = $form->FormName();
441
        $passwordFieldName = $form->dataFieldByName('Password')->id();
442
443
        $passwordConfirmField = $form->dataFieldByName('ConfirmPassword');
444
        if (!$passwordConfirmField) {
445
            return;
446
        }
447
448
        $passwordConfirmFieldName = $passwordConfirmField->id();
449
450
        $passwordcheck = <<<JS
451
Behaviour.register({
452
	"#$formID": {
453
		validatePasswordConfirmation: function() {
454
			var passEl = _CURRENT_FORM.elements['Password'];
455
			var confEl = _CURRENT_FORM.elements['ConfirmPassword'];
456
457
			if(passEl.value == confEl.value) {
458
			  clearErrorMessage(confEl.parentNode);
459
				return true;
460
			} else {
461
				validationError(confEl, "Passwords don't match.", "error");
462
				return false;
463
			}
464
		},
465
		initialize: function() {
466
			var passEl = $('$passwordFieldName');
467
			var confEl = $('$passwordConfirmFieldName');
468
469
			confEl.value = passEl.value;
470
		}
471
	}
472
});
473
JS;
474
        Requirements::customScript(
475
            $passwordcheck,
476
            'func_validatePasswordConfirmation'
477
        );
478
479
        $js .= "\$('$formID').validatePasswordConfirmation();";
480
        return $js;
481
    }
482
}
483