eca-1.0.x-dev/modules/form/src/Plugin/Action/FormFieldOptionsActionBase.php
modules/form/src/Plugin/Action/FormFieldOptionsActionBase.php
<?php
namespace Drupal\eca_form\Plugin\Action;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Session\AccountInterface;
/**
* Base class for actions operating on option fields.
*/
abstract class FormFieldOptionsActionBase extends FormFieldActionBase {
/**
* {@inheritdoc}
*/
protected bool $useFilters = FALSE;
/**
* {@inheritdoc}
*/
public function access($object, ?AccountInterface $account = NULL, $return_as_object = FALSE) {
// Directly call the parent of the parent, to save a bit of redundant
// access check overhead.
$result = FormActionBase::access($object, $account, TRUE);
if ($result->isAllowed()) {
$original_field_name = $this->configuration['field_name'];
$missing_form_fields = [];
foreach ($this->extractFormFieldNames($original_field_name) as $field_name) {
$this->configuration['field_name'] = $field_name;
if ($element = &$this->getTargetElement()) {
$element = &$this->jumpToFirstFieldChild($element);
}
if (!$element || !isset($element['#options'])) {
$missing_form_fields[] = $field_name;
}
}
if ($missing_form_fields) {
$form_field_result = AccessResult::forbidden(sprintf("The following form fields were not found, or they are no valid option fields: %s", implode(', ', $missing_form_fields)));
}
else {
$form_field_result = AccessResult::allowed();
}
$result = $result->andIf($form_field_result);
// Restoring the original config entry.
$this->configuration['field_name'] = $original_field_name;
}
return $return_as_object ? $result : $result->isAllowed();
}
}
