web-dev-qa-db-ja.com

ブール値と選択シンフォニータイプ

Symfonyフレームワークの選択タイプを使用して、これら2つのキーで再生するディスプレイリスト、ラジオボタン、またはチェックボックスを決定できます。

'multiple' => false,
'expanded' => true,  //example for radio buttons

文字列の代わりに、「choices」キーの配列として指定されたさまざまな選択肢の値がブール値であるとしましょう。

$builder->add('myproperty', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false
     ),
     'label' => 'My Property',
     'required' => true,
     'empty_value' => false,
     'choices_as_values' => true
 )); 

リスト(選択)を使用して異なる選択肢を表示しても問題はなく、フォームが表示されると、リスト内の正しい選択肢が選択されます。

前に説明した2つのキー(複数および拡張)を追加してリストをラジオボタンに置​​き換えると、フィールドに選択されたボタンがありません(選択では機能しましたが)。

誰かが理由を知っていますか?

それを簡単に機能させる方法は?

ありがとうございました

注:実際には、値がブール値であり、最終的に文字列になるため、どの場合でも機能しないと思いましたが、リストでは機能するので、なぜ他の人では機能しないのでしょうか。

6
mlwacosmos

データトランスフォーマーを追加します。

$builder->add('myproperty', 'choice', array(
    'choices' => array(
        'Yes' => '1',
        'No' => '0'
     ),
     'label' => 'My Property',
     'required' => true,
     'empty_value' => false,
     'choices_as_values' => true
 )); 

 $builder->get('myProperty')
    ->addModelTransformer(new CallbackTransformer(
        function ($property) {
            return (string) $property;
        },
        function ($property) {
            return (bool) $property;
        }
  ));

それは魔法です:今、私は正しいラジオボタンをチェックし、エンティティに正しい値を持っています。

8
mlwacosmos

別の解決策は、Doctrine Lifecycle Callbacksおよびphp型キャスト)を使用することです。

このFormTypeの場合:

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

//...

$builder->add('active', ChoiceType::class, [
    'choices' => [
        'active' => true,
        'inactive' => false
    ]
])

そしてこのようなエンティティ:

//...
use Doctrine\ORM\Mapping as ORM;

/**
 * ...
 * @ORM\HasLifecycleCallbacks()                      /!\ Don't forget this!
 * ...
 */
class MyEntity {

    //..

    /**
     * @var bool
     *
     * @ORM\Column(name="active", type="boolean")
     */
    private $active;

    //...

    /**
     * @ORM\PrePersist()
     */
    public function prePersist()
    {
        $this->active = (bool) $this->active; //Force using boolean value of $this->active
    }

    /**
     * @ORM\PreUpdate()
     */
    public function preUpdate()
    {
        $this->active = (bool) $this->active;
    }    

    //...
}
5
TekPike