Я хочу визуализировать средство выбора даты и времени с помощью форм Symfony.
Поскольку для выбора даты и времени требуется только ввод текста (поскольку он возвращает простую строку), я решил использовать форму DataTransformers для преобразования данных из даты и времени в строку и наоборот.
Но когда я пытаюсь отобразить свою страницу, я получаю следующее сообщение об ошибке:
Невозможно преобразовать значение для пути свойства "[myDateTime]": ожидается \ DateTimeInterface.
Мой класс контроллера выглядит следующим образом:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
/**
* Class HomeController
* @package App\Controller
*/
class HomeController extends Controller
{
/**
* @Route("/test", name="form_test")
*/
public function testForm(Request $request)
{
$data = ['myDateTime' => new \DateTime()];
$builder = $this->createFormBuilder($data)
->add('myDateTime', DateTimeType::class, ['label' => 'My datetime']);
$builder
->get('myDateTime')
->addModelTransformer(new DateTimeToStringTransformer(null, null, 'd/m/Y H:i'));
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
dump($form->getData());
}
return $this->render('test.html.twig', [
'form' => $form->createView(),
]);
}
}
Шаблон моего представления настолько прост:
{% extends 'base.html.twig' %}
{% block body %}
{{ form_start(form) }}
{{ form_widget(form) }}
<button class="btn btn-success">{{ button_label|default('Send') }}</button>
{{ form_end(form) }}
{% endblock %}
Для визуализации моего средства выбора даты и времени я использовал темы форм, хранящиеся в form / fields.html.twig:
{% use "bootstrap_4_layout.html.twig" %}
{% block datetime_row %}
<div class="form-group">
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
{{ form_help(form) }}
</div>
{% endblock %}
{% block datetime_widget %}
<div class="input-group date" id="{{ id }}" data-target-input="nearest">
<input type="text" class="form-control datetimepicker-input" data-toggle="datetimepicker" data-target="#{{ id }}" {% if value %}value="{{ value|e('html_attr') }}"{% endif %}/>
<div class="input-group-append" data-target="#{{ id }}" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
{% endblock datetime_widget %}
И добавил эту тему в конфигурационный файл twig.yaml:
twig:
paths: ['%kernel.project_dir%/templates']
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
form_themes:
- 'bootstrap_4_layout.html.twig'
- 'form/fields.html.twig'
Кто-нибудь помогает мне понять, почему это не работает или что я делаю не так?