eca-1.0.x-dev/modules/form/src/Plugin/Action/FormFlagFieldActionBase.php
modules/form/src/Plugin/Action/FormFlagFieldActionBase.php
<?php namespace Drupal\eca_form\Plugin\Action; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; use Drupal\Core\StringTranslation\TranslatableMarkup; /** * Base class for flagging form field actions. */ abstract class FormFlagFieldActionBase extends FormFieldActionBase { /** * Whether to use form field value filters or not. * * @var bool */ protected bool $useFilters = FALSE; /** * {@inheritdoc} */ protected bool $automaticJumpToFieldElement = FALSE; /** * Get the name of the flagging method. * * @param bool $human_readable * Whether a human-readable name should be returned. When set to TRUE, * then a translatable markup object is being returned. Default is FALSE. * * @return string|\Drupal\Core\StringTranslation\TranslatableMarkup * The flag as machine name or human-readable name. */ abstract protected function getFlagName(bool $human_readable = FALSE): string|TranslatableMarkup; /** * {@inheritdoc} */ protected function doExecute(): void { if ($element = &$this->getTargetElement()) { $flag = $this->configuration['flag']; $element['#' . $this->getFlagName()] = $flag; $this->flagAllChildren($element, $flag); } } /** * {@inheritdoc} */ public function defaultConfiguration(): array { return [ 'flag' => TRUE, ] + parent::defaultConfiguration(); } /** * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state): array { $form['flag'] = [ '#type' => 'checkbox', '#title' => $this->t('Set as @flag', ['@flag' => $this->getFlagName(TRUE)]), '#default_value' => $this->configuration['flag'], '#weight' => -49, ]; return parent::buildConfigurationForm($form, $form_state); } /** * {@inheritdoc} */ public function submitConfigurationForm(array &$form, FormStateInterface $form_state): void { $this->configuration['flag'] = !empty($form_state->getValue('flag')); parent::submitConfigurationForm($form, $form_state); } /** * Flags all children of the element. * * @param mixed &$element * The element. * @param bool $flag * Whether to enable the flag or not. */ protected function flagAllChildren(mixed &$element, bool $flag): void { foreach (Element::children($element) as $key) { $element[$key]['#' . $this->getFlagName()] = $flag; $this->flagAllChildren($element[$key], $flag); } } }