Symfony динамически добавляет ввод данных и преобразует их в JSON - PullRequest
1 голос
/ 30 марта 2019

Так что это немного сложно объяснить.Дело в том, что у меня есть эта сущность

class TypeParking
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=55)
     */
    private $libelle;

    /**
     * @ORM\Column(type="time", nullable=true)
     */
    private $tempsmax;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $jourdebut;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $jourfin;

    /**
     * @ORM\Column(type="json_array", nullable=true)
     */
    private $heurstravail;

    /**
     * @ORM\Column(type="json_array", nullable=true)
     */
    private $exception;

, и это мой контроллер:


    /**
     * @Route("/new", name="type_parking_new", methods={"GET","POST"})
     */
    public function new(Request $request): Response
    {
        $typeParking = new TypeParking();
        $form = $this->createForm(TypeParkingType::class, $typeParking);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($typeParking);
            $entityManager->flush();

            return $this->redirectToRoute('type_parking_index');
        }

        return $this->render('type_parking/new.html.twig', [
            'type_parking' => $typeParking,
            'form' => $form->createView(),
        ]);
    }

<?php

namespace App\Form;

use App\Entity\TypeParking;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class TypeParkingType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('libelle')
            ->add('tempsmax')
            ->add('jourdebut')
            ->add('jourfin')
            ->add('heurstravail')
            ->add('exception')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => TypeParking::class,
        ]);
    }
}

Видите это поле исключения?Это тип JSON в базе данных.оно должно содержать имя, дату начала, дату окончания, время начала и время окончания.как это https://imgur.com/a/2qrz5yy всякий раз, когда я нажимаю эту кнопку «Плюс», я могу добавить другое поле исключения (JQuery).и когда я отправляю форму, все это поле исключения анализируется в JSON и сохраняется в базе данных вместе с остальной частью формы.Моя база данных: https://imgur.com/a/UonYT3W

Я уже несколько дней пытаюсь заставить это работать и не могу ничего сделать.

1 Ответ

1 голос
/ 30 марта 2019

тип вашей формы очень минималистичный.явно добавьте (под) поля для поля исключений.

<?php

namespace App\Form;

use App\Entity\TypeParking;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
// don't forget to add the types here!
use Symfony\Component\Form\Extension\Core\Type\TextType;

class TypeParkingType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('libelle')
            ->add('tempsmax')
            ->add('jourdebut')
            ->add('jourfin')
            ->add('heurstravail')
            ->add('exception_name', TextType::class, ['property_path' => 'exception[name]')
            // add other fields of exception, look at 
            // https://symfony.com/doc/current/reference/forms/types.html
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => TypeParking::class,
        ]);
    }
}

Надеюсь, это поможет ...

однако компонент формы (средство доступа к свойствам) попытается получить исключение, поэтомумы должны помочь, добавив следующее к классу сущностей TypeParking:

public function getException() {
    return array_merge([
        'name' => '', 
        // other sub-fields "empty" values
    ], $this->exception ?? [] // prevent array_merge from failing if exception is empty
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...