2011-08-10 8 views
0

ガードユーザーフォームを拡張するEmailChangeFormというメールを変更するフォームがあり、sfGuardUserFormという2つのカラム:email_addresspasswordを使用しています。symfony:フォームフィールドが保存されないようにする

パスワードが正しいかどうかを確認するフォームが必要な場合は、電子メールを新しいものに変更します。

私の問題は、フォームがpasswordフィールドをユーザーオブジェクトに保存するということです。

パスワードはチェックされているので、理論上は変更できませんが、私はまだフォームから新しい値を再保存するのが嫌いですので、フォームのみを作成する方法はありますかemail_addressフィールドを保存しますか?

答えて

2

私はこのようなsceletonを示唆している:

class emailForm extends sfFrom { 
    public function configure(){ 
     $this->widgetSchema['email'] = new sfWidgetFormInputText(); 
     $this->widgetSchema['password'] = new sfWidgetFormInputPassword(); 
     $this->validatorSchema['password'] = new myValidatorPassword(); 
    } 
} 

class myValidatorPassword extends sfValidatorBase{ 
    protected function doClean($value) 
    { 
     $clean = (string) $value; 

     // current user 
     $sf_guard_user = sfContext::getInstance()->getUser()->getGuardUser(); 
     if($sf_guard_user) 
     { 
      // password is ok? 
      if ($sf_guard_user->checkPassword($value)) 
      { 
       return $clean; 
      } 
     } 
     // Throw error 
     throw new sfValidatorError($this, 'invalid', array('value' => $value)); 
    } 
} 

だからあなたのアクションで、簡単に新しいパスワードを保存することができます。これは基本的なアプローチである。もちろん、

/***** snip *****/ 
if($this->form->isValid()){ 
    // set and save new password to current user 
    $user = $this->getUser()->getGuardUser(); 
    $user->setPassword($formValues["password"]); 
    $user->save(); 
/***** snip *****/ 

を、改善は常に歓迎されています:-)

+0

しかし、私は電子メールが保存され、パスワードではないことを願っています。 – tamir

+0

アップスは申し訳ありません、 '$ user-> setEmail($ formValues [" email "]'はこのトリックを行います。 – domi27

+0

うん、それはうまくいく:)私はまた、よりsymfony-wayの解決策を望む人たちのために、フォームの 'doSave()'メソッドを修正する解決策を思いついた。 – tamir

0

上記のすべての名称は、あなたの名前に変更しなければならない例である。このコードによって

class editUserForm extend baseForm{ 
    public function configure(){ 
     unset($this['password']); 
    } 
} 

をパスワードをベースフォームを拡張する新しいフォーム(例えばeditUserForm)を作成し、設定を解除

+0

しかし、私はパスワードのバリデーターを追加することはできません – tamir

0

最初にEmailChangeFormクラスのuseFields機能を使用していることを確認してください。これにより、フォームで編集するフィールドを定義することができます(これはunsetよりも優れています)。フィールドを追加すると、気にする必要はありません。useFieldsです。例:

$this->useFields(array( 
    'email' 
)); 

パスワードを入力しないでください!

2番目:テンプレートに、同じ名前のスキーマ(updatemail [password])を持つパスワード用の追加入力フィールドを入れます。

第三:あなたは以下を追加$form->isValid方法の前に、あなたのアクションで:

$params = $request->getParameter($form->getName(); 
unset($params['password']; 
$form->bind($params), $request->getFiles($form->getName())); 
if($form->isValid()) {...} 
+0

私はそれを設定していない場合、パスワードが正しいかどうかを確認できますか? – tamir

0

私は

に...そこに一つだけのフィールドがEmailChangeFormであり、かつEmailChangeFormはSfUserFormを拡張することを想定しています電子メールフィールド以外のすべてのフィールドを削除し、これをconfigureメソッドに追加します。

$ this-> useFields(array( 'email'));