Symfony — изменение данных по умолчанию в прототипах

Так скажи, у меня есть Category и Product сущность, где Category имеет много Product юридические лица. мой Category Конструктор форм выглядит так:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('products', CollectionType::class, array(
'entry_type' => ProductType::class,
'allow_add' => true,
'by_reference' => false,
'allow_delete' => true,
'prototype' => true,
'prototype_name' => '__product_prot__'))
->add('save', SubmitType::class))
;
}

И мой Product Конструктор форм выглядит так:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('dateAdded', DateType::class)
;
}

То, что я хотел бы знать, как установить значение dateAdded чтобы при добавлении нового прототипа отображалась сегодняшняя дата?

Некоторые люди предложили использовать сущность __construct() функция для создания значения по умолчанию, но это не работает для прототипов. Я также нашел заполнитель вариант, но я не уверен, как его использовать, чтобы он всегда имел сегодняшнюю дату — то есть это не работает:

->add('addDate', DateType::class, array(
'placeholder' => new \DateTime();
))

Как ошибка: Attempted to call function "DateTime" from the global namespace

Кроме того, я нашел prototype_data поле в CollectionType поле, но опять же, я не уверен, как указать, чтобы поместить данные только в одно поле и сделать его динамическим.

Может кто-нибудь сказать мне лучший метод для использования — и правильный синтаксис?

Редактировать:

Так что мой __construct() похоже:

public function __construct()
{
$this->addDate = new \DateTime();
}

Который прекрасно работает для Category сущность (если я даю ей поле даты для тестирования), но не прототип Product юридическое лицо. Когда я загружаю прототип в форму, я просто получаю дату по умолчанию 1 января 2011 года. Прототип выглядит так:

{% block _category_products_entry_row %}
<li>
{{ form_row(form.name) }}
{{ form_row(form.dateAdded) }}
</li>
{% endblock %}

Интересно, я также нашел, если я загружаю новую форму с Product сущность, созданная уже в Category контроллер, dateAdded поле, которое появляется из-за:

{% for product in form.products %}
{{ form_row(product) }}
{% endfor %}

Имеет сегодняшнюю дату в качестве значения по умолчанию. Это подсказало бы мне, что загрузка прототипов осуществляется так же, как Как встроить коллекцию форм учебник — вызывает проблему.

0

Решение

Чтобы установить значение по умолчанию для поля формы, вы можете использовать свойство «data» и использовать FormEvent для обработки формы при обновлении. Вот результат:

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('dateAdded', DateType::class, array(
'data' => new \DateTime(),
))
;

$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
$product = $event->getData();
$form = $event->getForm();

if (!$product) {
return;
}

if ($dateAdded = $product->getDateAdded()) {
$form->add('dateAdded', DateType::class, array(
'data' => $dateAdded,
));
}
});
}

В PRE_SET_DATA вы можете переопределить значение по умолчанию в поле dateAdded с выбранными вами данными.

Для получения дополнительной информации вы можете посетить http://symfony.com/doc/current/reference/forms/types/date.html#data а также https://symfony.com/doc/current/form/events.html

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]