Symfony,如何渲染和保存使用形式

时间:2016-05-28 05:26:09

标签: arrays json forms symfony

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

Json_array的数据,如{"key1":"value1","ke2":"value2",...}

现在我不知道如何使用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;

}

1 个答案:

答案 0 :(得分:0)

这是我的看法。听起来你需要在集合和变换器中使用自定义表单类型。我们的想法是,您创建一个自定义表单类型来容纳您的键/值对,让我们称之为KeyValueType。接下来,您要使用ArticleType作为包装器将此类型添加到CollectionType。为了将json转换为表单的可用数据结构,反之亦然,使用变换器。

KeyValueType类:

class KeyValueType extends AbstractType
{
    public function buildForm($builder, $options)
    {
        $builder
            ->add('key')
            ->add('value');
    }
}

ArticleType类:

class ArticleType extends AbstractType
{
    public function buildForm($builder, $options)
    {
        $builder
            ->add('report', CollectionType::class, [
                'entry_type' => KeyValueType::class,
                'allow_add' => true,
                'allow_delete' => true,
            ]);

        $builder->get('report')
            ->addModelTransformer(new CallbackTransformer(
                function ($reportJson) {
                    // $reportJson has the structure {"key1":"value1","ke2":"value2",...}
                    if ($reportJson == null) {
                        return null;
                    }

                    $data = [];
                    foreach (json_decode($reportJson, true) as $key => $value) {
                        $data[] = ['key' => $key, 'value' => $value];
                    }

                    return $data;
                },
                function ($reportArray) {
                    // $reportArray has the structure [ [ 'key' => 'key1', 'value' => 'value1'], [ 'key' => 'key2', 'value' => 'value2'] ]
                    if ($reportArray == null) {
                        return null;
                    }

                    $data = [];
                    foreach ($reportArray as $report) {
                        $data[$report['key']] = $report['value'];
                    }

                    return json_encode($data);
                }
            ));
    }
}