symfony渲染json_array实体类型并使用表单保存

时间:2016-05-30 07:38:17

标签: arrays json forms symfony

想象一下,我有一个文章实体 并且在此实体中有一个report属性,它是一个json_array类型。

Json_array的数据可能像是 {" KEY1":"值1"" KEY2" {" K1":" V1"&#34 ; K2"" V2" ...}," KEY3":[" V1"" V2"&#34 ; V3" ...] ...}
。 我的意思是json_array可能包含简单的键:值
或者值也可能包含键:vaule
或值可能是数组。

现在我不知道如何使用symfony表单来渲染和保存这些json_array,就像其他普通属性(例如标题)一样。
同时,我想管理密钥标签名称意思名称就像更改标题字段的标签一样 如何实现这一点,我感到非常困难。

class Article
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255)
     */
    private $title;

    /**
     * @var array
     *
     * @ORM\Column(name="report", type="json_array")
     */
    private $report;

}

2 个答案:

答案 0 :(得分:1)

也许你可以使用json_decode从json传递到数组,然后以你可以使用的形式传递:

 ->add('someField', null, array('mapped' => false))

成功地用这个值做了一些事情

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// some awesome code here
}

希望这可以帮到你。

罗杰

答案 1 :(得分:1)

您可以创建数据类型来管理报告字段:

namespace Acme\TestBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class ReportType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('key1',TextType::class,array('label' => 'K1'))
                ->add('key2',TextType::class,array('label' => 'K2'))
            ;
        }

        public function getName()
        {
            return 'report';
        }
    }

然后声明新数据类型:

# src/Acme/TestBundle/Resources/config/services.yml
services:
    acme_test.form.type.report:
        class: Acme\TestBundle\Form\Type\ReportType
        tags:
            - { name: form.type, alias: report }

最后在表单中使用这个新的dataType:

->add('reports',
            'collection',
            array(
                'type'=>'report',
                'prototype'=>true,
                'allow_add'=>true,
                'allow_delete'=>true,
                'options'=>array(
                )
            )
        )