#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
)? Если да, должна ли форма отображать их все? Должна ли быть возможность добавить (и / или удалить) другое исключение в этой форме?