2

我正在 Symfony2 中构建一个表单类。在我的课堂上,我有一个选择领域。我构建了一个函数来返回我的选择数组:

public function getCardTypes()  {
    return array('visa' => 'Visa', 'mc' => 'MasterCard', 'amex' => 'American Express');
}

后来,我用这个数组在我的表单中添加了一个选择字段:

$builder->add('PaymentCCType', 'choice', array('choices' => $this->getCardTypes()));

然后在 getDefaultOptions 函数中,我对该字段有一个选择约束:

'PaymentCCType' => new Choice(array('choices' => $this->getCardTypes())),

我似乎对这个验证器有问题。当我提交此表单时,我的选择框下方出现以下错误:“您选择的值不是有效的选择”。当然,我正在使用数组中的一种选择。

我究竟做错了什么?

/* 编辑 */

我注意到在我喜欢的 4 个字段中,我只得到其中 3 个的错误。选择月份的那个(简单的 1-12),验证有效。

/* 编辑 2 */

当数组键与值不匹配时,似乎会出现此问题。我将我的阵列切换到array('Visa' => 'Visa', 'MasterCard' => 'MasterCard', 'American Express' => 'American Express')现在它可以工作了。有没有办法解决?我觉得我不能是唯一一个有这个问题的人。即使您有一个常规(非关联)数组,它也会发生array('Visa', 'MasterCard', 'American Express')

4

2 回答 2

3

恕我直言,您应该以不同的方式进行操作,使用带有方法的 ChoiceListInterface 创建类:

public function getChoices() 
{   
    return self::$choices;  
}

public static function getTypeChoicesKeys() 
{
    return array_keys(self::$choices);
}

在表单类中:

$builder->add('type', 'choice', 
        array(
            'expanded' => true, 
            'multiple' => false,
            'choice_list' => new TypeChoices(),
            'required' => true,
        )
      )

在验证.yml

    type:
        - NotNull: ~
        - Choice: { callback: [TypeChoices, getTypeChoicesKeys] }  
于 2012-07-08T13:14:12.137 回答
3

编辑 针对我的问题,Symfony 团队指出选择验证器接受一个可能值的数组(不是像选择字段这样的可能选择)。最简单的方法是使用 array_keys 函数:

'PaymentCCType' => new Choice(array('choices' => array_keys($this->getCardTypes()))),

于 2012-07-08T17:46:42.727 回答