Я хочу заполнить набор полей формы на основе шаблона, выбранного из поля tableselect, и иметь возможность впоследствии изменить некоторые поля вручную, если это необходимо. Кажется, что $ form_state ['values'] не отражает эти последние изменения.
Например, я выбираю «Вариант 2» в таблице выбора. Текстовое поле меняется на «текст 2», как и ожидалось. Затем я набираю Обновлено в текстовое поле и нажимаю «Отправить».
Хуки проверки и отправки получают значение $ forms_state ['values'] ['text'], равное "Text 2". Измененный текст («Обновлено») можно найти только в $ form_state ['input'] ['text'].
См. Код ниже.
<?php
function _pilates_test_dropdown_form($form, &$form_state) {
$header = array();
$data = [1 => ["name" => 'option 1', "text" => 'text 1'],
2 => ["name" => 'option 2', "text" => 'text 2'],
];
$header[] = t('Option');
$header[] = t('Text');
$options = array();
foreach ($data as $data_id => $item) {
if(! isset($initial_option_id)) {
$initial_option_id = $data_id;
}
$options[$data_id] = array();
$options[$data_id][] = $item['name'];
$options[$data_id][] = $item['text'];
}
$selected_id = empty($form_state['values']['selected_id']) ?
$initial_option_id
:
$form_state['values']['selected_id'];
$form['selected_id'] = array(
'#type' => 'tableselect',
'#header' => $header,
'#options' => $options,
'#multiple' => FALSE,
'#default_value' => $selected_id,
'#ajax' => array(
'callback' => '_pilates_test_dropdown_ajax_callback',
'wrapper' => 'item-details-div',
'method' => 'replace',
'effect' => 'fade',
),
);
$form['details'] = array(
'#type' => 'container',
'#prefix' => '<div id="item-details-div">',
'#suffix' => '</div>',);
$form['details']['text'] = array(
'#type' => 'textfield',
'#description' => t('This field value is set after tableselect change.'),
'#value' => $data[$selected_id]['text'],
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
function _pilates_test_dropdown_form_submit($form, &$form_state) {
dpm($form_state);
}
function _pilates_test_dropdown_form_validate($form, &$form_state) {
// already failed some checks ?
if (form_get_errors()) {
return;
}
dpm($form_state);
}
function _pilates_test_dropdown_ajax_callback($form, $form_state) {
return $form['details'];
}