我有一个表单来更改电子邮件,EmailChangeForm
扩展了保护用户表单sfGuardUserForm
并使用了两列:email_address
和password
。
我希望表单检查密码是否正确,如果是,请将电子邮件更改为新密码。
我的问题是表单还将password
字段保存到用户对象。
我知道由于密码已经过检查,理论上无法更改,但我仍然不喜欢使用表单中的新值重新保存,所以有没有办法让表单只保存email_address
字段?
答案 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(阵列( '电子邮件'));