私はいくつかの定数オプションを持つ複数のChoiceTypeリストを持つSymfony 3フォームを持っています。 これらの選択肢は、「json_array」フィールドにデータベース(doctrineで管理)に保存されます。symfony multiple choicetypeはあらかじめ用意されていません
私は、フォームを保存すると、選択した選択肢が正しくとしてデータベースに保存されます。
["my.Choice.1","my.Choice.2"]
しかし、私は再びこのフォームを編集する際に、選択したオプションのいずれも、「選択しない」されています。彼らは未チェックのままです。
データベースのデータが正しく入力されている他のフィールド(EntityType、multiple)があります。
MyEntityType:
$builder
->add('myChoices', ChoiceType::class, [
'choices' => [
'choice #1' => MyEntity::CHOICE_1,
'choice #2' => MyEntity::CHOICE_2,
],
'expanded' => true,
'multiple' => true,
])
ここでは私のフィールドは、エンティティで定義されている方法です。
MyEntity:
const CHOICE_1 = 'my.Choice.1';
const CHOICE_2 = 'my.Choice.2';
/**
* @var array
*
* @ORM\Column(name="my_choices", type="json_array", nullable=true)
*/
private $myChoices;
/**
* @return array
*/
public function getMyChoices()
{
return array_unique($this->myChoices);
}
/**
* @param array $myChoices
*
* @return MyEntity
*/
public function setMyChoices(array $myChoices)
{
$this->myChoices = [];
foreach ($myChoices as $myChoice) {
$this->addMyChoice($myChoice);
}
return $this;
}
/**
* @param string $myChoice
*
* @return MyEntity
*/
public function addMyChoice($myChoice)
{
$myChoice = strtolower($myChoice);
if (!$this->hasMyChoice($myChoice)) {
$this->myChoices[] = $myChoice;
}
return $this;
}
/**
* @param string $myChoice
*
* @return bool
*/
public function hasMyChoice($myChoice)
{
return in_array(strtolower($myChoice), $this->myChoices, true);
}
そして、私のフォームは、このように呼ばれている:
$myEntity = ..... // loaded from database
$form = $this->createForm(MyEntityType::class, $myEntity);
だから私のは、私が何をしないのです伝えることができ、誰もがそこにあります?
もう一度おねがいします。
@Yoshi、はいそのタイプミスする文字列を強制している私の選択肢名、を指しに感謝です私はそれで私。私はちょうど編集しました。 –
私はあなたの問題を(doctrineなしで) '$ foo-> setMyChoices(json_decode( '[" my.choice.1 "、" my.choice.2 "]'));のようにして複製しようとしました。コントローラ。これにより、両方のチェックボックスがチェックされます。あなたのコードに実際にロードされているもの(doctrineによって設定されているもの)を見るために 'dump($ myEntity-> getMyChoices())'を試してみませんか? – Yoshi
こんにちは、ここにtwigのダンプがあります: 'array:2 [▼ 0 =>" my.choice.1 " 1 =>" my.choice.2 "] –