You are here

function gc_gc_process_choice_radio_field in GatherContent 8.3

Same name and namespace in other branches
  1. 8 gathercontent.module \gc_gc_process_choice_radio_field()

Processing function for radio type of field.

Parameters

\Drupal\node\NodeInterface $node: Object of node.

string $local_field_name: Local field name.

bool $is_translatable: Indicator if node is translatable.

string $language: Language of translation if applicable.

array $options: Array of options.

1 call to gc_gc_process_choice_radio_field()
gc_gc_process_content_pane in ./gathercontent.module
Processing function for content panes.

File

./gathercontent.module, line 631
Main module file for GatherContent module.

Code

function gc_gc_process_choice_radio_field(NodeInterface &$node, $local_field_name, $is_translatable, $language, array $options) {
  $field = FieldConfig::loadByName('node', $node
    ->bundle(), $local_field_name);
  foreach ($options as $option) {
    if (!$option->selected) {
      continue;
    }
    if (isset($option->value)) {
      if (empty($option->value)) {
        continue;
      }

      // Dealing with "Other" option.
      if ($field
        ->getType() === 'entity_reference') {

        // Load vocabulary id.
        if (!empty($field
          ->getSetting('handler_settings')['auto_create_bundle'])) {
          $vid = $field
            ->getSetting('handler_settings')['auto_create_bundle'];
        }
        else {
          $handler_settings = $field
            ->getSetting('handler_settings');
          $handler_settings = reset($handler_settings);
          $vid = array_shift($handler_settings);
        }

        // Prepare confitions.
        $condition_array = [
          'name' => $option->value,
          'vid' => $vid,
        ];
        if ($is_translatable && $language !== LanguageInterface::LANGCODE_NOT_SPECIFIED) {
          $condition_array['langcode'] = $language;
        }
        $terms = \Drupal::entityTypeManager()
          ->getStorage('taxonomy_term')
          ->loadByProperties($condition_array);

        /** @var \Drupal\taxonomy\Entity\Term $term */
        $term = array_shift($terms);
        if (empty($term)) {
          $term = Term::create([
            'vid' => $vid,
            'name' => $option->value,
            'langcode' => $language,
          ]);
          $term
            ->save();
        }
        if ($is_translatable && $node
          ->hasTranslation($language)) {
          $node
            ->getTranslation($language)
            ->set($local_field_name, $term
            ->id());
        }
        else {
          $node
            ->set($local_field_name, $term
            ->id());
        }
      }
      else {
        if ($is_translatable) {
          $node
            ->getTranslation($language)->{$local_field_name}->value = $option->value;
        }
        else {
          $node->{$local_field_name}->value = $option->value;
        }
      }
    }
    else {

      // Dealing with predefined options.
      if ($field
        ->getType() === 'entity_reference') {
        $terms = \Drupal::entityTypeManager()
          ->getStorage('taxonomy_term')
          ->loadByProperties([
          'gathercontent_option_ids' => $option->name,
        ]);

        /** @var \Drupal\taxonomy\Entity\Term $term */
        $term = array_shift($terms);
        if (!empty($term)) {
          if ($is_translatable) {
            $node
              ->getTranslation($language)
              ->set($local_field_name, $term
              ->id());
          }
          else {
            $node
              ->set($local_field_name, $term
              ->id());
          }
        }
      }
      else {
        if ($is_translatable) {
          $node
            ->getTranslation($language)->{$local_field_name}->value = $option->name;
        }
        else {
          $node->{$local_field_name}->value = $option->name;
        }
      }
    }
  }
}