2016-11-29 3 views
0

So habe ich ein Symfony 3 Formular mit einer multiplen ChoiceType Liste mit ein paar konstanten Optionen. Diese Auswahlmöglichkeiten werden dann in einer Datenbank (mit Doktrin verwalten) in einem 'json_array'-Feld gespeichert.symfony multiple choicetype ist nicht vorgefüllt

Wenn ich das Formular speichern, werden die ausgewählten Entscheidungen korrekt in der Datenbank speichern:

["my.Choice.1","my.Choice.2"] 

Aber wenn ich wieder dieses Formular bearbeiten möchten, keine der ausgewählten Optionen sind „ausgewählt“. Sie bleiben unkontrolliert.

Ich habe ein anderes Feld (EntityType, mehrere), die korrekt mit Daten aus der Datenbank gefüllt ist.

MyEntityType:

$builder 
    ->add('myChoices', ChoiceType::class, [ 
     'choices' => [ 
      'choice #1' => MyEntity::CHOICE_1, 
      'choice #2' => MyEntity::CHOICE_2, 
     ], 
     'expanded' => true, 
     'multiple' => true, 
    ]) 

Hier ist, wie mein Feld in der Entität definiert ist.

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); 
} 

Und meine Form wie folgt aufgerufen:

$myEntity = ..... // loaded from database 
$form = $this->createForm(MyEntityType::class, $myEntity); 

So ist es jemanden, der sagen kann, mein, was mir fehlt ??

Nochmals vielen Dank.

+0

@Yoshi Klein zu sein, ja, es ist ein Tippfehler, vielen Dank für den Hinweis Ich bin dabei. Ich habe gerade bearbeitet. –

+0

Ich habe versucht, Ihr Problem (ohne Doktrin) zu replizieren, indem Sie so etwas wie: '$ foo-> setMyChoices (json_decode ('[" my.choice.1 "," my.choice.2 "]')) in der Regler. Damit sind beide Checkboxen markiert. Würden Sie 'dump ($ myEntity-> getMyChoices())' versuchen, um zu sehen, was tatsächlich in Ihrem Code geladen ist (nach Doktrin eingerichtet)? – Yoshi

+0

Hallo, hier ist der Zweig Dump: 'Array: 2 [▼ 0 =>" my.choice.1 " 1 =>" my.choice.2 "]' –

Antwort

0

Mein schlechtes.

Alles funktioniert wie es soll.

Mein Fehler ist in meinen Entscheidungen Namen, die my.Choice.1, ... obere Buchstaben sind enthalten

Und in meinem Getter und Setter, ich Strings zwingen strtolower($myChoice)

Verwandte Themen