2016-08-23 9 views
4

こんにちは、私はユーザーがフロントエンドでパスワードを更新できるようにしようとしています。これ以外のフィールドはすべて更新されます。私はSilverstripeバージョン3.4.0です。これはおそらく、これを処理するための最良の方法ではありませんが、私はそう他の良いCMSと同様にSilverstripe:ConfirmedPasswordFieldは新しいパスワードを保存していません

// 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; 
} 
+0

成功メッセージが表示されますが、パスワードは保存されません。メンバーはどんなパスワードを取得しますか?なし? – bummzack

+0

@bummzackねえ、パスワードは元のものと変わりません。 – Dallby

答えて

1

、SilverStripeは、データベースの中にプレーンテキストでパスワードを格納しません。:穏やかなSSに比較的新しいですセキュリティの理由。パスワードはハッシュする必要があるため、直接設定することはできません。

だからこそ、$form->saveInto($table);へのあなたの電話はパスワードに触れません。

SilverStripe Memberクラスには、パスワードを更新するために呼び出すことができるchangePassword()メソッドがあります。ちょうどあなたのメンバーオブジェクトにフォームデータを保存した後、それを呼び出します。

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

私はこのコードスニペットをテストしていませんが、私はそれが動作しますかなり確信しています。

関連トピックでは、Member Profileプラグインを参照してください。

これが役に立ちます。

+0

お返事ありがとうございました。私はそのコードを試して、フォームの提出時に次のエラーを受け取りました: '[Warning] crypt()はパラメータ1が文字列で配列が必要です' – Dallby

+0

私は答えを更新しました。両方のパスワードフィールドが一致した場合、ConfirmedPasswordFieldは単一の値を返すと私は単純に仮定しました。 _Passwordと_ConfirmPasswordの各キーを使用して、各パスワードフィールドの配列を返します。 しかし、両方の値が同じであることを検証する必要はありません。 ConfirmPasswordFieldは自己検証し、一致しない場合はフォームアクションが呼び出されません。 –

+0

優秀な仕事です。それは動作します。あなたのすべての協力に感謝します。 – Dallby

関連する問題