«Добавить больше» Таксономия Термин Виджет


8

Я пытаюсь создать виджет поля, который похож на обычный виджет ссылки на термины с одним ключевым отличием. Пользователь должен иметь возможность добавлять несколько новых терминов таксономии одновременно, это может продемонстрировать это лучше:

введите описание изображения здесь

Я дошел до того, что функциональность схожа с тем, что предоставляют модули таксономии / опций / списка (т.е. отображаются флажки / радио, сохраняются и т. Д.)

Вот важный фрагмент кода, который я использую 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;
}

Когда я сохраняю сущность, я получаю сообщение о том, что оно сохранено. Когда я проверяю таблицу на предмет поля, она не сохраняется. Что я делаю неправильно?

Ответы:


2

Я уверен, что вы могли бы сделать это в hook_field_widget_form()(что, я предполагаю, где ваш текущий код), просто добавив дочерний элемент к существующему элементу, например

$element['text'] = array(
  '#type' => 'textfield',
  '#title' => 'Title',
  // etc...
);

Если это не сработает, я знаю, что это точно сработает, если вы используете hook_field_widget_form_alter().

Например, ниже приведена небольшая функция, которая включает altполе для типа поля «Изображение» с помощью виджета «Выбор носителя» (по какой-то причине он не включен по умолчанию):

function media_image_attributes_field_widget_form_alter(&$element, &$form_state, &$context) {
  if ($context['field']['type'] == 'image') {
    $element['alt'] = array(
      '#type' => 'textfield',
      '#title' => 'Image Description',
      '#weight' => 10000,
      '#default_value' => count($element['#default_value']) ? $element['#default_value']['alt'] : ''
    );
  }
}

Что касается функциональности ajax, я думаю, вы определенно идете по правильному пути. Я думаю, что модуль Field Example в примерах имеет некоторый пример кода, который может помочь.


Спасибо за ответ, я проголосовал за него, поскольку он дал мне хорошую информацию для продолжения, но не совсем ответил на него! Посмотрите мои изменения, в которых содержится дополнительная информация о том, что я пробовал, благодаря вашему ответу.
splatio

@ Splat Вы смогли реализовать работающий виджет? Хотели бы вы поделиться этим?
Джо Бекман

Извините, Джо, я не смог разобраться с этим и в итоге использовал совершенно другой подход! Если вы решите это, опубликуйте здесь, так как мне было бы интересно, как на будущее. Я также с радостью принял бы это как ответ.
splatio

@ Splatio Можете ли вы дать некоторую информацию о вашем альтернативном подходе?
vfclists

1

Модуль Иерархический Выбор, по крайней мере, очень близок к тому, чего вы хотите достичь. Его виджет выглядит немного иначе, но в основном выполняет ту же работу и будет хорошей отправной точкой для настройки. Взгляните на демонстрационные места по таксономии, которые я посетил .

Другим вариантом может быть модуль Autocomplete Deluxe .


0

Я только что нашел модуль Taxonomy Other, который может удовлетворить ваши потребности.

Это простой модуль для добавления необязательного '- Другое -' в списки выбора таксономии. Это позволяет пользователям с соответствующими разрешениями создавать новые условия.

Для порта Drupal 7, проверьте: Порт Таксономия Другое до D7 ( прямая связь ).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.