eca-1.0.x-dev/src/Plugin/Action/ListOperationBase.php
src/Plugin/Action/ListOperationBase.php
<?php
namespace Drupal\eca\Plugin\Action;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\TypedData\ListInterface;
use Drupal\Core\TypedData\TraversableTypedDataInterface;
use Drupal\eca\Plugin\DataType\DataTransferObject;
/**
* Base class for list operation actions.
*/
abstract class ListOperationBase extends ConfigurableActionBase {
/**
* {@inheritdoc}
*/
public function access($object, ?AccountInterface $account = NULL, $return_as_object = FALSE) {
$result = AccessResult::allowedIf(!is_null($this->getItemList()));
return $return_as_object ? $result : $result->isAllowed();
}
/**
* {@inheritdoc}
*/
public function defaultConfiguration(): array {
return [
'list_token' => '',
] + parent::defaultConfiguration();
}
/**
* {@inheritdoc}
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state): array {
$form['list_token'] = [
'#type' => 'textfield',
'#title' => $this->t('Token containing the list'),
'#description' => $this->t('Provide the name of the token that contains a list of items. If the list does not exist yet, a new one will be created.'),
'#default_value' => $this->configuration['list_token'],
'#weight' => -20,
'#eca_token_reference' => TRUE,
];
return parent::buildConfigurationForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitConfigurationForm(array &$form, FormStateInterface $form_state): void {
$this->configuration['list_token'] = $form_state->getValue('list_token');
parent::submitConfigurationForm($form, $form_state);
}
/**
* Get the item list.
*
* When the item list does not exist yet, a new list will be created.
*
* @return \Drupal\Core\TypedData\TraversableTypedDataInterface
* The item list, or NULL if the targeted token cannot perform the requested
* operation. For example, a single field item that is not a list cannot
* handle list operations like appending or prepending items.
*/
protected function getItemList(): ?TraversableTypedDataInterface {
$list_token = trim((string) $this->configuration['list_token']);
$token = $this->tokenService;
if (!$token->hasTokenData($list_token)) {
$token->addTokenData($list_token, DataTransferObject::create([]));
}
$list = $token->getTokenData($list_token);
return ($list instanceof ListInterface || $list instanceof DataTransferObject) ? $list : NULL;
}
}
