Так скажи, у меня есть 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 %}
Имеет сегодняшнюю дату в качестве значения по умолчанию. Это подсказало бы мне, что загрузка прототипов осуществляется так же, как Как встроить коллекцию форм учебник — вызывает проблему.
Чтобы установить значение по умолчанию для поля формы, вы можете использовать свойство «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
Надеюсь, поможет
Других решений пока нет …