You are here

public function VocabularySelectForm::buildForm in Drupal-to-Drupal data migration 8.3

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides FormInterface::buildForm

File

migrate_d2d_ui/src/Form/VocabularySelectForm.php, line 23

Class

VocabularySelectForm
Simple wizard step form.

Namespace

Drupal\migrate_d2d_ui\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {

  // Start clean in case we came here via Previous.
  $cached_values = $form_state
    ->getTemporaryValue('wizard');
  unset($cached_values['vocabularies']);
  $form_state
    ->setTemporaryValue('wizard', $cached_values);

  // @todo: Ideally we'll use the source_provider business, but that's buried
  // inside source plugins (DrupalSqlBase).
  if ($this
    ->connection($form_state)
    ->schema()
    ->tableExists('taxonomy_vocabulary')) {
    $vocab_table = 'taxonomy_vocabulary';
    $term_table = 'taxonomy_term_data';
  }
  elseif ($this
    ->connection($form_state)
    ->schema()
    ->tableExists('vocabulary')) {
    $vocab_table = 'vocabulary';
    $term_table = 'term_data';
  }
  else {
    $vocab_table = '';
    $term_table = '';
  }
  if ($vocab_table) {
    $vocab_count = $this
      ->connection($form_state)
      ->select($vocab_table, 'v')
      ->fields('v', [
      'vid',
    ])
      ->countQuery()
      ->execute()
      ->fetchField();
  }
  else {
    $vocab_count = 0;
  }
  if (!$vocab_count) {
    $form['description'] = [
      '#markup' => $this
        ->t('There is no vocabulary data to be migrated from the source database.'),
    ];
    return $form;
  }
  $form['#tree'] = TRUE;
  $form['description'] = [
    '#markup' => $this
      ->t('For each vocabulary on the source site, choose the destination site vocabulary to import its terms. You may also choose not to import a given vocabulary.'),
  ];
  if (empty($this->termCounts)) {
    $get_term_counts = TRUE;
  }
  else {
    $get_term_counts = FALSE;
  }
  $base_options = [
    -1 => $this
      ->t('--Do not import--'),
    0 => $this
      ->t('--Create vocabulary--'),
  ];
  $vocab_options = [];

  // Get the available destination vocabularies.

  /** @var \Drupal\taxonomy\VocabularyInterface[] $local_vocabs */
  $local_vocabs = Vocabulary::loadMultiple();
  foreach ($local_vocabs as $vocab) {
    $vocab_options[$vocab
      ->id()] = $vocab
      ->label();
  }
  $result = $this
    ->connection($form_state)
    ->select($vocab_table, 'v')
    ->fields('v', [
    'vid',
    'name',
  ])
    ->execute();
  foreach ($result as $vocab) {
    $options = $base_options + $vocab_options;

    // If we have a match on vocabulary name, default the mapping to that match
    // and remove the option to create a new vocabulary of that name.
    if ($vid = array_search($vocab->name, $vocab_options)) {
      $default_value = $vid;
      unset($options[0]);
    }
    else {
      $default_value = -1;
    }
    if ($get_term_counts) {
      $this->termCounts[$vocab->vid] = $this
        ->connection($form_state)
        ->select($term_table, 't')
        ->condition('vid', $vocab->vid)
        ->countQuery()
        ->execute()
        ->fetchField();
    }
    $title = $this
      ->t('@name (@count)', [
      '@name' => $vocab->name,
      '@count' => $this
        ->getStringTranslation()
        ->formatPlural($this->termCounts[$vocab->vid], '1 term', '@count terms'),
    ]);
    $form['vocabularies'][$vocab->vid] = array(
      '#type' => 'select',
      '#title' => $title,
      '#options' => $options,
      '#default_value' => $default_value,
    );
  }
  return $form;
}