Silverstripe:ConfirmedPasswordField 不保存新密码
Silverstripe: ConfirmedPasswordField not saving new password
我试图让用户在前端更新他们的密码。除此字段外,所有其他字段都会更新。我正在使用 Silverstripe 版本 3.4.0。这可能不是处理此问题的最佳方法:
// Edit & Save your details
public function EditMyDetails() {
//Include JS for updating details
Requirements::javascript('module-memberprofiles/javascript/MemberProfileUpdate.js');
Requirements::set_force_js_to_bottom(true);
$fields = new FieldList(
$leftCol = CompositeField::create(
TextField::create('FirstName', 'First Name')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
TextField::create('Surname', 'Surname')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
CompositeField::create(
TextField::create('Address', ''),
TextField::create('Suburb', ''),
CompositeField::create(
DropdownField::create('State', '', singleton('Member')->dbObject('State')->enumValues())->setFieldHolderTemplate('UserDetails_StatePostCode'),
TextField::create('PostCode', '')->setFieldHolderTemplate('UserDetails_StatePostCode')
)->addExtraClass('row')
)
->addExtraClass('userdetails-address wrap')
->setFieldHolderTemplate('UserDetails_AddressHolder'),
TextField::create('Phone', 'Phone')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
TextField::create('Email', 'Email')
->setFieldHolderTemplate('UserDetails_FieldHolder')
)->setFieldHolderTemplate('UserDetails_CompositeField'),
$rightCol = CompositeField::create(
ConfirmedPasswordField::create('Password', 'Change Password', null, null, $showOnClick = true)
)->setFieldHolderTemplate('UserDetails_CompositeField')
);
$actions = new FieldList(new FormAction('SaveMyDetails', 'Save Profile'));
$validation = new RequiredFields(array('FirstName','Surname','Email'));
$form = new Form ( $this, 'EditUserDetails', $fields, $actions, $validation);
$form->loadDataFrom(Member::currentUser());
$form->setTemplate('MemberProfilePage_UserDetailsForm');
return $form;
}
public function SaveMyDetails($data, $form) {
$table = Member::currentUser();
$members = Member::get();
$emailExists = $members->filter(array(
'Email' => $data['Email'],
'ID:not' => $table->ID
));
if( $emailExists->count() > 0 ) {
$form->sessionMessage('Sorry, that email address already exists. Please try again','bad');
return $this->redirectBack();
} else {
$form->sessionMessage('Your details have been updated.','good');
}
$form->saveInto($table);
$table->write();
$this->redirectBack();
return $this;
}
与任何其他优秀的 CMS 一样,出于安全原因,SilverStripe 不会在数据库中以纯文本形式存储密码。密码需要hash,不能直接设置。
这就是为什么您对 $form->saveInto($table);
的调用没有触及密码。
SilverStripe 会员 class 有一个 changePassword() 方法,您可以调用它来更新密码。在将表单数据保存到 Member 对象后立即调用它:
$form->saveInto($table);
$table->changePassword($data['Password']['_Password']);
$table->write();
我还没有测试过这段代码,但我很确定它会起作用。
关于相关主题,您可能想看看 Member Profile 插件。
希望这对您有所帮助。
我试图让用户在前端更新他们的密码。除此字段外,所有其他字段都会更新。我正在使用 Silverstripe 版本 3.4.0。这可能不是处理此问题的最佳方法:
// Edit & Save your details
public function EditMyDetails() {
//Include JS for updating details
Requirements::javascript('module-memberprofiles/javascript/MemberProfileUpdate.js');
Requirements::set_force_js_to_bottom(true);
$fields = new FieldList(
$leftCol = CompositeField::create(
TextField::create('FirstName', 'First Name')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
TextField::create('Surname', 'Surname')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
CompositeField::create(
TextField::create('Address', ''),
TextField::create('Suburb', ''),
CompositeField::create(
DropdownField::create('State', '', singleton('Member')->dbObject('State')->enumValues())->setFieldHolderTemplate('UserDetails_StatePostCode'),
TextField::create('PostCode', '')->setFieldHolderTemplate('UserDetails_StatePostCode')
)->addExtraClass('row')
)
->addExtraClass('userdetails-address wrap')
->setFieldHolderTemplate('UserDetails_AddressHolder'),
TextField::create('Phone', 'Phone')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
TextField::create('Email', 'Email')
->setFieldHolderTemplate('UserDetails_FieldHolder')
)->setFieldHolderTemplate('UserDetails_CompositeField'),
$rightCol = CompositeField::create(
ConfirmedPasswordField::create('Password', 'Change Password', null, null, $showOnClick = true)
)->setFieldHolderTemplate('UserDetails_CompositeField')
);
$actions = new FieldList(new FormAction('SaveMyDetails', 'Save Profile'));
$validation = new RequiredFields(array('FirstName','Surname','Email'));
$form = new Form ( $this, 'EditUserDetails', $fields, $actions, $validation);
$form->loadDataFrom(Member::currentUser());
$form->setTemplate('MemberProfilePage_UserDetailsForm');
return $form;
}
public function SaveMyDetails($data, $form) {
$table = Member::currentUser();
$members = Member::get();
$emailExists = $members->filter(array(
'Email' => $data['Email'],
'ID:not' => $table->ID
));
if( $emailExists->count() > 0 ) {
$form->sessionMessage('Sorry, that email address already exists. Please try again','bad');
return $this->redirectBack();
} else {
$form->sessionMessage('Your details have been updated.','good');
}
$form->saveInto($table);
$table->write();
$this->redirectBack();
return $this;
}
与任何其他优秀的 CMS 一样,出于安全原因,SilverStripe 不会在数据库中以纯文本形式存储密码。密码需要hash,不能直接设置。
这就是为什么您对 $form->saveInto($table);
的调用没有触及密码。
SilverStripe 会员 class 有一个 changePassword() 方法,您可以调用它来更新密码。在将表单数据保存到 Member 对象后立即调用它:
$form->saveInto($table);
$table->changePassword($data['Password']['_Password']);
$table->write();
我还没有测试过这段代码,但我很确定它会起作用。
关于相关主题,您可能想看看 Member Profile 插件。
希望这对您有所帮助。