Forms 表单验证-只需填写一个字段
我有以下表格:Forms 表单验证-只需填写一个字段,forms,validation,symfony,Forms,Validation,Symfony,我有以下表格: public function buildForm(formbuilder接口$builder,数组$options) { $builder ->添加('existingfolder','entity',数组( 'class'=>'ImageBundle:文件夹', “必需”=>false, )) ->添加('folder','text',array('required'=>false)) ->添加(“文件”、“文件”); } 如何设置验证,以便必须填写现有文件夹或文件夹字段(
public function buildForm(formbuilder接口$builder,数组$options)
{
$builder
->添加('existingfolder','entity',数组(
'class'=>'ImageBundle:文件夹',
“必需”=>false,
))
->添加('folder','text',array('required'=>false))
->添加(“文件”、“文件”);
}
如何设置验证,以便必须填写现有文件夹
或文件夹
字段(但不能同时填写这两个字段)
谢谢你的建议
谢谢。使用或验证断言,这里有一个示例来检查用户是否必须提供至少一个文件夹:
<?php
namespace Acme\BlogBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Image
{
// ...properties, functions, etc...
/**
* @Assert\True(message = "You must give at least an existing folder or a new folder")
*/
public function isThereOneFieldFilled()
{
return ($this->existingfolder || $this->folder); // If false, display an error !
}
}
编辑:
表单中的回调验证(我找到了一个示例):
谢谢我怎么能在一个不基于模型的表单中使用它呢?我不知道这是否改变了,但是注释是
isTrue(
),而不仅仅是True(
)。
/**
* @Assert\True(message = "You must give an existing folder or a new folder, not both")
*/
public function isThereOnlyOneFieldFilled()
{
return (!$this->existingfolder && $this->folder || $this->existingfolder && !$this->folder);
}
// use ...
use Symfony\Component\Form\CallbackValidator;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormInterface;
// Inside the form:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('existingfolder', 'entity', array(
'class' => 'ImageBundle:Folder',
'required' => false,
))
->add('folder', 'text', array('required' => false))
->add('file', 'file');
// Use the CallbackValidator like a TrueValidator behavior
$builder->addValidator(new CallbackValidator(function(FormInterface $form) {
if (!$form["existingfolder"]->getData() && !$form["folder"]->getData()) {
$form->addError(new FormError('You must give at least an existing folder or a new folder'));
}
}));
}