【问题标题】:Symfony collection forms - Save to json_arraySymfony 集合表单 - 保存到 json_array
【发布时间】:2019-05-13 19:44:58
【问题描述】:

想要创建字段集合并存储在一个 db 列类型 json_array 中?

我的实体有列 date_data 是 json_array 类型。我想在前端渲染两个字段。

First Field -> from - 日期类型。
第二个字段 -> 到日期类型。

我使用 jQuery 中继器库,用于将此字段呈现为前端的中继器字段。并希望像这样将来自转发器的字段数据存储在 db 中的 date_data 列中。

[{"from": '12/31/2009' , "to": '01/16/2010' }, {"from": '02/10/2011' , "to": '02/16/2011' }]

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案1】:

    您可以为您的数据创建带有json 列的实体:

    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * Test
     *
     * @ORM\Table(name="test")
     * @ORM\Entity(repositoryClass="App\Repository\TestRepository")
     */
    class Test
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", options={"unsigned":true})
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
    
        /**
         * @var array|null
         *
         * @ORM\Column(name="data", type="json", nullable=true)
         */
        private $data;
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getData(): ?array
        {
            return $this->data;
        }
    
        public function setData(?array $data): self
        {
            $this->data = $data;
    
            return $this;
        }
    }
    

    和2种形式:第一种用于实体,第二种用于数据收集项:

    应用\表单\测试

    namespace App\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type as FormType;
    
    class Test extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('data', FormType\CollectionType::class, [
                    'allow_add' => true,
                    'allow_delete' => true,
                    'entry_type' => 'App\\Form\\Data',
                    'label' => 'Data',
                ])
                ->add('save', FormType\SubmitType::class, [
                    'label' => 'Save',
                ]);
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => 'App\\Entity\\Test',
            ]);
        }
    }
    

    应用\表单\数据

    namespace App\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type as FormType;
    
    class Data extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('from', FormType\TextType::class, [
                    'label' => 'from',
                ])
                ->add('to', FormType\TextType::class, [
                    'label' => 'to',
                ]);
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
        }
    }
    

    在控制器中

        $test = $this->getDoctrine()->getRepository('App:Test')->find(1);
    
        $form = $this->createForm(\App\Form\Test::class, $test, []);
    
        $form->handleRequest($request);
    
        if ($form->isSubmitted() && $form->isValid()) {
            dump($form->getData());
            $this->getDoctrine()->getManager()->flush();
        }
    

    【讨论】:

    • Tnx。我认为它有效。但我不知道如何在 .twix 中呈现表单。我使用{{ form_start(form) }} {{ form_row(form) }} <ul> {% for fields in form.data %} <li> {{ form_errors(fields) }} {{ form_widget(fields) }} </li> {% endfor %} </ul> {{ form_end(form) }},但在浏览器中看不到字段。
    • 可以渲染整个表单{{ form(form) }}
    • 我知道,但在 dom 我有
      标签和其他东西。但我不能在 folection 中找到字段。从和到字段
    • 试试<li> {{ form_errors(fields) }} {{ form_errors(fields.from) }} {{ form_widget(fields.from) }} {{ form_errors(fields.to) }} {{ form_widget(fields.to) }} </li>
    • 似乎数据字段为空。尝试设置一些测试值。例如:[{"to": "01/16/2010", "from": "12/31/2009"}, {"to": "02/16/2011", "from": "02/10/2011"}]。同时清理学说元数据缓存php ./bin/console doctrine:cache:clear-metadata
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多