2016-11-29 2 views
0

私はいくつかの定数オプションを持つ複数の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); 

だから私のは、私が何をしないのです伝えることができ、誰もがそこにあります?

もう一度おねがいします。

+0

@Yoshi、はいそのタイプミスする文字列を強制している私の選択肢名、を指しに感謝です私はそれで私。私はちょうど編集しました。 –

+0

私はあなたの問題を(doctrineなしで) '$ foo-> setMyChoices(json_decode( '[" my.choice.1 "、" my.choice.2 "]'));のようにして複製しようとしました。コントローラ。これにより、両方のチェックボックスがチェックされます。あなたのコードに実際にロードされているもの(doctrineによって設定されているもの)を見るために 'dump($ myEntity-> getMyChoices())'を試してみませんか? – Yoshi

+0

こんにちは、ここにtwigのダンプがあります: 'array:2 [▼ 0 =>" my.choice.1 " 1 =>" my.choice.2 "] –

答えて

0

私の悪いです。

すべてはうまくいきます。

私のミスは、上側の手紙my.Choice.1, ...

を含むそして、私のゲッターとセッターで、私は小文字strtolower($myChoice)

関連する問題