2015-10-06 51 views
0

我想验证包含下拉菜单和文本输入字段的表单。Symfony2仅在包含某些内容时验证文本输入

用户可以从下拉菜单中选择一个项目。如果他想创建一个新项目,他可以使用下拉菜单旁边的文本输入字段。

这是我上传类型:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->setAction('upload') 
     ->setMethod('POST') 

     // project name dropdown menu 
     ->add('projectname', 'choice' , array(
      'label' => 'upload_project_label', 
      'choices' => $this->projects, 
      'attr' => array(
       'class' => 'form-control some', 
       'required' => 'true' 
      ) 
     )) 

     // newprojectname text input 
     ->add('newprojectname', 'text', array(
       'label' => false, 
       'attr' => array(
        'class' => 'form-control', 
        'required' => false, 
        'placeholder' => 'upload_newprojectname_placeholder' 
       ) 
      ) 
     ) 
... 

这是我上传的实体的一个片段:

/** 
* @ORM\Column(type="text") 
* 
* @var string $projectname 
* @Assert\NotBlank() 
*/ 
protected $projectname; 

/** 
* @ORM\Column(type="text") 
* 
* @var string $newprojectname 
* @Assert\Length(
*  min = 3, 
*  max = 7, 
*  minMessage = "min message", 
*  maxMessage = "max message" 
*) 
*/ 
protected $newprojectname; 

我的问题是有没有检查该字段newproject查询的可能性被设置(即一个字符串被输入)?如果是这样,让Assert注释完成它的工作。

+0

我不明白...你要检查该字段不为空,然后呢? – pabgaran

+1

您可以创建['Callback'](http://symfony.com/doc/current/reference/constraints/Callback.html)断言。 – Fracsi

+0

@pabgaran - 我想检查是否在该字段中输入了内容,如果是这样,请使用Assert注释检查输入的值。这足够清楚了吗? – aszel

回答

1

这可以通过多种方式完成,所有这些都可能会满足您的要求。

  1. 使用custom callback - 这是最快捷,最直接的
  2. 使用expression validator - 很多人有嵌入PHP中的元语言是完全合法的问题,但是这又是一个快速上下的方式做事
  3. 使用group sequences,特别是group sequence provider功能

的你选择哪一个是你的,但回调是一个快速简便的起点,你可以,如果你的VA基础上封闭限制变得更加复杂。

+0

感谢您的回答。我通过使用@Frasci提到的自定义回调来找到解决方案。将在下面发布代码。 – aszel

0

这是建议的解决方案作为自定义回调验证的代码块。

我不得不添加其他功能我上传的实体,看起来像这样:

use Symfony\Component\Validator\Context\ExecutionContextInterface; 
/** 
* Function holds custom validation for fields in import/upload form 
* @Assert\Callback 
* @param ExecutionContextInterface $context 
*/ 
public function validate(ExecutionContextInterface $context) 
{ 
    // check new project name 
    $newProjectName = $this->getNewprojectname(); 
    if(!empty($newProjectName)) { 

     // letters only 
     $pattern = '/[a-zA-Z]/'; 
     if($this->isPatternWrong($newProjectName, $pattern)) { 
      $context 
       ->buildViolation('Please use letters only.') 
       ->atPath('newprojectname') 
       ->addViolation(); 
     } 

     // text max. 7 digits 
     $maxlength = 7; 
     if($this->isStringTooLong($newProjectName, $maxlength)) { 
      $context 
       ->buildViolation('Max. length 7 digits.') 
       ->atPath('newprojectname') 
       ->addViolation(); 
     } 
    } 
} 

private function isPatternWrong($string, $pattern) 
{ 
    $result = preg_match($pattern, $string); 
    if($result === 0) { 
     return true; 
    } 
    return false; 
} 

private function isStringTooLong($string, $length) 
{ 
    if(strlen($string) > $length) { 
     return true; 
    } 
    return false; 
}