2016-11-29 100 views
0

所以我有一个Symfony 3窗体与多个ChoiceType列表与几个常量选项。 然后,这些选择将保存在数据库中(使用原则管理)在'json_array'字段中。symfony多choicetype没有预先填充

当我保存表单,选择的选择是正确保存在数据库中:

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

但是,当我想再次编辑这个形式,没有选择的选项是“选择”。他们保持不受限制。

我有一个其他字段(的EntityType,多),其被正确地与从数据库中的数据预填充。

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

我试图通过做类似于'$ foo-> setMyChoices(json_decode('[“my.choice.1”,“my.choice.2”]'));''复制你的问题(没有教条)控制器。这样,两个复选框都会被检查。你会尝试'dump($ myEntity-> getMyChoices())'来查看代码中实际加载的内容(由doctrine设置)吗? – Yoshi

+0

嗨,这里是树枝转储:'array:2 [▼ 0 =>“my.choice.1” 1 =>“my.choice.2” ]' –

回答

0

我的不好。

所有工作都是应该的。

我错就错在我的选择的名字,这是包含上信my.Choice.1, ...

在我的getter和setter,我强迫串是小写strtolower($myChoice)