diff --git a/js/libs/jquery.simpler-select.js b/js/libs/jquery.simpler-select.js index c5fbb23..9fe56c6 100755 --- a/js/libs/jquery.simpler-select.js +++ b/js/libs/jquery.simpler-select.js @@ -52,9 +52,9 @@ var $currentSelect = $selectElement; if (initialValue) { - if (typeof initialValue !== 'string') { - // If array, flatten it. - initialValue = initialValue.shift(); + if (initialValue instanceof Array) { + // If array, get the last / deepest value. + initialValue = initialValue.pop(); } // Get all parents, starting from the initial value. @@ -152,6 +152,13 @@ parentValue = selectedValue; } + if (undefined !== that.$element.attr('multiple')) { + that.$element.val(undefined); + var parents = that.getAllParents(parentValue); + parents.push(parentValue); + parentValue = parents; + } + that.$element .val(parentValue) .change(); diff --git a/src/CshsOptionsFromHelper.php b/src/CshsOptionsFromHelper.php index 1d38259..b3e7031 100644 --- a/src/CshsOptionsFromHelper.php +++ b/src/CshsOptionsFromHelper.php @@ -24,6 +24,7 @@ trait CshsOptionsFromHelper { 'parent' => 0, 'level_labels' => '', 'force_deepest' => FALSE, + 'save_lineage' => FALSE, ]; } @@ -68,6 +69,10 @@ trait CshsOptionsFromHelper { '@force_deepest' => empty($settings['force_deepest']) ? $this->t('No') : $this->t('Yes'), ]); + $summary[] = $this->t('Save lineage: @save_lineage', [ + '@save_lineage' => empty($settings['save_lineage']) ? $this->t('No') : $this->t('Yes'), + ]); + $summary[] = $this->t('Parent: @parent', [ '@parent' => empty($settings['parent']) ? $this->t('None') : $this->getTranslationFromContext($this->getTermStorage()->load($settings['parent']))->label(), ]); @@ -91,6 +96,9 @@ trait CshsOptionsFromHelper { * The form definition for the settings. */ public function settingsForm(array $form, FormStateInterface $form_state) { + /* @var \Drupal\Core\Field\FieldStorageDefinitionInterface */ + $field_storage = $this->fieldDefinition->getFieldStorageDefinition(); + $vocabulary = $this->getVocabulary(); $options = []; @@ -106,6 +114,14 @@ trait CshsOptionsFromHelper { '#default_value' => $this->getSetting('force_deepest'), ]; + $element['save_lineage'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Save lineage'), + '#description' => $this->t('Save all parents of selected terms. The field must allow an unlimited number of items.'), + '#default_value' => $field_storage->getCardinality() < 0 && $this->getSetting('save_lineage'), + '#disabled' => $field_storage->getCardinality() > 0, + ]; + $element['parent'] = [ '#type' => 'select', '#title' => $this->t('Parent'), @@ -144,6 +160,7 @@ trait CshsOptionsFromHelper { '#vocabulary' => $vocabulary, '#none_value' => CSHS_DEFAULT_NONE_VALUE, '#force_deepest' => $settings['force_deepest'], + '#multiple' => $settings['save_lineage'], '#default_value' => CSHS_DEFAULT_NONE_VALUE, ]; } diff --git a/src/Element/CshsElement.php b/src/Element/CshsElement.php index f1f3e80..3137acb 100644 --- a/src/Element/CshsElement.php +++ b/src/Element/CshsElement.php @@ -79,7 +79,13 @@ class CshsElement extends Select { elseif ($element['#force_deepest']) { /* @var \Drupal\taxonomy\TermStorage $storage */ $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); - $term = $storage->load($element['#value']); + + $value = $element['#value']; + if (is_array($value)) { + $value = end($value); + } + + $term = $storage->load($value); // Set an error if term has children. if (!empty($storage->loadChildren($term->id(), $term->getVocabularyId()))) { diff --git a/src/Plugin/Field/FieldWidget/CshsWidget.php b/src/Plugin/Field/FieldWidget/CshsWidget.php index 71e1f1b..4986523 100644 --- a/src/Plugin/Field/FieldWidget/CshsWidget.php +++ b/src/Plugin/Field/FieldWidget/CshsWidget.php @@ -56,12 +56,42 @@ class CshsWidget extends WidgetBase { public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $element['target_id'] = array_merge($element, $this->helperFormElement(), [ '#label' => $this->fieldDefinition->getLabel(), - '#default_value' => $items->get($delta)->getValue(), ]); + if ($items->isEmpty()) { + return $element; + } + + if ($this->handlesMultipleValues()) { + $element['target_id']['#default_value'] = array_map(function($item) { + return $item['target_id']; + }, $items->getValue()); + } + else { + $element['target_id']['#default_value'] = $items->get($delta)->getValue(); + } + return $element; } + /** + * {@inheritdoc} + */ + public function massageFormValues(array $values, array $form, FormStateInterface $form_state) { + if (!$this->handlesMultipleValues()) { + return parent::massageFormValues($values, $form, $form_state); + } + + $id_values = $values['target_id']; + $values = []; + + foreach ($id_values as $id) { + $values[]['target_id'] = $id; + } + + return $values; + } + /** * {@inheritdoc} */ @@ -75,4 +105,11 @@ class CshsWidget extends WidgetBase { return $this->getVocabularyStorage()->load(reset($settings['handler_settings']['target_bundles'])); } + /** + * {@inheritdoc} + */ + protected function handlesMultipleValues() { + return $this->getSetting('save_lineage'); + } + }