You are here

protected function FormWizardBase::actions in Chaos Tool Suite (ctools) 8.3

Generates action elements for navigating between the operation steps.

Parameters

\Drupal\Core\Form\FormInterface $form_object: The current operation form.

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

Return value

array

1 call to FormWizardBase::actions()
FormWizardBase::buildForm in src/Wizard/FormWizardBase.php
Form constructor.

File

src/Wizard/FormWizardBase.php, line 354

Class

FormWizardBase
The base class for all form wizard.

Namespace

Drupal\ctools\Wizard

Code

protected function actions(FormInterface $form_object, FormStateInterface $form_state) {
  $cached_values = $form_state
    ->getTemporaryValue('wizard');
  $operations = $this
    ->getOperations($cached_values);
  $step = $this
    ->getStep($cached_values);
  $operation = $operations[$step];
  $steps = array_keys($operations);

  // Slice to find the operations that occur before the current operation.
  $before = array_slice($operations, 0, array_search($step, $steps));

  // Slice to find the operations that occur after the current operation.
  $after = array_slice($operations, array_search($step, $steps) + 1);
  $actions = [
    'submit' => [
      '#type' => 'submit',
      '#value' => $this
        ->t('Next'),
      '#button_type' => 'primary',
      '#validate' => [
        '::populateCachedValues',
        [
          $form_object,
          'validateForm',
        ],
      ],
      '#submit' => [
        [
          $form_object,
          'submitForm',
        ],
      ],
    ],
  ];

  // Add any submit or validate functions for the step and the global ones.
  if (isset($operation['validate'])) {
    $actions['submit']['#validate'] = array_merge($actions['submit']['#validate'], $operation['validate']);
  }
  $actions['submit']['#validate'][] = '::validateForm';
  if (isset($operation['submit'])) {
    $actions['submit']['#submit'] = array_merge($actions['submit']['#submit'], $operation['submit']);
  }
  $actions['submit']['#submit'][] = '::submitForm';
  if ($form_state
    ->get('ajax')) {

    // Ajax submissions need to submit to the current step, not "next".
    $parameters = $this
      ->getNextParameters($cached_values);
    $parameters['step'] = $this
      ->getStep($cached_values);
    $actions['submit']['#ajax'] = [
      'callback' => '::ajaxSubmit',
      'url' => Url::fromRoute($this
        ->getRouteName(), $parameters),
      'options' => [
        'query' => $this
          ->getRequest()->query
          ->all() + [
          FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
        ],
      ],
    ];
  }

  // If there are steps before this one, label the button "previous"
  // otherwise do not display a button.
  if ($before) {
    $actions['previous'] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Previous'),
      '#validate' => [
        [
          $this,
          'populateCachedValues',
        ],
      ],
      '#submit' => [
        [
          $this,
          'previous',
        ],
      ],
      '#limit_validation_errors' => [],
      '#weight' => -10,
    ];
    if ($form_state
      ->get('ajax')) {

      // Ajax submissions need to submit to the current step, not "previous".
      $parameters = $this
        ->getPreviousParameters($cached_values);
      $parameters['step'] = $this
        ->getStep($cached_values);
      $actions['previous']['#ajax'] = [
        'callback' => '::ajaxPrevious',
        'url' => Url::fromRoute($this
          ->getRouteName(), $parameters),
        'options' => [
          'query' => $this
            ->getRequest()->query
            ->all() + [
            FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
          ],
        ],
      ];
    }
  }

  // If there are not steps after this one, label the button "Finish".
  if (!$after) {
    $actions['submit']['#value'] = $this
      ->t('Finish');
    $actions['submit']['#submit'][] = [
      $this,
      'finish',
    ];
    if ($form_state
      ->get('ajax')) {
      $actions['submit']['#ajax']['callback'] = [
        $this,
        'ajaxFinish',
      ];
    }
  }
  return $actions;
}