You are here

public function JsonForm::submitForm in CMS Content Sync 2.1.x

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/JsonForm.php, line 67

Class

JsonForm
Content Sync general settings form.

Namespace

Drupal\cms_content_sync\Form

Code

public function submitForm(array &$form, FormStateInterface $form_state) {
  if ('save-flow' === $form_state
    ->getValue('action')) {
    $data = json_decode($form_state
      ->getValue('json'), TRUE);
    $values = $data['values'];
    $flows = Flow::getAll(TRUE);
    $machine_name = $values['machineName'];

    // Create any new Pools that don't exist yet.
    $pools = Pool::getAll();
    foreach ($data['pools'] as $pool_definition) {
      $pool_machine_name = $pool_definition['machineName'];
      if (!isset($pools[$pool_machine_name])) {
        $pool = Pool::create([
          'id' => $pool_machine_name,
          'label' => $pool_definition['name'],
        ]);
        $pool
          ->save();
        $pools[$pool_machine_name] = $pool;
      }
    }

    // Update existing or create new Flow.
    if (isset($flows[$machine_name])) {
      $flow = $flows[$machine_name];
    }
    else {
      $flow = Flow::create([
        'variant' => Flow::VARIANT_SIMPLE,
        'type' => $values['type'],
        'id' => $machine_name,
        'name' => $values['name'],
      ]);
    }
    $flow
      ->getController()
      ->setFormValues($values);
    $flow
      ->save();

    // Export to the Sync Core
    foreach (Pool::getAll() as $pool) {
      if (!PoolExport::validateBaseUrl($pool)) {
        throw new \Exception('The site does not have a valid base url. The base url must not contain "localhost" and is not allowed to be an IP address. The base url of the site can be configured at the CMS Content Sync settings page.');
      }
      $exporter = new SyncCorePoolExport($pool);
      $sites = $exporter
        ->verifySiteId();
      if ($sites && count($sites)) {
        throw new \Exception('Another site with id ' . array_keys($sites)[0] . ' and base url ' . array_values($sites)[0] . ' already exists for the pool "' . $pool->id . '"');
      }
    }
    $flow
      ->getController()
      ->updateEntityTypeVersions();
    $exporter = new SyncCoreFlowExport($flow);
    $batch = $exporter
      ->prepareBatch(FALSE);
    $batch
      ->executeAll();

    // Conditionally redirect to the migration page.
    if ($data['migrateNext']) {

      // If this was set, our redirect would be ignored. It's automatically set by Drupal if you hit Edit on the list page.
      \Drupal::request()->query
        ->remove('destination');
      $form_state
        ->setRedirect('cms_content_sync.syndication', [], [
        'query' => [
          'flow' => $flow->id,
          'startNew' => 'true',
        ],
      ]);
    }
    else {

      // In this case it's fine if a ?destination query param overwrites our default to go to the Flow list page.
      $form_state
        ->setRedirect('entity.cms_content_sync_flow.collection');
    }
  }
}