Всем привет!
Прошу подсказать как подставить вычисленный #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'];
}
Что сделано не так?
Комментарии
см. examples ajax & form
Вдоль и поперек излазил, там нет такого примера
Вот тут нашел ответ - https://geekquestion.com/5087281-zapolnenie-options-header-dlja-tablesel...
Перед тем как вернуть форму в generate_date_intervals_callback, нужно применить было к ней form_process_tableselect():
$form['date_intervals']['#options'] = generate_date_intervals($form, $form_state);
$form['date_intervals'] = form_process_tableselect($form['date_intervals']);
return $form['date_intervals'];
}
В общем тут не правильно всё, переделал)
$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;
}
Колбек возвращает обновленный кусочек без лишней логики:
return $form['date_intervals'];
}
И в самой форме, при перестроении уже проверяем на form_state и начиняем своим способом $options:
$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,
);
Буду рад если вдруг кому пригодится)