Здравствуйте. У меня есть поле:
$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();), но как таким образом обратиться к полю и сменить его значение?
Комментарии
Такое лучше делать обычным js без аякса.
1. При таком варианте изменение значения в $form_state не изменится без ребилда формы. Вот такое даст больше шансов:
<?php
...
public function ajaxSetCurrentDateCallback(array &$form, FormStateInterface $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()
Короче, вариантов есть. Однако, не все подходят под конкретные цели и общий контекст задач, связанных с формой.