Виджет многозначной формы в форме настроек системы
Я создаю форму для страницы конфигурации модулей. Последняя строка обратного вызова формы следующая:
return system_settings_from($form);
Я хочу добавить текстовое поле в форму, но я хочу иметь возможность вводить несколько полей в поле, используя тот же вид, который вы получаете, когда вручную создаете поле этого типа (где мощность> 1), где вы получаете текстовое поле с кнопкой «добавить другой элемент».
Как я могу использовать этот вид виджетов в форме для страницы конфигурации модуля?
1 ответ
Вы не сможете использовать многозначные функциональные возможности, используемые в API полей в пользовательских формах.
Однако с помощью API форм и Ajax вы должны иметь возможность создавать динамические поля формы. См. Пример Ajax в Примеры для разработчиков . То, что вы хотите достичь здесь, относительно похоже на Генерировать текстовые поля и Подробные флажки , где поля добавляются в форму на лету.
<?php
/**
* Form manipulation through AJAX.
*/
function ajax_example_autocheckboxes($form, &$form_state) {
// Since the form builder is called after every AJAX request, we rebuild
// the form based on $form_state.
$num_checkboxes = !empty($form_state['values']['howmany_select']) ? $form_state['values']['howmany_select'] : 1;
$form['howmany_select'] = array(
'#title' => t('How many checkboxes do you want?'),
'#type' => 'select',
'#options' => array(1 => 1, 2 => 2, 3 => 3, 4 => 4),
'#default_value' => $num_checkboxes,
'#ajax' => array(
'callback' => 'ajax_example_autocheckboxes_callback',
'wrapper' => 'checkboxes-div',
'effect' => 'slide',
),
);
...
for ($i = 1; $i <= $num_checkboxes; $i++) {
$form['checkboxes_fieldset']["checkbox$i"] = array(
'#type' => 'checkbox',
'#title' => "Checkbox $i",
);
}
...
return $form;
}
/**
* Callback for autocheckboxes.
*
* @return array
* Renderable array (the checkboxes fieldset)
*/
function ajax_example_autocheckboxes_callback($form, $form_state) {
return $form['checkboxes_fieldset'];
}
Другим, быстрым решением, которое может работать (или нет) для вашего случая, является использование объекта (например, одного узла нового типа содержимого) для хранения этой конфигурации.