Смена значения поля "date" с помощью ajax

Главные вкладки

Аватар пользователя mmjmm mmjmm 30 марта 2023 в 8:20

Здравствуйте. У меня есть поле:
$form['date'] = [
'#type' => 'date',
'#title' => $this->t('Дата'),
];

Необходимо ниже этого поля сделать ссылку/кнопку (что угодно) под названием "Текущая дата", что бы при нажатии на это в поле "date" значение менялось на текущую дату (date("Y-m-d"))

как вариант приходит в голову создать кнопку:
$form['date_now'] = [
'#type' => 'button',
'#value' => 'Текущая дата',
'#ajax' => [
'callback' => '::ajaxSetCurrentDateCallback',
'event' => 'click',
],
];

И написать функцию:
public function ajaxSetCurrentDateCallback(array &$form, FormStateInterface $form_state){
$form_state->setValue('topicality', date("Y-m-d"));
}

Но установка значения в поле не работает. наверное, необходимо создать объект класса ($response = new AjaxResponse();), но как таким образом обратиться к полю и сменить его значение?

Комментарии

Аватар пользователя OldWarrior OldWarrior 31 марта 2023 в 15:18

mmjmm wrote: И написать функцию:
public function ajaxSetCurrentDateCallback(array &$form, FormStateInterface $form_state){
$form_state->setValue('topicality', date("Y-m-d"));
}

1. При таком варианте изменение значения в $form_state не изменится без ребилда формы. Вот такое даст больше шансов:

<?php
...
public function 
ajaxSetCurrentDateCallback(array &$formFormStateInterface $form_state){
  
$form_state->setValue('topicality'date("Y-m-d"));
  
$form_state->setRebuild(TRUE);
}
...
?>

2. Однако, сама конструкция какая-то некошерная. По канонам нужно оборачивать поле даты в AJAX-wrapper, который указывать в свойствах '#ajax' кнопки-сабмита. А кроме этого, в коллбеке не устанавливать дату в $form_state, а менять свойство '#default_value' поля даты.

3. Наконец, можно ещё в коллбеке писать что-то (какой-то флаг) в $form_state, а в build-функции проверять это значение и соответственно, менять '#default_value' поля даты. Ещё лучше тогда при этом манипулироавать с $form_state->setUserInput()

Короче, вариантов есть. Однако, не все подходят под конкретные цели и общий контекст задач, связанных с формой.