управление заполнением поля в форме редактирования

#php #symfony #symfony4

#php #symfony #symfony4

Вопрос:

Я использую symfony 4, и у меня есть эта форма:

 
<?php

namespace AppForm;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormExtensionCoreTypeDateTimeType;
use SymfonyComponentFormExtensionCoreTypeTimeType;
use SymfonyComponentFormExtensionCoreTypeDateType;
use SymfonyComponentFormExtensionCoreTypeCollectionType;

use AppEntityTypeParking;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;

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


            ->add('Exception_Name', TextType::class, ['property_path' => 'exception[name]'])
            ->add('Starting_date', DateType::class, [
                'property_path' => 'exception[datedebut]',
            ])
            ->add('Ending_date', DateType::class, [
                'property_path' => 'exception[datefin]',
            ])
            ->add('Starting_time', TimeType::class, ['property_path' => 'exception[heuredebut]'])
            ->add('Ending_time', TimeType::class, ['property_path' => 'exception[heurefin]'])


        ;
    }

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

Когда я создаю новую форму, я обычно беру значения Exception_Name, Starting_date, Ending_date, Starting_time и Ending_time вручную и помещаю их в один массив json в одном поле базы данных.
Однако, когда я перехожу к редактированию формы, данные внутри json не разделяются для заполнения каждого из полей.

допустим, у меня есть этот массив json: {«Исключения»: {«name»: «6fdfs», «StartDate»: «2015-03-03», «StartHour»: «00:00:00″, » Дата окончания»: «2015-03-03», «Конечный час»: «00:00:00»}} Я собираюсь взять значение name и использовать его для заполнения поля Exception_Name и т.д…

TL; DR: Как я могу контролировать, как я хочу предварительно заполнить каждое поле формы редактирования

Редактировать: это мой datamapper

 <?php
// src/Form/DataMapper/ColorMapper.php
namespace AppFormDataMapper;

use AppPaintingColor;
use SymfonyComponentFormDataMapperInterface;
use SymfonyComponentFormExceptionUnexpectedTypeException;
use SymfonyComponentFormFormInterface;

final class TypeParkingMapper implements DataMapperInterface
{
    /**
     * @param TypeParking|null $data
     */
    public function mapDataToForms($data, $forms)
    {
        // there is no data yet, so nothing to prepopulate
        if (null === $data) {
            return;
        }

        /** @var FormInterface[] $forms */
        $forms = iterator_to_array($forms);
       // initialize form field values
       $Excep=$data->getException();
       $forms['Exception_Name']->setData($Excep['Exceptions']['name']);
       $forms['Starting_date']->setData($Excep['Exceptions']['StartDate']);
       $forms['Ending_date']->setData($Excep['Exceptions']['EndingDate']);
       $forms['Starting_time']->setData($Excep['Exceptions']['StartHour']);
       $forms['Ending_time']->setData($Excep['Exceptions']['EndingHoure']);



    }

    public function mapFormsToData($forms, amp;$data)
    {
        /** @var FormInterface[] $forms */
        $forms = iterator_to_array($forms);

        // as data is passed by reference, overriding it will change it in
        // the form object as well
        // beware of type inconsistency, see caution below
        $data = new TypeParking(
            $forms['Exception_Name']->getData()

        );
    }
}
  

Таким образом, он отлично работает, когда я редактирую объект (поскольку getException() возвращает массив json из моей базы данных), но когда я создаю новый объект, он выдает ошибку, поскольку нет данных для получения.
Итак, есть ли какой-либо способ отключить отображение при создании новой формы и активировать его только при редактировании формы?

ошибка: «Уведомление: Неопределенный индекс: исключения»

Ответ №1:

Вы могли бы написать DataMapper, чтобы полностью контролировать, как ваши данные отображаются в вашей форме.

Комментарии:

1. это работает, только если вы используете Sonata bundle, я использую обычный symfony 4.

2. @Hyperion нет, приложения для обработки данных в основном из Symfony. symfony.com/doc/current/form/data_mappers.html

3. Я понял, как его использовать (вроде как), он отлично работает при редактировании существующего объекта, но всякий раз, когда я хочу создать новый, я получаю сообщение об ошибке, потому что он не смог найти какой-либо объект, есть ли способ отключить его при создании новых форм?

4. Не могли бы вы написать, какую ошибку вы получаете? Также — я считаю, что в ссылке @Jakumi, приведенной в первых 3 строках в mapDataToForms , должен быть обработан ваш случай.

5. Можете ли вы также вставить TypeParking объект? Может ли быть более одного исключения в JSON (как предполагает множественный ключ Exceptions )? Если да, должна ли форма отображать их все? Должна ли быть возможность добавить (и / или удалить) другое исключение в этой форме?