2016-08-23 1 views
4

안녕하세요. 사용자가 프런트 엔드에서 비밀번호를 업데이트 할 수 있도록 노력하고 있습니다. 이 필드를 제외한 나머지 필드는 모두 업데이트됩니다. Silverstripe 버전 3.4.0입니다. 이것은 아마이 문제를 처리하는 가장 좋은 방법이 아니다,하지만 난 너무 다른 좋은 CMS처럼실버 스트라이프 : 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