class WebformEntityStorage in Webform 8.5
Same name and namespace in other branches
- 6.x src/WebformEntityStorage.php \Drupal\webform\WebformEntityStorage
Storage controller class for "webform" configuration entities.
Hierarchy
- class \Drupal\Core\Entity\EntityHandlerBase uses DependencySerializationTrait, StringTranslationTrait
- class \Drupal\Core\Entity\EntityStorageBase implements EntityHandlerInterface, EntityStorageInterface
- class \Drupal\Core\Config\Entity\ConfigEntityStorage implements ConfigEntityStorageInterface, ImportableEntityStorageInterface
- class \Drupal\webform\WebformEntityStorage implements WebformEntityStorageInterface
- class \Drupal\Core\Config\Entity\ConfigEntityStorage implements ConfigEntityStorageInterface, ImportableEntityStorageInterface
- class \Drupal\Core\Entity\EntityStorageBase implements EntityHandlerInterface, EntityStorageInterface
Expanded class hierarchy of WebformEntityStorage
File
- src/
WebformEntityStorage.php, line 22
Namespace
Drupal\webformView source
class WebformEntityStorage extends ConfigEntityStorage implements WebformEntityStorageInterface {
/**
* Active database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* The entity type manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The helpers to operate on files.
*
* @var \Drupal\Core\File\FileSystemInterface
*/
protected $fileSystem;
/**
* Associative array container total results for all webforms.
*
* @var array
*/
protected $totals;
/**
* Constructs a WebformEntityStorage object.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* The entity type definition.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory service.
* @param \Drupal\Component\Uuid\UuidInterface $uuid_service
* The UUID service.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Drupal\Core\Database\Connection $database
* The database connection to be used.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager service.
* @param \Drupal\Core\Cache\MemoryCache\MemoryCacheInterface $memory_cache
* The memory cache.
* @param \Drupal\Core\File\FileSystemInterface $file_system
* The helpers to operate on files.
*
* @todo Webform 8.x-6.x: Move $memory_cache right after $language_manager.
*/
public function __construct(EntityTypeInterface $entity_type, ConfigFactoryInterface $config_factory, UuidInterface $uuid_service, LanguageManagerInterface $language_manager, Connection $database, EntityTypeManagerInterface $entity_type_manager, MemoryCacheInterface $memory_cache = NULL, FileSystemInterface $file_system) {
parent::__construct($entity_type, $config_factory, $uuid_service, $language_manager, $memory_cache);
$this->database = $database;
$this->entityTypeManager = $entity_type_manager;
$this->fileSystem = $file_system;
}
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static($entity_type, $container
->get('config.factory'), $container
->get('uuid'), $container
->get('language_manager'), $container
->get('database'), $container
->get('entity_type.manager'), $container
->get('entity.memory_cache'), $container
->get('file_system'));
}
/**
* {@inheritdoc}
*/
protected function doCreate(array $values) {
$entity = parent::doCreate($values);
// Cache new created webform entity so that it can be loaded using just the
// webform's id.
// @see '_webform_ui_temp_form'
// @see \Drupal\webform_ui\Form\WebformUiElementTestForm
// @see \Drupal\webform_ui\Form\WebformUiElementTypeFormBase
$id = $entity
->id();
if ($id && $id === '_webform_ui_temp_form') {
$this
->setStaticCache([
$id => $entity,
]);
}
return $entity;
}
/**
* {@inheritdoc}
*/
protected function doPostSave(EntityInterface $entity, $update) {
if ($update && $entity
->getAccessRules() !== $entity->original
->getAccessRules()) {
// Invalidate webform_submission listing cache tags because due to the
// change in access rules of this webform, some listings might have
// changed for users.
$cache_tags = $this->entityTypeManager
->getDefinition('webform_submission')
->getListCacheTags();
Cache::invalidateTags($cache_tags);
}
parent::doPostSave($entity, $update);
}
/**
* {@inheritdoc}
*/
public function save(EntityInterface $entity) {
$return = parent::save($entity);
if ($return === SAVED_NEW) {
// Insert webform database record used for transaction tracking.
$this->database
->insert('webform')
->fields([
'webform_id' => $entity
->id(),
'next_serial' => 1,
])
->execute();
}
return $return;
}
/**
* {@inheritdoc}
*/
public function delete(array $entities) {
parent::delete($entities);
if (!$entities) {
// If no entities were passed, do nothing.
return;
}
// Delete all webform submission log entries.
$webform_ids = [];
foreach ($entities as $entity) {
$webform_ids[] = $entity
->id();
}
// Delete all webform records used to track next serial.
$this->database
->delete('webform')
->condition('webform_id', $webform_ids, 'IN')
->execute();
// Remove the webform specific file directory for all stream wrappers.
// @see \Drupal\webform\Plugin\WebformElement\WebformManagedFileBase
// @see \Drupal\webform\Plugin\WebformElement\WebformSignature
foreach ($entities as $entity) {
$stream_wrappers = array_keys(\Drupal::service('stream_wrapper_manager')
->getNames(StreamWrapperInterface::WRITE_VISIBLE));
foreach ($stream_wrappers as $stream_wrapper) {
$file_directory = $stream_wrapper . '://webform/' . $entity
->id();
if (file_exists($file_directory)) {
// Clear all signature files.
// @see \Drupal\webform\Plugin\WebformElement\WebformSignature::getImageUrl
$files = $this->fileSystem
->scanDirectory($file_directory, '/^signature-.*/');
foreach (array_keys($files) as $uri) {
$this->fileSystem
->delete($uri);
}
// Clear empty webform directory.
if (empty($this->fileSystem
->scanDirectory($file_directory, '/.*/'))) {
$this->fileSystem
->deleteRecursive($file_directory);
}
}
}
}
}
/**
* {@inheritdoc}
*/
public function getCategories($template = NULL) {
$webforms = $this
->loadMultiple();
$categories = [];
foreach ($webforms as $webform) {
if ($template !== NULL && $webform
->get('template') !== $template) {
continue;
}
if ($category = $webform
->get('category')) {
$categories[$category] = $category;
}
}
ksort($categories);
return $categories;
}
/**
* {@inheritdoc}
*/
public function getOptions($template = NULL) {
/** @var \Drupal\webform\WebformInterface[] $webforms */
$webforms = $this
->loadMultiple();
@uasort($webforms, [
$this->entityType
->getClass(),
'sort',
]);
$uncategorized_options = [];
$categorized_options = [];
foreach ($webforms as $id => $webform) {
// Skip templates.
if ($template !== NULL && $webform
->get('template') !== $template) {
continue;
}
// Skip archived.
if ($webform
->isArchived()) {
continue;
}
if ($category = $webform
->get('category')) {
$categorized_options[$category][$id] = $webform
->label();
}
else {
$uncategorized_options[$id] = $webform
->label();
}
}
// Merge uncategorized options with categorized options.
$options = $uncategorized_options;
foreach ($categorized_options as $optgroup => $optgroup_options) {
// If webform id and optgroup conflict move the webform into the optgroup.
if (isset($options[$optgroup])) {
$options[$optgroup] = [
$optgroup => $options[$optgroup],
] + $optgroup_options;
asort($options[$optgroup]);
}
else {
$options[$optgroup] = $optgroup_options;
}
}
return $options;
}
/**
* {@inheritdoc}
*/
public function getNextSerial(WebformInterface $webform) {
return $this->database
->select('webform', 'w')
->fields('w', [
'next_serial',
])
->condition('webform_id', $webform
->id())
->execute()
->fetchField();
}
/**
* {@inheritdoc}
*/
public function setNextSerial(WebformInterface $webform, $next_serial = 1) {
$this->database
->update('webform')
->fields([
'next_serial' => $next_serial,
])
->condition('webform_id', $webform
->id())
->execute();
}
/**
* {@inheritdoc}
*/
public function getSerial(WebformInterface $webform) {
// Use a transaction with SELECT … FOR UPDATE to lock the row between
// the SELECT and the UPDATE, ensuring that multiple Webform submissions
// at the same time do not have duplicate numbers. FOR UPDATE must be inside
// a transaction. The return value of db_transaction() must be assigned or
// the transaction will commit immediately.
//
// The transaction will commit when $transaction goes out-of-scope.
//
// @see \Drupal\Core\Database\Transaction
$transaction = $this->database
->startTransaction();
// Get the next_serial value.
$next_serial = $this->database
->select('webform', 'w')
->forUpdate()
->fields('w', [
'next_serial',
])
->condition('webform_id', $webform
->id())
->execute()
->fetchField();
// $next_serial must be greater than any existing serial number.
$next_serial = max($next_serial, $this
->getMaxSerial($webform));
// Increment the next_value.
$this->database
->update('webform')
->fields([
'next_serial' => $next_serial + 1,
])
->condition('webform_id', $webform
->id())
->execute();
return $next_serial;
}
/**
* {@inheritdoc}
*/
public function getMaxSerial(WebformInterface $webform) {
$query = $this->database
->select('webform_submission');
$query
->condition('webform_id', $webform
->id());
$query
->addExpression('MAX(serial)');
return $query
->execute()
->fetchField() + 1;
}
/**
* Get total number of results for specified webform or all webforms.
*
* @param string|null $webform_id
* (optional) A webform id.
*
* @return array|int
* If no webform id is passed, an associative array keyed by webform id
* contains total results for all webforms, otherwise the total number of
* results for specified webform
*/
public function getTotalNumberOfResults($webform_id = NULL) {
if (!isset($this->totals)) {
$query = $this->database
->select('webform_submission', 'ws');
$query
->fields('ws', [
'webform_id',
]);
$query
->addExpression('COUNT(sid)', 'results');
$query
->groupBy('webform_id');
$this->totals = array_map('intval', $query
->execute()
->fetchAllKeyed());
}
if ($webform_id) {
return isset($this->totals[$webform_id]) ? $this->totals[$webform_id] : 0;
}
else {
return $this->totals;
}
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ConfigEntityStorage:: |
protected | property | The config factory service. | |
ConfigEntityStorage:: |
protected | property | The config storage service. | |
ConfigEntityStorage:: |
protected | property | Static cache of entities, keyed first by entity ID, then by an extra key. | |
ConfigEntityStorage:: |
protected | property | The language manager. | |
ConfigEntityStorage:: |
protected | property | Determines if the underlying configuration is retrieved override free. | |
ConfigEntityStorage:: |
protected | property |
Name of entity's UUID database table field, if it supports UUIDs. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Builds the cache ID for the passed in entity ID. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Creates a configuration entity from storage values. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Delete a specific entity revision. Overrides EntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function |
Performs storage-specific entity deletion. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Performs storage-specific loading of entities. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Performs storage-specific saving of the entity. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public static | function |
Extracts the configuration entity ID from the full configuration name. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function | Returns the prefix used to create the configuration name. | |
ConfigEntityStorage:: |
protected | function |
Gets the name of the service for the query for this entity storage. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Determines if this entity already exists in storage. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Determines if the storage contains any data. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Creates entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
1 |
ConfigEntityStorage:: |
public | function |
Delete entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
2 |
ConfigEntityStorage:: |
public | function |
Renames entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Updates entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
1 |
ConfigEntityStorage:: |
protected | function |
Invokes a hook on behalf of the entity. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Loads one or more entities in their original form without overrides. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Loads one entity in their original form without overrides. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Load a specific entity revision. Overrides EntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function | Maps from an entity object to the storage record. | 3 |
ConfigEntityStorage:: |
constant | Length limit of the configuration entity ID. | 1 | |
ConfigEntityStorage:: |
public | function |
Updates a configuration entity from storage values. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function | Helps create a configuration entity from storage values. | |
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
EntityHandlerBase:: |
protected | property | The module handler to invoke hooks on. | 2 |
EntityHandlerBase:: |
protected | function | Gets the module handler. | 2 |
EntityHandlerBase:: |
public | function | Sets the module handler for this handler. | |
EntityStorageBase:: |
protected | property | Name of the entity class. | |
EntityStorageBase:: |
protected | property | Information about the entity type. | |
EntityStorageBase:: |
protected | property | Entity type ID for this storage. | |
EntityStorageBase:: |
protected | property | Name of the entity's ID field in the entity database table. | |
EntityStorageBase:: |
protected | property | The name of the entity langcode property. | 1 |
EntityStorageBase:: |
protected | property | The memory cache. | |
EntityStorageBase:: |
protected | property | The memory cache cache tag. | |
EntityStorageBase:: |
protected | property | The UUID service. | 1 |
EntityStorageBase:: |
protected | function | Builds an entity query. | 1 |
EntityStorageBase:: |
public | function |
Constructs a new entity object, without permanently saving it. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
protected | function | Performs presave entity processing. | 1 |
EntityStorageBase:: |
public | function |
Gets an aggregated query instance. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
public | function |
Gets the entity type definition. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
public | function |
Gets the entity type ID. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
protected | function | Gets entities from the static cache. | |
EntityStorageBase:: |
public | function |
Gets an entity query instance. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
public | function |
Loads one entity. Overrides EntityStorageInterface:: |
2 |
EntityStorageBase:: |
public | function |
Load entities by their property values. Overrides EntityStorageInterface:: |
3 |
EntityStorageBase:: |
public | function |
Loads one or more entities. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
public | function |
Loads an unchanged entity from the database. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
protected | function | Maps from storage records to entity objects. | 4 |
EntityStorageBase:: |
protected | function | Attaches data to entities upon loading. | |
EntityStorageBase:: |
protected | function | Gathers entities from a 'preload' step. | 1 |
EntityStorageBase:: |
public | function |
Resets the internal, static entity cache. Overrides EntityStorageInterface:: |
2 |
EntityStorageBase:: |
public | function |
Restores a previously saved entity. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
protected | function | Stores entities in the static entity cache. | |
EntityStorageInterface:: |
constant | Load the most recent version of an entity's field data. | ||
EntityStorageInterface:: |
constant | Load the version of an entity's field data specified in the entity. | ||
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
WebformEntityStorage:: |
protected | property | Active database connection. | |
WebformEntityStorage:: |
protected | property | The entity type manager service. | |
WebformEntityStorage:: |
protected | property | The helpers to operate on files. | |
WebformEntityStorage:: |
protected | property | Associative array container total results for all webforms. | |
WebformEntityStorage:: |
public static | function |
Instantiates a new instance of this entity handler. Overrides ConfigEntityStorage:: |
|
WebformEntityStorage:: |
public | function |
Deletes permanently saved entities. Overrides EntityStorageBase:: |
|
WebformEntityStorage:: |
protected | function |
Performs storage-specific creation of entities. Overrides ConfigEntityStorage:: |
|
WebformEntityStorage:: |
protected | function |
Performs post save entity processing. Overrides EntityStorageBase:: |
|
WebformEntityStorage:: |
public | function |
Gets the names of all categories. Overrides WebformEntityStorageInterface:: |
|
WebformEntityStorage:: |
public | function |
Returns a webform's max serial number. Overrides WebformEntityStorageInterface:: |
|
WebformEntityStorage:: |
public | function |
Returns the next serial number. Overrides WebformEntityStorageInterface:: |
|
WebformEntityStorage:: |
public | function |
Get all webforms grouped by category. Overrides WebformEntityStorageInterface:: |
|
WebformEntityStorage:: |
public | function |
Returns the next serial number for a webform's submission. Overrides WebformEntityStorageInterface:: |
|
WebformEntityStorage:: |
public | function |
Get total number of results for specified webform or all webforms. Overrides WebformEntityStorageInterface:: |
|
WebformEntityStorage:: |
public | function |
Implements Drupal\Core\Entity\EntityStorageInterface::save(). Overrides ConfigEntityStorage:: |
|
WebformEntityStorage:: |
public | function |
Set the next serial number. Overrides WebformEntityStorageInterface:: |
|
WebformEntityStorage:: |
public | function |
Constructs a WebformEntityStorage object. Overrides ConfigEntityStorage:: |