public function testTitleOptionsFromTaxonomy() { $field = $this->createNameField('field_name_test', 'entity_test', 'entity_test'); $vocabulary = Vocabulary::create(array('vid' => 'title_options', 'name' => 'Title options')); $vocabulary->save(); foreach (array('foo', 'bar', 'baz') as $name) { $term = Term::create(array('name' => $name, 'vid' => $vocabulary->id())); $term->save(); } /** * @var \Drupal\field\Entity\FieldStorageConfig $field_storage */ $field_storage = $field->getFieldStorageDefinition(); $settings = $field_storage->getSettings(); $settings['title_options'] = array('-- --', '[vocabulary:title_options]'); $settings['sort_options']['title'] = TRUE; $field_storage->set('settings', $settings); $field_storage->save(); $expected = array('' => '--', 'bar' => 'bar', 'baz' => 'baz', 'foo' => 'foo'); $this->assertEqual($expected, $this->optionsProvider->getOptions($field, 'title')); }
/** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { module_load_include('inc', 'name', 'includes/name.content'); $field_settings = $this->getFieldSettings(); $instance['label'] = 'instance label'; $element += array('#type' => 'name', '#title' => SafeMarkup::checkPlain($instance['label']), '#label' => $instance['label'], '#components' => array(), '#minimum_components' => array_filter($field_settings['minimum_components']), '#allow_family_or_given' => !empty($field_settings['allow_family_or_given']), '#default_value' => isset($items[$delta]) ? $items[$delta]->getValue() : NULL, '#field' => $this, '#credentials_inline' => empty($field_settings['credentials_inline']) ? 0 : 1, '#component_css' => empty($field_settings['component_css']) ? '' : $field_settings['component_css'], '#component_layout' => empty($field_settings['component_layout']) ? 'default' : $field_settings['component_layout'], '#show_component_required_marker' => !empty($field_settings['show_component_required_marker'])); $components = array_filter($field_settings['components']); foreach (_name_translations() as $key => $title) { if (isset($components[$key])) { $element['#components'][$key]['type'] = 'textfield'; $size = !empty($field_settings['size'][$key]) ? $field_settings['size'][$key] : 60; $title_display = isset($field_settings['title_display'][$key]) ? $field_settings['title_display'][$key] : 'description'; $element['#components'][$key]['title'] = SafeMarkup::checkPlain($field_settings['labels'][$key]); $element['#components'][$key]['title_display'] = $title_display; $element['#components'][$key]['size'] = $size; $element['#components'][$key]['maxlength'] = !empty($field_settings['max_length'][$key]) ? $field_settings['max_length'][$key] : 255; // Provides backwards compatibility with Drupal 6 modules. $field_type = $key == 'title' || $key == 'generational' ? 'select' : 'text'; $field_type = isset($field_settings['field_type'][$key]) ? $field_settings['field_type'][$key] : (isset($field_settings[$key . '_field']) ? $field_settings[$key . '_field'] : $field_type); if ($field_type == 'select') { $element['#components'][$key]['type'] = 'select'; $element['#components'][$key]['size'] = 1; $element['#components'][$key]['options'] = $this->optionsProvider->getOptions($this->fieldDefinition, $key); } elseif ($field_type == 'autocomplete') { if ($sources = $field_settings['autocomplete_source'][$key]) { $sources = array_filter($sources); if (!empty($sources)) { $element['#components'][$key]['autocomplete'] = array('#autocomplete_route_name' => 'name.autocomplete', '#autocomplete_route_parameters' => array('field_name' => $this->fieldDefinition->getName(), 'entity_type' => $this->fieldDefinition->getTargetEntityTypeId(), 'bundle' => $this->fieldDefinition->getTargetBundle(), 'component' => $key)); } } } if (isset($field_settings['inline_css'][$key]) && Unicode::strlen($field_settings['inline_css'][$key])) { $element['#components'][$key]['attributes'] = array('style' => $field_settings['inline_css'][$key]); } } else { $element['#components'][$key]['exclude'] = TRUE; } } return $element; }
/** * Get matches for the autocompletion of name components. * * @param FieldDefinitionInterface $field * The field definition. * * @param $target * The name field component. * * @param string $string * The string to match for the name field component. * * @return array * An array containing the matching values. */ public function getMatches(FieldDefinitionInterface $field, $target, $string) { $matches = array(); $limit = 10; if (empty($string)) { return $matches; } $settings = $field->getFieldStorageDefinition()->getSettings(); foreach ($this->allComponents as $component) { if (!isset($settings['autocomplete_source'][$component])) { $settings['autocomplete_source'][$component] = array(); } $settings['autocomplete_source'][$component] = array_filter($settings['autocomplete_source'][$component]); } $action = array(); switch ($target) { case 'name': $action['components'] = $this->mapAssoc(array('given', 'middle', 'family')); break; case 'name-all': $action['components'] = $this->mapAssoc($this->allComponents); break; case 'title': case 'given': case 'middle': case 'family': case 'credentials': case 'generational': $action['components'] = array($target => $target); break; default: $action['components'] = array(); foreach (explode('-', $target) as $component) { if (in_array($component, array('title', 'given', 'middle', 'family', 'credentials', 'generational'))) { $action['components'][$component] = $component; } } break; } $action['source'] = array('title' => array(), 'generational' => array()); $action['separater'] = ''; foreach ($action['components'] as $component) { if (empty($settings['autocomplete_source'][$component])) { unset($action['components'][$component]); } else { $sep = (string) $settings['autocomplete_separator'][$component]; if (empty($sep)) { $sep = ' '; } for ($i = 0; $i < count($sep); $i++) { if (strpos($action['separater'], $sep[$i]) === FALSE) { $action['separater'] .= $sep[$i]; } } $found_source = FALSE; foreach ((array) $settings['autocomplete_source'][$component] as $src) { if ($src == 'data' && !$field) { continue; } if ($src == 'title' || $src == 'generational') { if (!$field || $component != $src) { continue; } } $found_source = TRUE; $action['source'][$src][] = $component; } if (!$found_source) { unset($action['components'][$component]); } } } /** * @todo: preg_split fails with a notice if $action['separater'] == ' '. */ @($pieces = preg_split('/[' . preg_quote($action['separater']) . ']+/', $string)); // We should have nice clean parameters to query. if (!empty($pieces) && !empty($action['components'])) { $test_string = Unicode::strtolower(array_pop($pieces)); $base_string = Unicode::substr($string, 0, Unicode::strlen($string) - Unicode::strlen($test_string)); if ($limit > 0 && count($action['source']['title'])) { $options = $this->optionsProvider->getOptions($field, 'title'); foreach ($options as $key => $option) { if (strpos(Unicode::strtolower($key), $test_string) === 0 || strpos(Unicode::strtolower($option), $test_string) === 0) { $matches[$base_string . $key] = $key; $limit--; } } } if ($limit > 0 && count($action['source']['generational'])) { $options = $this->optionsProvider->getOptions($field, 'generational'); foreach ($options as $key => $option) { if (strpos(Unicode::strtolower($key), $test_string) === 0 || strpos(Unicode::strtolower($option), $test_string) === 0) { $matches[$base_string . $key] = $key; $limit--; } } } } return $matches; }