Symfony:防止表单字段被保存

时间:2011-08-10 18:56:41

标签: forms symfony1

我有一个表单来更改电子邮件,EmailChangeForm扩展了保护用户表单sfGuardUserForm并使用了两列:email_addresspassword

我希望表单检查密码是否正确,如果是,请将电子邮件更改为新密码。

我的问题是表单还将password字段保存到用户对象。

我知道由于密码已经过检查,理论上无法更改,但我仍然不喜欢使用表单中的新值重新保存,所以有没有办法让表单只保存email_address字段?

4 个答案:

答案 0 :(得分:2)

我建议像这样的场景:

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 *****/

当然这是一种基本方法,总是欢迎改进: - )

答案 1 :(得分:0)

创建新表单(例如editUserForm),扩展基本表单,然后通过此代码取消设置密码

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

以上所有名称都是一个示例,您必须将其更改为您的名字。

答案 2 :(得分:0)

首先确保您在useFields课程中使用EmailChangeForm功能。有了它,您可以使用表单定义要编辑的字段(这比unset更好,因为如果添加更多字段,则不必担心useFields)。例如:

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

请勿包含密码!

第二:在你的模板中为你的密码添加一个额外的输入字段,使用相同的名称模式(updatemail [密码])。

第三:在$form->isValid方法之前的操作中添加以下内容:

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

答案 3 :(得分:0)

我假设EmailChangeForm中只有一个字段,而且EmailChangeForm扩展了SfUserForm ......

要删除除电子邮件字段以外的所有字段,请将此添加到配置方法:

$这 - > useFields(阵列( '电子邮件'));