You are here

public function PaymentReferenceBase::process in Payment 8.2

Implements form #process callback.

File

src/Element/PaymentReferenceBase.php, line 190

Class

PaymentReferenceBase
Provides a base for payment reference elements.

Namespace

Drupal\payment\Element

Code

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

  // Set internal configuration.
  $element['#available_payment_id'] = NULL;
  $element['#element_validate'] = [
    [
      $this,
      'elementValidate',
    ],
  ];
  $element['#theme_wrappers'] = array(
    'form_element',
  );
  $element['#tree'] = TRUE;

  // Validate the element's configuration.
  if (!is_int($element['#default_value']) && !is_null($element['#default_value'])) {
    throw new \InvalidArgumentException('#default_value must be an integer or NULL, but ' . gettype($element['#default_value']) . ' was given.');
  }
  if (!is_null($element['#limit_allowed_plugin_ids']) && !is_array($element['#limit_allowed_plugin_ids'])) {
    throw new \InvalidArgumentException('#limit_allowed_plugin_ids must be an array or NULL, but ' . gettype($element['#limit_allowed_plugin_ids']) . ' was given.');
  }
  if (!is_string($element['#queue_category_id'])) {
    throw new \InvalidArgumentException('#queue_category_id must be a string, but ' . gettype($element['#queue_category_id']) . ' was given.');
  }
  if (!is_int($element['#queue_owner_id'])) {
    throw new \InvalidArgumentException('#queue_owner_id must be an integer, but ' . gettype($element['#queue_owner_id']) . ' was given.');
  }
  if (!is_string($element['#plugin_selector_id'])) {
    throw new \InvalidArgumentException('#plugin_selector_id must be a string, but ' . gettype($element['#plugin_selector_id']) . ' was given.');
  }
  if (!$element['#prototype_payment'] instanceof PaymentInterface) {
    throw new \InvalidArgumentException('#prototype_payment must implement \\Drupal\\payment\\Entity\\PaymentInterface.');
  }

  // Find the default payment to use.
  if (!$element['#default_value']) {
    $payment_ids = $this
      ->getPaymentQueue()
      ->loadPaymentIds($element['#queue_category_id'], $element['#queue_owner_id']);
    $element['#available_payment_id'] = $payment_ids ? reset($payment_ids) : NULL;
  }

  // AJAX.
  $ajax_wrapper_id = Html::getClass('payment_reference-' . $element['#name']);
  $element['container'] = array(
    '#attached' => [
      'drupalSettings' => [
        'PaymentReferencePaymentAvailable' => [
          $ajax_wrapper_id => $element['#default_value'] || $element['#available_payment_id'],
        ],
      ],
      'library' => [
        'payment/payment_reference',
      ],
    ],
    '#id' => $ajax_wrapper_id,
    '#type' => 'container',
  );
  $element['container']['payment_form'] = $this
    ->buildPaymentForm($element, $form_state);
  $element['container']['payment_form']['#access'] = !$element['#default_value'] && !$element['#available_payment_id'];
  $element['container']['payment_view'] = $this
    ->buildPaymentView($element, $form_state);
  $element['container']['payment_view']['#access'] = $element['#default_value'] || $element['#available_payment_id'];
  $element['container']['refresh'] = $this
    ->buildRefreshButton($element, $form_state);
  return $element;
}