You are here

public function MappingStepEntityReference::getForm in GatherContent 8.5

Same name and namespace in other branches
  1. 8.4 gathercontent_ui/src/Form/MappingEditSteps/MappingStepEntityReference.php \Drupal\gathercontent_ui\Form\MappingEditSteps\MappingStepEntityReference::getForm()

Returns form array.

Parameters

\Drupal\Core\Form\FormStateInterface $formState: Form state object.

Return value

mixed Return form array.

Overrides MappingSteps::getForm

File

gathercontent_ui/src/Form/MappingEditSteps/MappingStepEntityReference.php, line 43

Class

MappingStepEntityReference
Class MappingStepEntityReference.

Namespace

Drupal\gathercontent_ui\Form\MappingEditSteps

Code

public function getForm(FormStateInterface $formState) {
  $entityTypeManager = \Drupal::entityTypeManager();
  $form = [];
  foreach ($this->entityReferenceFields as $field => $gcMapping) {
    $field_id_array = explode('||', $field);
    $field_config = FieldConfig::load($field_id_array[count($field_id_array) - 1]);
    $options = [];
    $header = [];

    // Prepare options for every language.
    foreach ($gcMapping as $lang => $fieldSettings) {
      foreach ($this->template['related']->structure->groups as $group) {
        if ($group->id === $fieldSettings['tab']) {
          foreach ($group->fields as $gcField) {
            if ($gcField->id == $fieldSettings['name']) {
              $header[$lang] = $this
                ->t('@field (@lang values)', [
                '@field' => $gcField->label,
                '@lang' => strtoupper($lang),
              ]);
              if (count($header) === 1 && $this->erImportType === 'manual') {
                $header['terms'] = $this
                  ->t('Terms');
              }
              foreach ($gcField->metaData->choiceFields['options'] as $option) {
                $options[$lang][$option['optionId']] = $option['label'];
              }
            }
          }
        }
      }
    }
    $term_options = [];

    // For manual mapping load terms from vocabulary.
    if ($this->erImportType === 'manual') {
      $settings = $field_config
        ->getSetting('handler_settings');

      /** @var \Drupal\taxonomy\Entity\Term[] $terms */
      if (!empty($settings['auto_create_bundle'])) {
        $terms = $entityTypeManager
          ->getStorage('taxonomy_term')
          ->loadByProperties([
          'vid' => $settings['auto_create_bundle'],
        ]);
      }
      else {
        $target = reset($settings['target_bundles']);
        $terms = $entityTypeManager
          ->getStorage('taxonomy_term')
          ->loadByProperties([
          'vid' => $target,
        ]);
      }
      foreach ($terms as $term) {
        $term_options[$term
          ->id()] = $term
          ->getName();
      }
    }
    $field = str_replace('.', '--', $field);

    // Extract available languages and get the first and its options.
    $languages = array_keys($header);
    $first_language = array_shift($languages);
    $first_language_options = array_shift($options);

    // Delete terms from languages, it's not language.
    if (isset($languages[0]) && $languages[0] === 'terms') {
      unset($languages[0]);
    }
    $form[$field] = [
      '#tree' => TRUE,
    ];
    $form[$field]['title'] = [
      '#type' => 'html_tag',
      '#value' => $this
        ->t('Field @field', [
        '@field' => $field_config
          ->getLabel(),
      ]),
      '#tag' => 'h2',
    ];

    // Define table header.
    $form[$field]['table'] = [
      '#type' => 'table',
      '#header' => $header,
    ];

    // Each option in the first language is new row.
    // This solution is not dealing with situation when other languages has
    // more options than first language.
    $rows = 0;
    foreach ($first_language_options as $k => $option) {
      $form[$field]['table'][$rows][$first_language] = [
        '#type' => 'value',
        '#value' => $k,
        '#markup' => $option,
      ];
      if ($this->erImportType === 'manual') {
        $form[$field]['table'][$rows]['terms'] = [
          '#type' => 'select',
          '#options' => $term_options,
          '#title' => $this
            ->t('Taxonomy term options'),
          '#title_display' => 'invisible',
          '#empty_option' => $this
            ->t('- None -'),
        ];
      }
      foreach ($languages as $language) {
        $form[$field]['table'][$rows][$language] = [
          '#type' => 'select',
          '#options' => $options[$language],
          '#title' => $this
            ->t('@lang options', [
            '@lang' => $language,
          ]),
          '#title_display' => 'invisible',
          '#empty_option' => $this
            ->t('- None -'),
        ];
      }
      $rows++;
    }
  }
  return $form;
}