也许对我所需要的东西有完全不同和更好的方法,但这是我的情况,欢迎任何意见/建议。 我有实体:
/**
* @var string
* @ORM\Column(name="title", type="string", length=255, nullable=true)
*/
protected $title;
/**
* @var string
* @ORM\Column(name="description", type="string", length=1024, nullable=true)
*/
protected $description;
/**
* @var string
* @ORM\Column(name="extra_data", type="json_array", nullable=true)
*/
protected $extraData;
注意$extraData
- 这就是json_array
。
我有FormType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('items', 'collection', array(
'type' => new ItemType(),
'allow_add' => true,
'by_reference' => false,
'allow_delete' => true,
'options' => array(
'em' => $options['em'],
)
));
}
public function getName()
{
return 'form';
}
的ItemType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text', array(
'label' => false,
'required' => false,
))
->add('description', 'textarea', array(
'label' => false,
))
->add('extra_data', 'collection', array(
'type' => new ItemExtraDataType(),
'required' => false,
'allow_add' => false,
'by_reference' => false,
'allow_delete' => false,
));
}
public function getName()
{
return 'item';
}
ItemExtraDataType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('field1', 'text', array(
'required' => false,
))
->add('field2', 'text', array(
'required' => false,
));
}
public function getName()
{
return 'item_extra_data';
}
在Twig:
<form method="post" action="" id="form">
{% for item in form.items %}
{{ form_row(item.title) }}
{{ form_row(item.description) }}
{{ form_row(item.extra_data) }}
{{ form_rest(item) }}
{% endfor %}
{{ form_rest(form) }}
</form>
也尝试过:
{% for field, value in item.extra_data %}
{{ form_row(value) }}<br><br>
{% endfor %}
并尝试离开{{ form_rest(item) }}
,但没有改变。
因此永远不会打印出field1
和field2
。我无法输入这些JSON数组字段的值。也许我用它错了?另外,我想知道如何保存这个json_array
字段。
由于
P.S。使用Symfony 2.3.7
答案 0 :(得分:0)
Bellow我要离开旧答案,这对我有用,直到我必须实现更复杂的json_array。这是应该如何做的:
的ItemType:
->add('extra_data', new ItemExtraDataType(), array(
'label' => false,
'required' => false,
))
ItemExtraDataType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('field1', 'text', array(
'required' => false,
'label' => false,
))
->add('field2', 'text', array(
'required' => false,
'label' => false,
))
->add('field3', 'choice', array(
'choices' => MyChoices::getReadables(),
'empty_value' => 'empty',
'required' => false,
'label' => false,
))
;
}
public function getParent()
{
return 'form';
}
Twig模板:
{{ form_row(item.extra_data) }}
所以现在一切都按预期工作了。
旧答案
我相信有一个更好的解决方案,但这就是我所做的,并且最终有效。
实体:
/**
* @param array $extra_data
* @return Entity
*/
public function setExtraData(array $extra_data)
{
$this->extraData = $extra_data;
return $this;
}
/**
* @return array
*/
public function getExtraData()
{
$rs = $this->extraData;
return $rs ?: array('field1' => '', 'field2' => '');
}
ItemType(注意type
参数):
->add('extra_data', 'collection', array(
'type' => 'text',
'label' => false,
'required' => false,
'allow_add' => false,
'by_reference' => false,
'allow_delete' => false,
))
Twig模板:
{% for field, data in item.extra_data %}
{{ form_row(data, {'attr':{'placeholder':'extra_data.' ~ field}}) }}
{% endfor %}
两个字段都打印出来并保存没有任何问题。