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つのキー(複数および拡張)を追加してリストをラジオボタンに置き換えると、フィールドに選択されたボタンがありません(選択では機能しましたが)。
誰かが理由を知っていますか?
それを簡単に機能させる方法は?
ありがとうございました
注:実際には、値がブール値であり、最終的に文字列になるため、どの場合でも機能しないと思いましたが、リストでは機能するので、なぜ他の人では機能しないのでしょうか。
データトランスフォーマーを追加します。
$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;
}
));
それは魔法です:今、私は正しいラジオボタンをチェックし、エンティティに正しい値を持っています。
別の解決策は、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;
}
//...
}