class SimpleSitemapStorage in Simple XML sitemap 4.x
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\simple_sitemap\Entity\SimpleSitemapStorage
- class \Drupal\Core\Config\Entity\ConfigEntityStorage implements ConfigEntityStorageInterface, ImportableEntityStorageInterface
- class \Drupal\Core\Entity\EntityStorageBase implements EntityHandlerInterface, EntityStorageInterface
Expanded class hierarchy of SimpleSitemapStorage
File
- src/
Entity/ SimpleSitemapStorage.php, line 19
Namespace
Drupal\simple_sitemap\EntityView source
class SimpleSitemapStorage extends ConfigEntityStorage {
public const SITEMAP_INDEX_DELTA = 0;
public const SITEMAP_CHUNK_FIRST_DELTA = 1;
protected const SITEMAP_PUBLISHED = 1;
protected const SITEMAP_UNPUBLISHED = 0;
protected $database;
protected $time;
protected $entityTypeManager;
protected $settings;
public function __construct(EntityTypeInterface $entity_type, ConfigFactoryInterface $config_factory, UuidInterface $uuid_service, LanguageManagerInterface $language_manager, MemoryCacheInterface $memory_cache, Connection $database, TimeInterface $time, EntityTypeManagerInterface $entity_type_manager, Settings $settings) {
parent::__construct($entity_type, $config_factory, $uuid_service, $language_manager, $memory_cache);
$this->database = $database;
$this->time = $time;
$this->entityTypeManager = $entity_type_manager;
$this->settings = $settings;
}
/**
* {@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('entity.memory_cache'), $container
->get('database'), $container
->get('datetime.time'), $container
->get('entity_type.manager'), $container
->get('simple_sitemap.settings'));
}
/**
* {@inheritdoc}
*
* @todo Improve performance of his method.
*/
protected function doDelete($entities) {
$default_variant = $this->settings
->get('default_variant');
/** @var \Drupal\simple_sitemap\Entity\SimpleSitemapInterface[] $entities */
foreach ($entities as $entity) {
// Remove sitemap content.
$this
->deleteContent($entity);
// Unset default variant setting if necessary.
if ($default_variant === $entity
->id()) {
$this->settings
->save('default_variant', NULL);
}
// Remove bundle settings.
foreach ($this->configFactory
->listAll("simple_sitemap.bundle_settings.{$entity->id()}.") as $config_name) {
$this->configFactory
->getEditable($config_name)
->delete();
}
// Remove custom links.
foreach ($this->configFactory
->listAll("simple_sitemap.custom_links.{$entity->id()}") as $config_name) {
$this->configFactory
->getEditable($config_name)
->delete();
}
// Remove bundle settings entity overrides.
$this->database
->delete('simple_sitemap_entity_overrides')
->condition('type', $entity
->id())
->execute();
}
parent::doDelete($entities);
}
/**
* Loads all sitemaps, sorted by their weight.
*
* {@inheritdoc}
*/
protected function doLoadMultiple(?array $ids = NULL) : array {
$sitemaps = parent::doLoadMultiple($ids);
uasort($sitemaps, [
SimpleSitemap::class,
'sort',
]);
return $sitemaps;
}
public function loadByProperties(array $values = []) : array {
$sitemaps = parent::loadByProperties($values);
uasort($sitemaps, [
SimpleSitemap::class,
'sort',
]);
return $sitemaps;
}
public function create(array $values = []) {
if (isset($values['id']) && ($sitemap = SimpleSitemap::load($values['id'])) !== NULL) {
foreach ([
'type',
'label',
'weight',
] as $property) {
if (isset($values[$property])) {
$sitemap
->set('type', $values[$property]);
}
}
return $sitemap;
}
return parent::create($values);
}
/**
* {@inheritdoc}
*/
protected function doSave($id, EntityInterface $entity) {
/** @var SimpleSitemapInterface $entity */
if (!preg_match('/^[\\w\\-_]+$/', $id)) {
throw new \InvalidArgumentException("The sitemap ID can only include alphanumeric characters, dashes and underscores.");
}
if ($entity
->get('type') === NULL || $entity
->get('type') === '') {
throw new \InvalidArgumentException("The sitemap must define its sitemap type information.");
}
if ($this->entityTypeManager
->getStorage('simple_sitemap_type')
->load($entity
->get('type')) === NULL) {
throw new \InvalidArgumentException("Sitemap type {$entity->get('type')} does not exist.");
}
if ($entity
->label() === NULL || $entity
->label() === '') {
$entity
->set('label', $id);
}
if ($entity
->get('weight') === NULL || $entity
->get('weight') === '') {
$entity
->set('weight', 0);
}
return parent::doSave($id, $entity);
}
/*
* @todo Costs too much.
*/
protected function getChunkData(SimpleSitemapInterface $entity) {
return \Drupal::database()
->select('simple_sitemap', 's')
->fields('s', [
'id',
'type',
'delta',
'sitemap_created',
'status',
'link_count',
])
->condition('s.type', $entity
->id())
->execute()
->fetchAllAssoc('id');
}
public function publish(SimpleSitemap $entity) : void {
$unpublished_chunk = $this->database
->query('SELECT MAX(id) FROM {simple_sitemap} WHERE type = :type AND status = :status', [
':type' => $entity
->id(),
':status' => self::SITEMAP_UNPUBLISHED,
])
->fetchField();
// Only allow publishing a sitemap variant if there is an unpublished
// sitemap variant, as publishing involves deleting the currently published
// variant.
if (FALSE !== $unpublished_chunk) {
$this->database
->delete('simple_sitemap')
->condition('type', $entity
->id())
->condition('status', self::SITEMAP_PUBLISHED)
->execute();
$this->database
->query('UPDATE {simple_sitemap} SET status = :status WHERE type = :type', [
':type' => $entity
->id(),
':status' => self::SITEMAP_PUBLISHED,
]);
}
}
public function deleteContent(SimpleSitemap $entity) : void {
$this
->purgeContent($entity
->id());
}
public function addChunk(SimpleSitemapInterface $entity, string $xml, $link_count) : void {
$highest_delta = $this->database
->query('SELECT MAX(delta) FROM {simple_sitemap} WHERE type = :type AND status = :status', [
':type' => $entity
->id(),
':status' => self::SITEMAP_UNPUBLISHED,
])
->fetchField();
$this->database
->insert('simple_sitemap')
->fields([
'delta' => NULL === $highest_delta ? self::SITEMAP_CHUNK_FIRST_DELTA : $highest_delta + 1,
'type' => $entity
->id(),
'sitemap_string' => $xml,
'sitemap_created' => $this->time
->getRequestTime(),
'status' => 0,
'link_count' => $link_count,
])
->execute();
}
public function generateIndex(SimpleSitemapInterface $entity, string $xml) : void {
$this->database
->merge('simple_sitemap')
->keys([
'delta' => self::SITEMAP_INDEX_DELTA,
'type' => $entity
->id(),
'status' => 0,
])
->insertFields([
'delta' => self::SITEMAP_INDEX_DELTA,
'type' => $entity
->id(),
'sitemap_string' => $xml,
'sitemap_created' => $this->time
->getRequestTime(),
'status' => 0,
])
->updateFields([
'sitemap_string' => $xml,
'sitemap_created' => $this->time
->getRequestTime(),
])
->execute();
}
public function getChunkCount(SimpleSitemap $entity, ?bool $status = SimpleSitemap::FETCH_BY_STATUS_ALL) : int {
$query = $this->database
->select('simple_sitemap', 's')
->condition('s.type', $entity
->id())
->condition('s.delta', self::SITEMAP_INDEX_DELTA, '<>');
if ($status !== SimpleSitemap::FETCH_BY_STATUS_ALL) {
$query
->condition('s.status', $status);
}
return (int) $query
->countQuery()
->execute()
->fetchField();
}
/**
* @todo Duplicate query.
*/
public function getChunk(SimpleSitemap $entity, ?bool $status, int $delta = SimpleSitemapStorage::SITEMAP_CHUNK_FIRST_DELTA) : string {
if ($delta === self::SITEMAP_INDEX_DELTA) {
throw new SitemapNotExistsException('The sitemap chunk delta needs to be higher than 0.');
}
return $this
->getSitemapString($entity, $this
->getIdByDelta($entity, $delta, $status), $status);
}
public function hasIndex(SimpleSitemap $entity, bool $status) : bool {
try {
$this
->getIdByDelta($entity, self::SITEMAP_INDEX_DELTA, $status);
return TRUE;
} catch (SitemapNotExistsException $e) {
return FALSE;
}
}
/**
* @todo Duplicate query.
*/
public function getIndex(SimpleSitemap $entity, ?bool $status) : string {
return $this
->getSitemapString($entity, $this
->getIdByDelta($entity, self::SITEMAP_INDEX_DELTA, $status), $status);
}
protected function getIdByDelta(SimpleSitemap $entity, int $delta, bool $status) : int {
foreach ($this
->getChunkData($entity) as $chunk) {
if ($chunk->delta == $delta && $chunk->status == $status) {
return $chunk->id;
}
}
throw new SitemapNotExistsException();
}
protected function getSitemapString(SimpleSitemap $entity, int $id, ?bool $status) : string {
$chunk_data = $this
->getChunkData($entity);
if (!isset($chunk_data[$id])) {
throw new SitemapNotExistsException();
}
if (empty($chunk_data[$id]->sitemap_string)) {
$query = $this->database
->select('simple_sitemap', 's')
->fields('s', [
'sitemap_string',
])
->condition('status', $status)
->condition('id', $id);
$chunk_data[$id]->sitemap_string = $query
->execute()
->fetchField();
}
return $chunk_data[$id]->sitemap_string;
}
public function status(SimpleSitemap $entity) : int {
foreach ($this
->getChunkData($entity) as $chunk) {
$status[$chunk->status] = $chunk->status;
}
if (!isset($status)) {
return SimpleSitemap::SITEMAP_UNPUBLISHED;
}
if (count($status) === 1) {
return (int) reset($status) === self::SITEMAP_UNPUBLISHED ? SimpleSitemap::SITEMAP_UNPUBLISHED : SimpleSitemap::SITEMAP_PUBLISHED;
}
return SimpleSitemap::SITEMAP_PUBLISHED_GENERATING;
}
public function getCreated(SimpleSitemap $entity, ?bool $status = SimpleSitemap::FETCH_BY_STATUS_ALL) : ?string {
foreach ($this
->getChunkData($entity) as $chunk) {
if ($status === SimpleSitemap::FETCH_BY_STATUS_ALL || $chunk->status == $status) {
return $chunk->sitemap_created;
}
}
return NULL;
}
public function getLinkCount(SimpleSitemap $entity, ?bool $status = SimpleSitemap::FETCH_BY_STATUS_ALL) : int {
$count = 0;
foreach ($this
->getChunkData($entity) as $chunk) {
if ($chunk->delta != self::SITEMAP_INDEX_DELTA && ($status === SimpleSitemap::FETCH_BY_STATUS_ALL || $chunk->status == $status)) {
$count += (int) $chunk->link_count;
}
}
return $count;
}
public function purgeContent($variants = NULL, ?bool $status = SimpleSitemap::FETCH_BY_STATUS_ALL) : void {
$query = \Drupal::database()
->delete('simple_sitemap');
if ($status !== SimpleSitemap::FETCH_BY_STATUS_ALL) {
$query
->condition('status', $status);
}
if ($variants !== NULL) {
$query
->condition('type', (array) $variants, 'IN');
}
$query
->execute();
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ConfigEntityStorage:: |
protected | property | The config factory service. | |
ConfigEntityStorage:: |
protected | property | The config storage service. | |
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 creation of entities. 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 |
Implements Drupal\Core\Entity\EntityStorageInterface::save(). Overrides EntityStorageBase:: |
|
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 | ||
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
public | function | 2 | |
DependencySerializationTrait:: |
public | function | 2 | |
EntityHandlerBase:: |
protected | property | The module handler to invoke hooks on. | 5 |
EntityHandlerBase:: |
protected | function | Gets the module handler. | 5 |
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 |
Deletes permanently saved entities. Overrides EntityStorageInterface:: |
2 |
EntityStorageBase:: |
protected | function | Performs post save entity processing. | 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 |
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 entity cache. Overrides EntityStorageInterface:: |
1 |
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. | ||
SimpleSitemapStorage:: |
protected | property | ||
SimpleSitemapStorage:: |
protected | property | ||
SimpleSitemapStorage:: |
protected | property | ||
SimpleSitemapStorage:: |
protected | property | ||
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
public | function |
Constructs a new entity object, without permanently saving it. Overrides EntityStorageBase:: |
|
SimpleSitemapStorage:: |
public static | function |
Instantiates a new instance of this entity handler. Overrides ConfigEntityStorage:: |
|
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
protected | function |
@todo Improve performance of his method. Overrides ConfigEntityStorage:: |
|
SimpleSitemapStorage:: |
protected | function |
Loads all sitemaps, sorted by their weight. Overrides ConfigEntityStorage:: |
|
SimpleSitemapStorage:: |
protected | function |
Performs storage-specific saving of the entity. Overrides ConfigEntityStorage:: |
|
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
public | function | @todo Duplicate query. | |
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
protected | function | ||
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
protected | function | ||
SimpleSitemapStorage:: |
public | function | @todo Duplicate query. | |
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
protected | function | ||
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
public | function |
Load entities by their property values. Overrides EntityStorageBase:: |
|
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
public | constant | ||
SimpleSitemapStorage:: |
public | constant | ||
SimpleSitemapStorage:: |
protected | constant | ||
SimpleSitemapStorage:: |
protected | constant | ||
SimpleSitemapStorage:: |
public | function | ||
SimpleSitemapStorage:: |
public | function |
Constructs a ConfigEntityStorage object. Overrides ConfigEntityStorage:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 4 |
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. |