Получить время, необходимое пользователю для заполнения формы в Symfony

Я хотел бы получить время, затраченное пользователем на заполнение формы при использовании формы Symfony.

Мой текущий код выглядит следующим образом (у меня есть сущность и связанная с ней форма):

$entity = new Entity();
$form = $this->get('form.factory')->create(new EntityType(), $entity);

$begin_time = new \DateTime();

if ($form->handleRequest($request)->isValid() && $form->get('save')->isClicked()) {
$end_time = new \DateTime();
$delta_time = $end_time->diff($begin_time);
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
}

Когда я отправляю форму, мои переменные $ begin_date и $ end_date равны, таким образом, мой интервал равен нулю. Это связано с тем, что при отправке формы контроллер повторно инициализируется, и в результате $ begin_time снова изменяется?

Я также пытался создать условие, когда форма не отправляется:

if(!$form->get('save')->isClicked()) {
$begin_time = new \DateTime();
}

Тем не менее, я все еще получаю $ begin_time, равное $ end_time. Поэтому мой вопрос: возможно ли получить интервал времени, необходимый пользователю для заполнения формы, и как это сделать в Symfony?

Спасибо за ваши предложения.

0

Решение

Добавить скрытый ввод в EntityType с параметром «data», установленным на текущую метку времени.

//Untested code
$builder->add('begin_date', HiddenType::class, array(
'data' => time(),
'mapped' => false
));

При обработке отправки формы получите текущую метку времени на сервере и вычтите сумму, полученную при скрытом вводе.

//Untested code
if ($form->handleRequest($request)->isValid() && $form->get('save')->isClicked()) {
$begin_time = $form->getData()['begin_date'];
$end_time = new \DateTime();
$delta_time = $end_time->diff($begin_time);
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
}

Важно то, что вам нужно получить значение $ begin_data из данных формы, который содержит значение, которое вы установили в исходном запросе.

Теперь $ delta_time должен дать вам время в секундах от загрузки страницы и отправки (игнорируя передачу по сети & время рендеринга в браузере).


Если вы хотите измерить время, когда пользователь начинает писать в форме, вы можете привязать функцию к событию «input» в форме, чтобы оно устанавливало скрытый ввод при первом запуске.

2

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector