Вы здесь

Как организовать добавление составного значения поля материала с помощью развернутого(html) списка и checkbox?

0

Добрый день.
Прикладная задача такая:
В форме добавления ноды создать поле со списком некоторых значений, которые можно выбирать с помощью checkbox. В простейших случаях конечно можно сделать поле списком или ссылкой на термины(как было сделано) с соответствующим виджетом, но ситуация осложняется тем, что вместе с выбором пункта нужно вводить по нему дополнительные данные, т.е каждый выбранный пункт становится (пока логически) составным полем.

Если использовать Field collection для создания составного поля, то с возможностями "из коробки", для такого поля в настройках типа материала можно создать множественные значения по умолчанию, добавив все "пункты". При таком устройстве все и незадействованные "пункты" тоже будут ложиться в базу, коме прочих неудобств, что очень нежелательно. И если нужно будет добавить новый пункт в такой список, то придется добавлять его в каждую уже созданную ноду, что конечно, по хорошему, тоже не нужно.

Как организовать правильно, c чего подступиться?

Версия Drupal: 
8.x
Категория: 
Field APITaxonomy API
Связанные проекты: 
Field collection
Вопрос задан 23.08.2017 - 21:51

Без хука, думаю вы не сможете добиться результата
Делал с field_collection

/**
 * Implements hook_form_alter().
 */
function custom_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  $markas = custom_get_all_terms();
  if ($form_id == 'ФашИдФормы') {
    $key_widget = 0;
    foreach ($markas as $key => $marka) {
      $form['ИДПоля']['widget'][$key_widget]['field_marka']['widget']['#default_value'] = $key;
      $key_widget++;
    }
  }
}

function custom_get_all_terms() {
  $items = array();
  $terms = \Drupal::entityManager()
    ->getStorage('taxonomy_term')
    ->loadTree('ИдВашегоСловаря');
  if (!empty($terms)) {
    foreach ($terms as $term) {
      $item = \Drupal\taxonomy\Entity\Term::load($term->tid);
      $items[$item->id()] = $item->getName();
    }
  }
  return $items;
}

Надеюсь поможет вам
Пишите мы вам обязательно поможем
П.С.
Листинг вырван из контекста и удалено не нужное, но как основная подсказка, "направление", думаю, вам поможет

Комментарий оставлен 24.08.2017 - 06:47

Ответы

0

Обратите внимание на модуль DoubleField, возможно, он Вам поможет. Есть версии как под D7, так и под D8.

А вот его краткое описание - http://xandeadx.ru/blog/drupal/653

Ответ дан 23.08.2017 - 22:12

Спасибо, но нет. То же что и с Field Collection. Придется руками делать.

Комментарий оставлен 23.08.2017 - 23:39

Тогда, действительно, проще уже реализовать своё поле вместе со своим виджетом и форматтером.
Благо, в Drupal 8 это писать удобнее и понятнее, чем в Drupal 7.
А в Examples есть примеры.

Комментарий оставлен 24.08.2017 - 12:14
0
Ответ дан 23.08.2017 - 23:10

Спасибо, но это явно более громоздкое решение чем даже мое компромиссное.

Комментарий оставлен 23.08.2017 - 23:30