View source
<?php
namespace Drupal\webform_access;
use Drupal\Core\Config\Entity\ConfigEntityStorage;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\webform\EntityStorage\WebformEntityStorageTrait;
use Drupal\webform\WebformInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class WebformAccessGroupStorage extends ConfigEntityStorage implements WebformAccessGroupStorageInterface {
use WebformEntityStorageTrait;
protected $database;
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
$instance = parent::createInstance($container, $entity_type);
$instance->database = $container
->get('database');
$instance->entityTypeManager = $container
->get('entity_type.manager');
return $instance;
}
protected function doLoadMultiple(array $ids = NULL) {
$webform_access_groups = parent::doLoadMultiple($ids);
$result = $this->database
->select('webform_access_group_admin', 'gu')
->fields('gu', [
'group_id',
'uid',
])
->condition('group_id', $ids, 'IN')
->orderBy('group_id')
->orderBy('uid')
->execute();
$admins = [];
while ($record = $result
->fetchAssoc()) {
$admins[$record['group_id']][] = $record['uid'];
}
foreach ($webform_access_groups as $group_id => $webform_access_group) {
$webform_access_group
->setAdminIds(isset($admins[$group_id]) ? $admins[$group_id] : []);
}
$result = $this->database
->select('webform_access_group_user', 'gu')
->fields('gu', [
'group_id',
'uid',
])
->condition('group_id', $ids, 'IN')
->orderBy('group_id')
->orderBy('uid')
->execute();
$users = [];
while ($record = $result
->fetchAssoc()) {
$users[$record['group_id']][] = $record['uid'];
}
foreach ($webform_access_groups as $group_id => $webform_access_group) {
$webform_access_group
->setUserIds(isset($users[$group_id]) ? $users[$group_id] : []);
}
$result = $this->database
->select('webform_access_group_entity', 'ge')
->fields('ge', [
'group_id',
'entity_type',
'entity_id',
'field_name',
'webform_id',
])
->condition('group_id', $ids, 'IN')
->orderBy('group_id')
->execute();
$entities = [];
while ($record = $result
->fetchAssoc()) {
$group_id = $record['group_id'];
unset($record['group_id']);
$entities[$group_id][] = implode(':', $record);
}
foreach ($webform_access_groups as $group_id => $webform_access_group) {
$webform_access_group
->setEntityIds(isset($entities[$group_id]) ? $entities[$group_id] : []);
}
return $webform_access_groups;
}
protected function doSave($id, EntityInterface $entity) {
$result = parent::doSave($id, $entity);
$admins = $entity
->getAdminIds();
$this->database
->delete('webform_access_group_admin')
->condition('group_id', $entity
->id())
->execute();
$query = $this->database
->insert('webform_access_group_admin')
->fields([
'group_id',
'uid',
]);
$values = [
'group_id' => $entity
->id(),
];
foreach ($admins as $uid) {
$values['uid'] = $uid;
$query
->values($values);
}
$query
->execute();
$users = $entity
->getUserIds();
$this->database
->delete('webform_access_group_user')
->condition('group_id', $entity
->id())
->execute();
$query = $this->database
->insert('webform_access_group_user')
->fields([
'group_id',
'uid',
]);
$values = [
'group_id' => $entity
->id(),
];
foreach ($users as $uid) {
$values['uid'] = $uid;
$query
->values($values);
}
$query
->execute();
$entities = $entity
->getEntityIds();
$this->database
->delete('webform_access_group_entity')
->condition('group_id', $entity
->id())
->execute();
$query = $this->database
->insert('webform_access_group_entity')
->fields([
'group_id',
'entity_type',
'entity_id',
'field_name',
'webform_id',
]);
$values = [
'group_id' => $entity
->id(),
];
foreach ($entities as $entity) {
list($values['entity_type'], $values['entity_id'], $values['field_name'], $values['webform_id']) = explode(':', $entity);
$query
->values($values);
}
$query
->execute();
return $result;
}
public function delete(array $entities) {
foreach ($entities as $entity) {
$this->database
->delete('webform_access_group_admin')
->condition('group_id', $entity
->id())
->execute();
$this->database
->delete('webform_access_group_user')
->condition('group_id', $entity
->id())
->execute();
$this->database
->delete('webform_access_group_entity')
->condition('group_id', $entity
->id())
->execute();
}
return parent::delete($entities);
}
public function loadByEntities(WebformInterface $webform = NULL, EntityInterface $source_entity = NULL, AccountInterface $account = NULL, $type = NULL) {
$query = $this->database
->select('webform_access_group_entity', 'ge');
$query
->fields('ge', [
'group_id',
]);
if ($webform) {
$query
->condition('webform_id', $webform
->id());
}
if ($source_entity) {
$query
->condition('entity_type', $source_entity
->getEntityTypeId());
$query
->condition('entity_id', $source_entity
->id());
}
if ($account) {
$query
->innerjoin('webform_access_group_user', 'gu', 'ge.group_id = gu.group_id');
$query
->condition('uid', $account
->id());
}
if ($type) {
$type_group_ids = $this
->getQuery()
->condition('type', $type)
->accessCheck(FALSE)
->execute();
if (empty($type_group_ids)) {
return [];
}
$query
->condition('group_id', $type_group_ids, 'IN');
}
$group_ids = $query
->execute()
->fetchCol();
return $group_ids ? $this
->loadMultiple($group_ids) : [];
}
public function getUserEntities(AccountInterface $account, $entity_type = NULL) {
$webform_access_groups = $this
->loadByEntities(NULL, NULL, $account);
$source_entity_ids = [];
foreach ($webform_access_groups as $webform_access_group) {
$entities = $webform_access_group
->getEntityIds();
foreach ($entities as $entity) {
list($source_entity_type, $source_entity_id) = explode(':', $entity);
if (!$entity_type || $source_entity_type === $entity_type) {
$source_entity_ids[] = $source_entity_id;
}
}
}
return $this
->getEntityStorage($entity_type)
->loadMultiple($source_entity_ids);
}
}