You are here

public function OrganigramsImportItemsForm::submitForm in Organigrams 8.2

Form submission handler.

Parameters

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

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

Overrides FormInterface::submitForm

File

src/Form/OrganigramsImportItemsForm.php, line 142

Class

OrganigramsImportItemsForm
Provides the settings form for this module.

Namespace

Drupal\organigrams\Form

Code

public function submitForm(array &$form, FormStateInterface $form_state) {

  // Get the decoded organigram items.
  $organigram_items = json_decode($form_state
    ->getValue('organigrams_items_json'));

  // Get the vocabulary.
  $vocabulary = $form_state
    ->get([
    'taxonomy',
    'vocabulary',
  ]);

  // Get all terms in this vocabulary.
  $existing_tids = \Drupal::entityQuery('taxonomy_term')
    ->condition('vid', $vocabulary
    ->id())
    ->execute();
  if (!empty($existing_tids)) {

    // Load the entities.
    $entities = $this->storageController
      ->loadMultiple($existing_tids);

    // Delete them.
    $this->storageController
      ->delete($entities);
  }

  // Create a mapping array for the term ID's.
  $iid_mapping = [];

  // Iterate through the organigram items.
  foreach ($organigram_items as $item) {

    // Create a new term array.
    $term_array = [
      'name' => $item->name,
      'vid' => $vocabulary
        ->id(),
      'parent' => $item->parent,
      'weight' => $item->weight,
    ];

    // Convert the old parent to the new parent if possible.
    if (isset($iid_mapping[$item->parent])) {
      $term_array['parent'] = $iid_mapping[$item->parent];
    }

    // Ignore these fields.
    $ignore_keys = [
      'iid',
      'oid',
      'rdf_mapping',
      'organigrams_machine_name',
      'depth',
    ];

    // Iterate through the item fields.
    foreach ($item as $key => $value) {
      if (in_array($key, $ignore_keys)) {
        continue;
      }

      // Change the value of the position to s if it's l or r.
      if ($key == 'position' && in_array($value, [
        'l',
        'r',
      ])) {
        $value = 's';
      }

      // Add the field to the term array.
      $term_array['field_o_' . $key] = $value;
    }

    // Create the term.
    $term = Term::create($term_array);

    // Save the term.
    $term
      ->save();

    // Create mapping for the new term ID to be used as parent.
    $iid_mapping[$item->iid] = $term
      ->id();
  }

  // Create an overview link.
  $organigram_link = Link::fromTextAndUrl($this
    ->t('overview'), Url::fromUserInput('/admin/structure/taxonomy/manage/' . $vocabulary
    ->id() . '/overview'));

  // Show message.
  $this
    ->messenger()
    ->addMessage($this
    ->t('Organigram items imported. Go to @overview.', [
    '@overview' => $organigram_link
      ->toString(),
  ]));
}