Ajax заполнение поля формы исходя из значений других полей

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

Аватар пользователя One_Two One_Two 14 августа 2019 в 2:38

Всем привет!

Прошу подсказать как подставить вычисленный #options для поля формы, на основании значений уже заполненных полей.

Начинаю создание формы, получаю две даты:

$form['start_date'] = array(
    '#type' => 'date_popup',
    '#title' => t('Start Date'),
    '#date_format' => 'd-m-Y',
  );

  $form['end_date'] = array(
    '#type' => 'date_popup',
    '#title' => t('End Date'),
    '#date_format' => 'd-m-Y',
  );

Затем делаю заготовку для поля вида tableselect, чтобы там чекбоксами отмечать даты:

$header = array(
      'date' => t('Date'),
 );

$form['date_intervals'] = array(
    '#type' => 'tableselect',
    '#title' => t('Date intervals'),
    '#prefix' => '<div id="date-intervals-div">',
    '#suffix' => '</div>',
    '#header' => $header,
  );

Навешиваю колбек на кнопку сгенерировать интервалы между введенными датами:

$form['generate'] = array(
    '#type' => 'submit',
    '#value' => t('Generate'),
    '#ajax' => array(
      'callback' => 'generate_date_intervals_callback',
      'wrapper' => 'date-intervals-div',
    ),
  );

$form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );

Получаю массив нужного вида, но он не подставляется в нужное поле:

function generate_date_intervals($form, &$form_state) {
// код где создаю массив вида $options[0] = array('date' => '2019-08-04') ... $options[N]
}

function generate_date_intervals_callback($form, &$form_state) {
  $form['date_intervals']['#options'] = generate_date_intervals($form, $form_state);
  return $form['date_intervals'];
}

Что сделано не так?

Лучший ответ

Аватар пользователя One_Two One_Two 3 сентября 2019 в 15:36

В общем тут не правильно всё, переделал)
$options должен собираться в форме, на кнопку "generate" нужно добавить сабмит, который просто ребилдит форму:

...

$form['generate'] = array(
    '#type' => 'submit',
    '#value' => t('Generate'),
    '#submit' => array('generate_date_intervals'),
    '#ajax' => array(
      'callback' => 'generate_date_intervals_callback',
      'wrapper' => 'date-intervals-div',
    ),
  );

...

function generate_date_intervals($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
}

Колбек возвращает обновленный кусочек без лишней логики:

function generate_date_intervals_callback($form, &$form_state) {
return $form['date_intervals'];
}

И в самой форме, при перестроении уже проверяем на form_state и начиняем своим способом $options:

  if (isset($form_state['values'])) {
    $header = [
      'date' => t('Date'),
    ];
    $options = generate_date_intervals_array($form_state);
  }

$form['date_intervals'] = array(
    '#type' => 'tableselect',
    '#title' => t('Date intervals'),
    '#prefix' => '<div id="date-intervals-div">',
    '#suffix' => '</div>',
    '#header' => isset($header) ? $header : null,
    '#options' => isset($options) ? $options : null,
  );

Буду рад если вдруг кому пригодится)

Комментарии

Аватар пользователя One_Two One_Two 14 августа 2019 в 11:16

Вот тут нашел ответ - https://geekquestion.com/5087281-zapolnenie-options-header-dlja-tablesel...

Перед тем как вернуть форму в generate_date_intervals_callback, нужно применить было к ней form_process_tableselect():

function generate_date_intervals_callback($form, &$form_state) {
  $form['date_intervals']['#options'] = generate_date_intervals($form, $form_state);
  $form['date_intervals'] = form_process_tableselect($form['date_intervals']);
  return $form['date_intervals'];
}
Аватар пользователя One_Two One_Two 3 сентября 2019 в 15:36

В общем тут не правильно всё, переделал)
$options должен собираться в форме, на кнопку "generate" нужно добавить сабмит, который просто ребилдит форму:

...

$form['generate'] = array(
    '#type' => 'submit',
    '#value' => t('Generate'),
    '#submit' => array('generate_date_intervals'),
    '#ajax' => array(
      'callback' => 'generate_date_intervals_callback',
      'wrapper' => 'date-intervals-div',
    ),
  );

...

function generate_date_intervals($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
}

Колбек возвращает обновленный кусочек без лишней логики:

function generate_date_intervals_callback($form, &$form_state) {
return $form['date_intervals'];
}

И в самой форме, при перестроении уже проверяем на form_state и начиняем своим способом $options:

  if (isset($form_state['values'])) {
    $header = [
      'date' => t('Date'),
    ];
    $options = generate_date_intervals_array($form_state);
  }

$form['date_intervals'] = array(
    '#type' => 'tableselect',
    '#title' => t('Date intervals'),
    '#prefix' => '<div id="date-intervals-div">',
    '#suffix' => '</div>',
    '#header' => isset($header) ? $header : null,
    '#options' => isset($options) ? $options : null,
  );

Буду рад если вдруг кому пригодится)