【问题标题】:Symfony validating another dropdown based on the value selected on a dropdownSymfony 根据下拉列表中选择的值验证另一个下拉列表
【发布时间】:2014-11-18 15:58:14
【问题描述】:

我有 3 个未映射到 FormType 的下拉菜单,我正在绘制这些表单元素。

ContentType - 区域 - 语言

ContentType 可以采用 2 个值 - 标准或区域。当我选择标准时,我不希望验证区域下拉列表。但选择区域ContentType时应验证。区域和语言是动态填充的。

我无法遵循条件验证,我认为这不是我的方案的解决方案。

$brandId = $options['brandId'];
$builder
        ->add('contentType', 'choice', array(
            'mapped' => false,
            'empty_value' => 'Select Content Type',
            'choices' => array(
                'standard' => 'Standard',
                'regional' => 'Regional'
            ),
            'required' => true,
            'multiple' => false,
            'expanded' => false
        ))
        ->add('language', 'entity', array(
            'required' => false,
            'mapped' => false,
            'empty_value' => 'Select Language',
            'multiple' => false,
            'class' => 'Bundle:Language',
            'property' => 'title',
            'query_builder' => function(EntityRepository $er) use($brandId) {
                return $er->createQueryBuilder('l')
                    ->join('l.regions', 'lr')
                    ->join('lr.brands', 'lrb')
                    ->where('lrb.id = :currentBrandId')
                    ->setParameter('currentBrandId', $brandId);
            }
        ))
        ->add('regionSelection', 'entity', array(
            'required' => false,
            'mapped' => false,
            'empty_value' => 'Select Region',
            'empty_data' => null,
            'multiple' => false,
            'class' => 'Bundle:Region',
            'property' => 'title',
            'query_builder' => function(EntityRepository $er) use($brandId) {
                return $er->createQueryBuilder('r')
                    ->join('r.brands', 'rb')
                    ->where('rb.id = :currentBrandId')
                    ->setParameter('currentBrandId', $brandId);
            }
        ));

我们将不胜感激。

编辑

所以我尝试通过回调向表单生成器添加约束:

->add('regionSelection', 'entity', array(
            'constraints' => array(
                new Assert\Callback(array(array($this, 'validateRegion')))
            ),
            'mapped' => false,
            'empty_value' => 'Select Region',
            'empty_data' => null,
            'multiple' => false,
            'class' => 'Bundle:Region',
            'property' => 'title',
            'query_builder' => function(EntityRepository $er) use($brandId) {
                return $er->createQueryBuilder('r')
                    ->join('r.brands', 'rb')
                    ->where('rb.id = :currentBrandId')
                    ->setParameter('currentBrandId', $brandId);
            }
        )); 

调用如下:

 public function validateRegion($value, ExecutionContextInterface $context)
{
//I am trying to check here if the contentType's selected value = 'regional' and no      //region is selected then the following code executes.
        $context->addViolationAt('regionSelection', 'There is already an event during this time!');

}

我现在的问题是因为我将 $this 传递给回调函数,所以我找不到如何访问 contentFormType 字段。

【问题讨论】:

标签: validation symfony symfony-forms symfony-2.3


【解决方案1】:

如果其他字段已提交,您可以检查全局 $_POST 变量(通过 Request 对象)... 类似:

public function validateRegion($value, ExecutionContextInterface $context)
{
     $request = Request::createFromGlobals();   
     $formData = $request->request->get("your_form_name");    
     if($formData["contentType"] == "regional"){
        ...
     }
}

【讨论】:

  • 使用$_POST 是唯一的方法吗?我们可以使用 Symfony2 的内部函数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多