【问题标题】:Symfony, how to render and save use formSymfony,如何渲染和保存使用表单
【发布时间】:2016-09-26 12:06:10
【问题描述】:

假设我有一个 Article 实体,并且在这个实体中有一个 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;

}

【问题讨论】:

    标签: arrays json forms symfony


    【解决方案1】:

    这是我的看法。听起来您需要集合中的自定义表单类型和转换器。这个想法是您创建一个自定义表单类型来容纳您的键/值对,我们称之为KeyValueType。接下来,您想使用CollectionType 作为包装器将此类型添加到您的ArticleType。为了将您的 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);
                    }
                ));
        }
    }
    

    【讨论】:

    • 我试过你的代码。我发现在编辑表单时,无法从数据库中加载报表数据。另一个问题是我也希望密钥标签可以显示在表单中。非常感谢您的帮助!
    • @jmz 如果 json 没有从数据库字段正确解码到表单字段,您需要调试回调转换器的第一个闭包中发生的情况。关于第二个问题,您需要在 SO 上创建另一个问题。
    • 感谢您的回复!你给我一个好主意。我已经解决了这个问题。我已经为另一个帖子创建了第二个问题。
    • 第二个问题在这里。期待您的回复。stackoverflow.com/questions/37520112/…
    猜你喜欢
    • 2016-09-27
    • 2015-08-04
    • 2015-05-16
    • 1970-01-01
    • 2014-05-25
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多