protected function valueForm(&$form, FormStateInterface $form_state) { $users = $this->value ? User::loadMultiple($this->value) : array(); $default_value = EntityAutocomplete::getEntityLabels($users); $form['value'] = array('#type' => 'entity_autocomplete', '#title' => $this->t('Usernames'), '#description' => $this->t('Enter a comma separated list of user names.'), '#target_type' => 'user', '#tags' => TRUE, '#default_value' => $default_value, '#process_default_value' => FALSE); $user_input = $form_state->getUserInput(); if ($form_state->get('exposed') && !isset($user_input[$this->options['expose']['identifier']])) { $user_input[$this->options['expose']['identifier']] = $default_value; $form_state->setUserInput($user_input); } }
/** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $field_name = $this->fieldDefinition->getName(); $parents = $form['#parents']; $referenced_entities = $items->referencedEntities(); if (isset($referenced_entities[$delta])) { $entity_label = EntityAutocomplete::getEntityLabels([$referenced_entities[$delta]]); $id_prefix = implode('-', array_merge($parents, [$field_name, $delta])); $element += [ '#type' => 'container', '#attributes' => ['class' => ['form--inline']], 'target_id' => [ '#type' => 'item', '#markup' => $entity_label, '#default_value' => !$referenced_entities[$delta]->isNew() ? $referenced_entities[$delta]->id() : NULL, ], 'entity' => [ '#type' => 'value', '#default_value' => $referenced_entities[$delta], ], 'remove' => [ '#type' => 'submit', '#name' => strtr($id_prefix, '-', '_') . '_remove', '#value' => t('Remove'), '#attributes' => ['class' => ['remove-item-submit', 'align-right']], '#submit' => [[get_class($this), 'removeSubmit']], '#ajax' => [ 'callback' => [get_class($this), 'getWidgetElementAjax'], 'wrapper' => $this->getWrapperId(), 'effect' => 'fade', ], ], ]; } return $element; }
/** * Returns an entity label in the format needed by the EntityAutocomplete * element. * * @param \Drupal\Core\Entity\EntityInterface $entity * A Drupal entity. * * @return string * A string that can be used as a value for EntityAutocomplete elements. */ protected function getAutocompleteInput(EntityInterface $entity) { return EntityAutocomplete::getEntityLabels(array($entity)); }
protected function valueForm(&$form, FormStateInterface $form_state) { $vocabulary = $this->vocabularyStorage->load($this->options['vid']); if (empty($vocabulary) && $this->options['limit']) { $form['markup'] = array('#markup' => '<div class="form-item">' . $this->t('An invalid vocabulary is selected. Please change it in the options.') . '</div>'); return; } if ($this->options['type'] == 'textfield') { $terms = $this->value ? Term::loadMultiple($this->value) : array(); $form['value'] = array('#title' => $this->options['limit'] ? $this->t('Select terms from vocabulary @voc', array('@voc' => $vocabulary->label())) : $this->t('Select terms'), '#type' => 'textfield', '#default_value' => EntityAutocomplete::getEntityLabels($terms)); if ($this->options['limit']) { $form['value']['#type'] = 'entity_autocomplete'; $form['value']['#target_type'] = 'taxonomy_term'; $form['value']['#selection_settings']['target_bundles'] = array($vocabulary->id()); $form['value']['#tags'] = TRUE; $form['value']['#process_default_value'] = FALSE; } } else { if (!empty($this->options['hierarchy']) && $this->options['limit']) { $tree = $this->termStorage->loadTree($vocabulary->id(), 0, NULL, TRUE); $options = array(); if ($tree) { foreach ($tree as $term) { $choice = new \stdClass(); $choice->option = array($term->id() => str_repeat('-', $term->depth) . SafeMarkup::checkPlain(\Drupal::entityManager()->getTranslationFromContext($term)->label())); $options[] = $choice; } } } else { $options = array(); $query = \Drupal::entityQuery('taxonomy_term')->sort('weight')->sort('name')->addTag('term_access'); if ($this->options['limit']) { $query->condition('vid', $vocabulary->id()); } $terms = Term::loadMultiple($query->execute()); foreach ($terms as $term) { $options[$term->id()] = SafeMarkup::checkPlain(\Drupal::entityManager()->getTranslationFromContext($term)->label()); } } $default_value = (array) $this->value; if ($exposed = $form_state->get('exposed')) { $identifier = $this->options['expose']['identifier']; if (!empty($this->options['expose']['reduce'])) { $options = $this->reduceValueOptions($options); if (!empty($this->options['expose']['multiple']) && empty($this->options['expose']['required'])) { $default_value = array(); } } if (empty($this->options['expose']['multiple'])) { if (empty($this->options['expose']['required']) && (empty($default_value) || !empty($this->options['expose']['reduce']))) { $default_value = 'All'; } elseif (empty($default_value)) { $keys = array_keys($options); $default_value = array_shift($keys); } elseif ($default_value == array('')) { $default_value = 'All'; } else { $copy = $default_value; $default_value = array_shift($copy); } } } $form['value'] = array('#type' => 'select', '#title' => $this->options['limit'] ? $this->t('Select terms from vocabulary @voc', array('@voc' => $vocabulary->label())) : $this->t('Select terms'), '#multiple' => TRUE, '#options' => $options, '#size' => min(9, count($options)), '#default_value' => $default_value); $user_input = $form_state->getUserInput(); if ($exposed && isset($identifier) && !isset($user_input[$identifier])) { $user_input[$identifier] = $default_value; $form_state->setUserInput($user_input); } } if (!$form_state->get('exposed')) { // Retain the helper option $this->helper->buildOptionsForm($form, $form_state); } }
/** * Gets the user-entered string as a URI. * * The following two forms of input are mapped to URIs: * - entity autocomplete ("label (entity id)") strings: to 'entity:' URIs; * - strings without a detectable scheme: to 'internal:' URIs. * * This method is the inverse of ::getUriAsDisplayableString(). * * @param string $string * The user-entered string. * * @return string * The URI, if a non-empty $uri was passed. * * @see static::getUriAsDisplayableString() */ protected static function getUserEnteredStringAsUri($string) { // By default, assume the entered string is an URI. $uri = $string; // Detect entity autocomplete string, map to 'entity:' URI. $entity_id = EntityAutocomplete::extractEntityIdFromAutocompleteInput($string); if ($entity_id !== NULL) { // @todo Support entity types other than 'node'. Will be fixed in // https://www.drupal.org/node/2423093. $uri = 'entity:node/' . $entity_id; } elseif (!empty($string) && parse_url($string, PHP_URL_SCHEME) === NULL) { // @todo '<front>' is valid input for BC reasons, may be removed by // https://www.drupal.org/node/2421941 // - '<front>' -> '/' // - '<front>#foo' -> '/#foo' if (strpos($string, '<front>') === 0) { $string = '/' . substr($string, strlen('<front>')); } $uri = 'internal:' . $string; } return $uri; }
/** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { EntityAutocomplete::validateEntityAutocomplete($form['deck'], $form_state, $form); }