Я пытаюсь создать виджет поля, который похож на обычный виджет ссылки на термины с одним ключевым отличием. Пользователь должен иметь возможность добавлять несколько новых терминов таксономии одновременно, это может продемонстрировать это лучше:
Я дошел до того, что функциональность схожа с тем, что предоставляют модули таксономии / опций / списка (т.е. отображаются флажки / радио, сохраняются и т. Д.)
Вот важный фрагмент кода, который я использую hook_field_widget_form()
:
$element += array(
'#type' => $multiple ? 'checkboxes' : 'radios',
'#default_value' => $multiple ? $default_value : reset($default_value),
'#options' => $options,
'#value_key' => $value_key,
'#element_validate' => array('options_field_widget_validate'),
'#properties' => $properties,
);
Что меня бросает в глаза, так это то, что $ element не является вашим обычным массивом форм, поэтому я не уверен, как добавить текстовое поле и кнопку, и - тем более, что их значения не предназначены для сохранения. Как лучше всего добавить эти поля в мой виджет?
Что касается добавления необходимого Javascript, я прав, думая, что я должен использовать #ajax, который вызывает функцию, которая перестраивает #options для флажков?
Заранее спасибо!
РЕДАКТИРОВАТЬ - мой первоначальный вопрос был довольно расплывчатым, вот еще несколько деталей о том, что я пытался:
$element += array(
'#type' => 'fieldset',
'#delta' => $delta,
);
$element['value'] = array(
'#type' => $multiple ? 'checkboxes' : 'radios',
'#default_value' => $multiple ? $default_value : reset($default_value),
'#options' => $options,
'#value_key' => $value_key,
'#element_validate' => array('options_field_widget_validate'),
'#properties' => $properties,
);
$element['text'] = array(
'#type' => 'textfield',
'#title' => t('Add another'),
'#weight' => 5,
);
Это объединение различных примеров, которые я видел, и, кажется, приближает меня. Проблема в том, что когда я отправляю форму сущности, я получаю следующую ошибку:
Примечание: неопределенный индекс: tid в taxonomy_field_is_empty () (строка 1402 из модулей \ taxonomy \ taxonomy.module).
Я более внимательно посмотрел на эту функцию, и она рассчитывает $item
получить структуру $item = array('tid', 2)
. При использовании приведенного выше кода, кажется, что откуда-то идет дельта, и структура в $item
итоге оказывается $item = array(0, array('tid', 2)
. Я не могу понять, откуда идет 0?
ДРУГОЕ РЕДАКТИРОВАНИЕ
Я смог исправить вышеуказанную ошибку с помощью следующего кода, изменив элемент $ следующим образом:
$element += array(
'#type' => 'fieldset',
'#process' => array('taxonomy_free_entry_ignore_parent'),
);
и добавив функцию:
function taxonomy_free_entry_ignore_parent(&$form, &$form_state, $complete) {
array_pop($form['#parents']);
return $form;
}
Когда я сохраняю сущность, я получаю сообщение о том, что оно сохранено. Когда я проверяю таблицу на предмет поля, она не сохраняется. Что я делаю неправильно?