I need a field type with 3 select in it. The field type is created and works like a charm but I'd like one of these select may have multiple values. What must I change? I add '#multiple' => TRUE, in the widget. But I can't save my values. I should probably change the type of field in the FieldType but how? Thanks in advance. ``` /** * Provides a field type of resource. * * @FieldType( * id = "resource", * label = @Translation("Resource"), * default_formatter = "resource_formatter", * default_widget = "resource_widget", * ) */ class ResourceItem extends FieldItemBase { public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties = []; $properties['topic'] = DataDefinition::create('string'); $properties['material'] = DataDefinition::create('string'); $properties['add_infos'] = DataDefinition::create('string'); $properties['columns_display'] = DataDefinition::create('string'); return $properties; } public static function schema(FieldStorageDefinitionInterface $field_definition) { return [ 'columns' => [ 'topic' => [ 'type' => 'varchar', 'length' => '255', 'not null' => FALSE, ], 'material' => [ 'type' => 'varchar', 'length' => '255', 'not null' => FALSE, ], 'add_infos' => [ 'type' => 'varchar', 'length' => '255', 'not null' => FALSE, ], 'columns_display' => [ 'type' => 'varchar', 'length' => '255', 'not null' => FALSE, ], ], ]; } /** * {@inheritdoc} */ public function isEmpty() { $value1 = $this->get('topic')->getValue(); $value2 = $this->get('material')->getValue(); $value3 = $this->get('add_infos')->getValue(); $value4 = $this->get('columns_display')->getValue(); return empty($value1) && empty($value2) && empty($value3) && empty($value4); } } ``` ``` /** * Plugin implementation of the 'topic_widget' widget. * * @FieldWidget( * id = "resource_widget", * label = @Translation("Resource default"), * field_types = { * "resource" * } * ) */ class ResourceDefaultWidget extends WidgetBase { public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $config = \Drupal::config('resources.config'); $json_topics = file_get_contents($config->get('global_config.url_api') . '/topics'); $topics = Json::decode($json_topics); $options_topics[0] = '--- Choose topic ---'; foreach ($topics as $key => $topic) { $options_topics[$topic['name']] = ucfirst($topic['name']); } $element['topic'] = [ '#type' => 'select', '#title' => t('Topic'), '#description' => t('List of topics from osteoporosis-foundation'), '#options' => $options_topics, ]; $json_materials = file_get_contents($config->get('global_config.url_api') . '/materials'); $materials = Json::decode($json_materials); $options_mat[0] = '--- Choose material ---'; foreach ($materials as $key => $material) { $options_mat[$material['name']] = ucfirst($material['name']); } $element['material'] = [ '#type' => 'select', '#title' => t('Material'), '#description' => t('List of materials from osteoporosis-foundation'), '#options' => $options_mat, ]; $json_add_infos = file_get_contents($config->get('global_config.url_api') . '/additional-information'); $add_infos = Json::decode($json_add_infos); $options_add_infos[0] = '--- Choose additional information ---'; foreach ($add_infos as $key => $info) { $options_add_infos[$info['name']] = ucfirst($info['name']); } $element['add_infos'] = [ '#type' => 'select', '#title' => t('Additional Information'), //'#multiple' => TRUE, '#description' => t('List of additional information from osteoporosis-foundation'), '#options' => $options_add_infos, ]; $element['columns_display'] = [ '#type' => 'select', '#title' => t('Number of column to display'), '#options' => [ 'null' => '--- Choose column(s) to display ---', 'col-md-3' => '1 column', 'col-md-6' => '2 columns', 'col-md-9' => '3 columns', 'col-md-12' => '4 columns', ], ]; //setting default value to all fields from above $childs = Element::children($element); foreach ($childs as $child) { $element[$child]['#default_value'] = isset($items[$delta]->{$child}) ? $items[$delta]->{$child} : NULL; } return $element; } } ``` ``` /** * Plugin implementation of the 'resource_formatter' formatter. * * @FieldFormatter( * id = "resource_formatter", * label = @Translation("Resource default"), * field_types = { * "resource" * } * ) */ class ResourceDefaultFormatter extends FormatterBase{ public function viewElements(FieldItemListInterface $items, $langcode) { $config = \Drupal::config('resources.config'); $element = []; foreach ($items as $delta => $item) { $column_display = $item->columns_display; $topics = 'topics=' . str_replace(' ', '+', $item->topic); $materials = '&materials=' . str_replace(' ', '+', $item->material); $additional_info = '&additional_info=' . str_replace(' ', '+', $item->add_infos); $json_all = file_get_contents($config->get('global_config.url_api').'/all' . '?' . $topics . $materials . $additional_info); $all_content = Json::decode($json_all); foreach ($all_content['rows'] as $key => $content){ $type_explode = explode('-', $content['type']); $type = strtolower(str_replace(' ', '_', trim(end($type_explode)))); switch($type){ case ('remote_videos'): $element[] = [ '#theme' => 'video', '#resource' => $content, '#column_display' => $column_display ]; break; default: $element[] = [ '#theme' => 'file', '#resource' => $content, '#column_display' => $column_display ]; } } } return $element; } } ```