【问题标题】:symfony render json_array entity type and save using formsymfony 渲染 json_array 实体类型并使用表单保存
【发布时间】:2016-09-27 22:56:19
【问题描述】:

假设我有一个 Article 实体。
并且在这个实体中有一个 json_array 类型的报告属性。

Json_array 的数据可能喜欢
{"key1":"value1","key2":{"k1":"v1","k2","v2"...},"key3":["v1","v2","v3" ...]...}。
我的意思是 json_array 可能包含简单的 key:value
或者 value 也可能包含 key:vaule
或者 value 可能是一个数组。

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

}

【问题讨论】:

  • 在编辑表单时,是否希望标签为key1key2等的值?如:用户添加报表字段时,编辑文章时报表字段会有客户自己填写的标签?
  • 标签就像symfony表单的标签一样可以轻松自定义。不需要用户临时添加报表字段。

标签: arrays json forms symfony


【解决方案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 }

最后在你的表单中使用这个新的数据类型:

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

【讨论】:

  • 如果这样的话,我无法管理标签,例如我想改变key1显示k1,key2显示k2等等。同时,每个字段类型可能不会相同的.一些是文本类型,一些是日期时间类型。
  • 感谢您的回复,对不起,我忘记说我使用的是 symfony 2.8。在 symfony2.8 中,collection 中似乎没有 type 选项。在 2.8 中是 entry_type 。我猜你回复的版本低于 2.8,看到你的答案我很兴奋。
  • 我没有发现成功。标签和字段类型都不起作用(标签仍然是原始的,字段类型仍然相同)。
  • 我发现定义报表服务似乎没有必要。
  • 我更新了我的 sf 2.8 答案,因为我不在家,所以无法测试:(,您需要调整键的类型以满足您的需求
【解决方案2】:

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

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

在成功的时候用这个值做一些事情

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

希望对你有帮助。

罗杰

【讨论】:

  • 您的意思是将报告的每个字段(例如,key1,key2,key3...)添加到表单构建并映射每个字段 false ?如果是这样,我如何将这些未映射的值转换为表单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2016-06-26
  • 2021-10-08
  • 2016-03-21
  • 1970-01-01
相关资源
最近更新 更多