php – Symfony 1.4条件验证
作者:互联网
我有一个继承自sfGuardRegisterForm的个人资料表单
我有这些领域:
$this->useFields(
array('first_name',
'last_name',
'email_address',
'country',
'language',
'current_password',
'new_password',
'password_again',
)
);
必填字段是:
email_address,国家和语言
条件是:
>如果email_address与当前的email_address不相等
然后检查它是否唯一然后保存
>如果current_password是用户的实际密码,则验证new_password和password_again是否相等,并验证new_password是否不等于用户的实际密码
我只是无法弄清楚如何实现这一点
编辑
感谢1d您的示例有效,但问题是我加载用户个人资料并填写字段:’first_name’,’last_name’,’email_address’,’country’,’language’与实际登录用户,因此email_address字段将显示电子邮件地址:
//...
$this->widgetSchema['email_address']->setDefault($this->_user->getEmailAddress());
//...
如果用户不更改电子邮件,它将始终显示此消息:
An object with the same “email_address” already exist.
我只想跳过那个
此$this-> getObject() – > checkPassword()也不起作用,始终显示以下消息:
Incorrect current password.
我用:
$this->_user = sfContext::getInstance()->getUser()->getGuardUser();
获取实际的用户个人资料
EDIT2
再次感谢1ed
这非常奇怪,我感到沮丧,这就是情况
>我有一个“解决方法”,但它不符合标准,我可以使它工作,但使用sfContext :: getInstance() – > getUser() – > getGuardUser();这将是更多不必要的代码
>如果我使用新的ProfileForm($user)自动填充所有字段,那是非常好但我不能setDefault()我不能设置null或清空任何字段所以我不能使用doUpdateObject()因为这个函数只在更新当前数据时工作,我也测试了覆盖bind(),save()等没有结果
解决方法:
email_address uniqueness:你应该在schema中设置unique:true,默认情况下是sfDoctrineGuardPlugin,所以在BasesfGuardUserForm中你应该看到一个唯一的验证器:sfValidatorDoctrineUnique(array(‘model’=>’sfGuardUser’,’column’=> ; array(’email_address’))
current_password:你应该为此创建一个回调类型的post验证器
// in sfGuardRegisterForm::configure()
// these fields can be blank
$this->getValidator('current_password')->setOption('required', false);
$this->getValidator('new_password')->setOption('required', false);
$this->getValidator('password_again')->setOption('required', false);
// check the current password (this validator is not `required` by default)
$this->mergePostValidator(new sfValidatorCallback(array(
'callback' => array($this, 'checkPassword'),
), array(
'invalid' => 'Incorrect current password.'
)));
// add this method to the same form class
public function checkPassword(sfValidatorBase $validator, array $values, array $arguments)
{
// if a new password is given check whether the old one is correct or not and rise an error if not correct
if(0 != strlen($values['new_password']) && !$this->getObject()->checkPassword($values['current_password']))
{
throw new sfValidatorErrorSchema($validator, array(
'current_password' => new sfValidatorError($validator, 'invalid')
));
}
return $values;
}
或者,您可以创建自定义帖子验证器,但我认为没有必要.
编辑:
如果您希望显示空的电子邮件地址,就像密码字段一样,将这些添加到您的表单类:
// at form load remove the default value
protected function updateDefaultsFromObject()
{
parent::updateDefaultsFromObject();
if (isset($this['email_address']))
{
$this->setDefault('email_address', '');
}
}
// before save remove empty email address
protected function doUpdateObject($values)
{
if (isset($values['email_address']) && 0 == strlen($values['email_address']))
{
unset($values['email_address']);
}
parent::doUpdateObject($values);
}
标签:symfony-1-4,php,symfony1 来源: https://codeday.me/bug/20190902/1790309.html