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())),

このバリデーターに問題があるようです。このフォームを送信すると、選択ボックスの下に次のエラーが表示されます:「選択した値は有効な選択ではありません」。もちろん、配列内の選択肢の 1 つを使用しています。

私は何を間違っていますか?

/* 編集 */

私がこのように持っている4つのフィールドのうち、3つだけでエラーが発生することに気付きました。選択が月 (単純な 1-12) の場合、検証は機能します。

/* 編集 2 */

この問題は、配列キーが値と一致しない場合に発生するようです。アレイをに切り替えたところ、array('Visa' => 'Visa', 'MasterCard' => 'MasterCard', 'American Express' => 'American Express')動作するようになりました。これを回避する方法はありますか?この問題を抱えているのは私だけではないように感じます。次のような通常の(非連想)配列がある場合でも発生しますarray('Visa', 'MasterCard', 'American Express')

4

2 に答える 2

3

IMHO 別の方法で行う必要があります。メソッドを使用して 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,
        )
      )

validation.yml で

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

edit 私の問題に応えて、Symfony チームは、choice バリデーターが可能な値の配列を受け入れることを指摘しました (choice フィールドのような可能な選択肢ではありません)。これを行う最も簡単な方法は、array_keys 関数を使用することです。

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

于 2012-07-08T17:46:42.727 に答える