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'));
 }
Ejemplo n.º 2
0
 /**
  * {@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;
 }
Ejemplo n.º 3
0
 /**
  * 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;
 }