eca-1.0.x-dev/src/Plugin/Action/ListDataOperationBase.php
src/Plugin/Action/ListDataOperationBase.php
<?php namespace Drupal\eca\Plugin\Action; use Drupal\Core\Access\AccessResult; use Drupal\Core\Access\AccessibleInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\Plugin\DataType\EntityAdapter; use Drupal\Core\Field\EntityReferenceFieldItemListInterface; use Drupal\Core\Session\AccountInterface; use Drupal\eca\Plugin\DataType\DataTransferObject; /** * Base class for actions performing operations on data contained in a list. */ abstract class ListDataOperationBase extends ListOperationBase { /** * The database operation to perform on the contained list data. * * May be one of "save" or "delete". * * @var string */ protected static string $operation = 'save'; /** * {@inheritdoc} */ public function access($object, ?AccountInterface $account = NULL, $return_as_object = FALSE) { $list = $this->getItemList(); if (is_null($list)) { $result = AccessResult::forbidden("No list provided."); } else { $access_allowed = TRUE; if ($list instanceof DataTransferObject) { $list = $list->getSaveables(); } elseif ($list instanceof EntityReferenceFieldItemListInterface) { $list = $list->referencedEntities(); } foreach ($list as $v) { if ($v instanceof EntityAdapter) { $v = $v->getEntity(); } if ($v instanceof EntityInterface) { if ($v->isNew()) { if (static::$operation === 'delete') { $access_allowed = FALSE; $reason = "Cannot delete entities that are not yet saved."; break; } elseif (static::$operation === 'save' || static::$operation === 'create') { /** * @var \Drupal\Core\Entity\EntityAccessControlHandlerInterface $access_handler */ $access_handler = $this->entityTypeManager->getHandler($v->getEntityTypeId(), 'access'); if (!$access_handler->createAccess($v->bundle(), $account, [], FALSE)) { $access_allowed = FALSE; $reason = "Current user has no access to create new entity."; break; } continue; } } } $op = static::$operation === 'save' ? 'update' : static::$operation; if (($v instanceof AccessibleInterface) && !$v->access($op, $account)) { $access_allowed = FALSE; $reason = "At least one entity is not allowed to be {$op}d by the current user."; break; } } $result = $access_allowed ? AccessResult::allowed() : AccessResult::forbidden($reason ?? NULL); } return $return_as_object ? $result : $result->isAllowed(); } /** * {@inheritdoc} */ public function execute(): void { if (!($list = $this->getItemList())) { return; } if ($list instanceof DataTransferObject) { $list = $list->getSaveables(); } elseif ($list instanceof EntityReferenceFieldItemListInterface) { $list = $list->referencedEntities(); } $list_array = []; foreach ($list as $k => $v) { $list_array[$k] = $v; } switch (static::$operation) { case 'save': DataTransferObject::create($list_array)->saveData(); break; case 'delete': DataTransferObject::create($list_array)->deleteData(); break; } } }