微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – Silverstripe:ConfirmedPasswordField没有保存新密码

大家好我想让用户在前端更新密码.除此之外,所有其他字段都会更新.我在Silverstripe版本3.4.0.这可能不是解决这个问题的最好方法,但我对SS比较新,所以要温和:

// 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,$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不会以明文形式在数据库中存储密码.密码需要进行哈希处理,因此无法直接设置密码.

这就是为什么你打电话给$form-> saveInto($table);不接触密码.

SilverStripe成员类有一个changePassword()方法,您可以调用它来更新密码.将表单数据保存到Member对象后立即调用它:

$form->saveInto($table);
$table->changePassword($data['Password']['_Password']);
$table->write();

我没有测试过这段代码片段,但我很确定它会起作用.

在相关主题上,您可能希望查看Member Profile插件.

希望这可以帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐