external_entity-1.0.x-dev/src/AjaxFormTrait.php
src/AjaxFormTrait.php
<?php
declare(strict_types=1);
namespace Drupal\external_entity;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\NestedArray;
/**
* Define a reusable AJAX form trait.
*/
trait AjaxFormTrait {
/**
* AJaX form element callback.
*
* @param array $form
* An array of the form elements.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state object.
*
* @return array
* An array form elements.
*/
public function ajaxFormElementCallback(
array $form,
FormStateInterface $form_state,
): array {
$element = $form_state->getTriggeringElement();
if (!isset($element['#ajax_element'])) {
return $form;
}
$ajax_element = $element['#ajax_element'];
if (!is_array($ajax_element)) {
$ajax_element = [$ajax_element];
}
return NestedArray::getValue($form, $ajax_element);
}
/**
* AJAX form depth callback.
*
* @param array $form
* An array of the form elements.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state object.
*
* @return array
* The form elements for the provided depth.
*/
public function ajaxFormDepthCallback(
array $form,
FormStateInterface $form_state,
): array {
$element = $form_state->getTriggeringElement();
$depth = $element['#depth'] ?? 1;
return NestedArray::getValue(
$form,
array_slice($element['#array_parents'], 0, (int) "-{$depth}")
);
}
/**
* Get form state value.
*
* @param string|array $key
* The form state key.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state object.
* @param mixed $default_value
* The form state default value.
*
* @return mixed
* The form state value.
*/
protected function getFormStateValue(
$key,
FormStateInterface $form_state,
$default_value = NULL,
) {
$key = !is_array($key) ? [$key] : $key;
$inputs = [
$form_state->getValues(),
$form_state->getUserInput(),
];
foreach ($inputs as $input) {
$key_exists = NULL;
$value = NestedArray::getValue($input, $key, $key_exists);
if ($key_exists && !empty($value)) {
return $value;
}
}
return $default_value;
}
}
