Tom*_*Tom 7 doctrine symfony1 symfony-1.4 symfony-forms
我在两个单独的上下文中使用表单类:既创建新记录又编辑该记录.我按如下方式设置了一个后验证器,以检查URL字段是否唯一.
$this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
new sfValidatorDoctrineUnique(array('model' => 'Page', 'column' => array('url')), array('invalid' => 'This URL already exists.'))
)));
Run Code Online (Sandbox Code Playgroud)
当我创建新记录时,验证器工作得很好.但是,在编辑现有记录时,它会抛出错误,因为它将自身检测为重复.换句话说,如果我编辑记录但不对URL进行任何更改,则会引发重复错误.
这一定是一个常见问题,所以我想知道Symfony处理这个问题的方法是什么?基本上我希望它在保存时忽略自身(不存在重复),但仍然运行后验证器以确保不存在真正的重复.
更新情况确实由sfValidatorDoctrineUnique处理.
在您的情况下,如果具有给定URL的对象已存在,验证器将检查您是否正在执行更新操作.使用sfValidatorDoctrineUnique :: isUpdate()方法进行检查.
您的主键需要在提交的值中.
默认情况下,主键是内省的.您可以为其提供传递给验证程序的*primary_key*选项.
小智 5
如其他答案所述,确保以下内容非常重要:
sfValidatorDoctrineUnique
验证必须了解所有与表单提交的值.为此,您必须执行以下步骤:
添加一个隐藏的输入,其中包含(通常)对象的PK值:
class MyModelForm extends BaseMyModelForm
{
public function configure( )
{
if( ! $this->isNew() )
{
$this->widgetSchema['id'] = new sfWidgetFormInputHidden();
$this->validatorSchema['id'] = new sfValidatorNumber(array(
'required' => true
, 'min' => 1
));
}
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
移至sfValidatorDoctrineUnique
后验证阶段:
class MyModelForm extends BaseMyModelForm
{
public function configure( )
{
$this->widgetSchema['unique_column'] = new sfWidgetFormInputText();
$this->validatorSchema['unique_column'] = new sfValidatorPass();
...
$this->mergePostValidator(new sfValidatorDoctrineUnique(array(
'required' => true
, 'model' => 'MyModel'
, 'column' => 'unique_column'
)));
}
...
}
Run Code Online (Sandbox Code Playgroud)
您需要使用$this->mergePostValidator()
将验证器添加到后验证阶段,以便将所有提交的值提供给验证器.
请注意,您仍需要为唯一列小部件提供验证器,否则在提交表单时将出现"意外的额外表单字段"错误.
确保将要更新的对象传递给表单的构造函数:
$this->form = new MyModelForm($this->getRoute()->getObject());
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
3049 次 |
最近记录: |