class EntityAliasTypeBase in Pathauto 8
A pathauto alias type plugin for entities with canonical links.
Plugin annotation
@AliasType(
id = "canonical_entities",
deriver = "\Drupal\pathauto\Plugin\Deriver\EntityAliasTypeDeriver"
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\pathauto\Plugin\pathauto\AliasType\EntityAliasTypeBase implements ContainerFactoryPluginInterface, AliasTypeBatchUpdateInterface, AliasTypeInterface uses MessengerTrait
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
Expanded class hierarchy of EntityAliasTypeBase
File
- src/
Plugin/ pathauto/ AliasType/ EntityAliasTypeBase.php, line 28
Namespace
Drupal\pathauto\Plugin\pathauto\AliasTypeView source
class EntityAliasTypeBase extends ContextAwarePluginBase implements AliasTypeInterface, AliasTypeBatchUpdateInterface, ContainerFactoryPluginInterface {
use MessengerTrait;
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* The language manager service.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager;
/**
* The entity manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The key/value manager service.
*
* @var \Drupal\Core\KeyValueStore\KeyValueFactoryInterface
*/
protected $keyValue;
/**
* The database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* The path prefix for this entity type.
*
* @var string
*/
protected $prefix;
/**
* Constructs a EntityAliasTypeBase instance.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler service.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager service.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity manager service.
* @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value
* The key/value manager service.
* @param \Drupal\Core\Database\Connection $database
* The database connection.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ModuleHandlerInterface $module_handler, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, KeyValueFactoryInterface $key_value, Connection $database) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->moduleHandler = $module_handler;
$this->languageManager = $language_manager;
$this->entityTypeManager = $entity_type_manager;
$this->keyValue = $key_value;
$this->database = $database;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('module_handler'), $container
->get('language_manager'), $container
->get('entity_type.manager'), $container
->get('keyvalue'), $container
->get('database'));
}
/**
* {@inheritdoc}
*/
public function getLabel() {
$definition = $this
->getPluginDefinition();
// Cast the admin label to a string since it is an object.
// @see \Drupal\Core\StringTranslation\TranslationWrapper
return (string) $definition['label'];
}
/**
* {@inheritdoc}
*/
public function getTokenTypes() {
$definition = $this
->getPluginDefinition();
return $definition['types'];
}
/**
* {@inheritdoc}
*/
public function batchUpdate($action, &$context) {
if (!isset($context['sandbox']['current'])) {
$context['sandbox']['count'] = 0;
$context['sandbox']['current'] = 0;
}
$entity_type = $this->entityTypeManager
->getDefinition($this
->getEntityTypeId());
$id_key = $entity_type
->getKey('id');
$query = $this->database
->select($entity_type
->get('base_table'), 'base_table');
$query
->leftJoin($this
->getTableInfo()['table'], 'pa', "CONCAT('" . $this
->getSourcePrefix() . "' , base_table.{$id_key}) = pa.{$this->getTableInfo()['fields']['path']}");
$query
->addField('base_table', $id_key, 'id');
switch ($action) {
case 'create':
$query
->isNull("pa.{$this->getTableInfo()['fields']['path']}");
break;
case 'update':
$query
->isNotNull("pa.{$this->getTableInfo()['fields']['path']}");
break;
case 'all':
// Nothing to do. We want all paths.
break;
default:
// Unknown action. Abort!
return;
}
$query
->condition('base_table.' . $id_key, $context['sandbox']['current'], '>');
$query
->orderBy('base_table.' . $id_key);
$query
->addTag('pathauto_bulk_update');
$query
->addMetaData('entity', $this
->getEntityTypeId());
// Get the total amount of items to process.
if (!isset($context['sandbox']['total'])) {
$context['sandbox']['total'] = $query
->countQuery()
->execute()
->fetchField();
// If there are no entities to update, then stop immediately.
if (!$context['sandbox']['total']) {
$context['finished'] = 1;
return;
}
}
$query
->range(0, 25);
$ids = $query
->execute()
->fetchCol();
$updates = $this
->bulkUpdate($ids);
$context['sandbox']['count'] += count($ids);
$context['sandbox']['current'] = !empty($ids) ? max($ids) : 0;
$context['results']['updates'] += $updates;
$context['message'] = $this
->t('Updated alias for %label @id.', [
'%label' => $entity_type
->getLabel(),
'@id' => end($ids),
]);
if ($context['sandbox']['count'] != $context['sandbox']['total']) {
$context['finished'] = $context['sandbox']['count'] / $context['sandbox']['total'];
}
}
/**
* {@inheritdoc}
*/
public function batchDelete(&$context) {
if (!isset($context['sandbox']['current'])) {
$context['sandbox']['count'] = 0;
$context['sandbox']['current'] = 0;
}
$entity_type = $this->entityTypeManager
->getDefinition($this
->getEntityTypeId());
$id_key = $entity_type
->getKey('id');
$query = $this->database
->select($entity_type
->get('base_table'), 'base_table');
$query
->innerJoin($this
->getTableInfo()['table'], 'pa', "CONCAT('" . $this
->getSourcePrefix() . "' , base_table.{$id_key}) = pa.{$this->getTableInfo()['fields']['path']}");
$query
->addField('base_table', $id_key, 'id');
$query
->addField('pa', $this
->getTableInfo()['fields']['id']);
$query
->condition("pa.{$this->getTableInfo()['fields']['id']}}", $context['sandbox']['current'], '>');
$query
->orderBy("pa.{$this->getTableInfo()['fields']['id']}}");
$query
->addTag('pathauto_bulk_delete');
$query
->addMetaData('entity', $this
->getEntityTypeId());
// Get the total amount of items to process.
if (!isset($context['sandbox']['total'])) {
$context['sandbox']['total'] = $query
->countQuery()
->execute()
->fetchField();
// If there are no entities to delete, then stop immediately.
if (!$context['sandbox']['total']) {
$context['finished'] = 1;
return;
}
}
$query
->range(0, 100);
$pids_by_id = $query
->execute()
->fetchAllKeyed();
PathautoState::bulkDelete($this
->getEntityTypeId(), $pids_by_id);
$context['sandbox']['count'] += count($pids_by_id);
$context['sandbox']['current'] = !empty($pids_by_id) ? max($pids_by_id) : 0;
$context['results']['deletions'][] = $this
->getLabel();
if ($context['sandbox']['count'] != $context['sandbox']['total']) {
$context['finished'] = $context['sandbox']['count'] / $context['sandbox']['total'];
}
}
/**
* Returns the entity type ID.
*
* @return string
* The entity type ID.
*/
protected function getEntityTypeId() {
return $this
->getDerivativeId();
}
/**
* Update the URL aliases for multiple entities.
*
* @param array $ids
* An array of entity IDs.
* @param array $options
* An optional array of additional options.
*
* @return int
* The number of updated URL aliases.
*/
protected function bulkUpdate(array $ids, array $options = []) {
$options += [
'message' => FALSE,
];
$updates = 0;
$entities = $this->entityTypeManager
->getStorage($this
->getEntityTypeId())
->loadMultiple($ids);
foreach ($entities as $entity) {
// Update aliases for the entity's default language and its translations.
foreach ($entity
->getTranslationLanguages() as $langcode => $language) {
$translated_entity = $entity
->getTranslation($langcode);
$result = \Drupal::service('pathauto.generator')
->updateEntityAlias($translated_entity, 'bulkupdate', $options);
if ($result) {
$updates++;
}
}
}
if (!empty($options['message'])) {
$this->messenger
->addMessage($this->translationManager
->formatPlural(count($ids), 'Updated 1 %label URL alias.', 'Updated @count %label URL aliases.'), [
'%label' => $this
->getLabel(),
]);
}
return $updates;
}
/**
* Deletes the URL aliases for multiple entities.
*
* @param int[] $pids_by_id
* A list of path IDs keyed by entity ID.
*
* @deprecated Use \Drupal\pathauto\PathautoState::bulkDelete() instead.
*/
protected function bulkDelete(array $pids_by_id) {
PathautoState::bulkDelete($this
->getEntityTypeId(), $pids_by_id);
}
/**
* {@inheritdoc}
*/
public function calculateDependencies() {
$dependencies = [];
$dependencies['module'][] = $this->entityTypeManager
->getDefinition($this
->getEntityTypeId())
->getProvider();
return $dependencies;
}
/**
* {@inheritdoc}
*/
public function applies($object) {
return $object instanceof FieldableEntityInterface && $object
->getEntityTypeId() == $this
->getEntityTypeId();
}
/**
* {@inheritdoc}
*/
public function getSourcePrefix() {
if (empty($this->prefix)) {
$entity_type = $this->entityTypeManager
->getDefinition($this
->getEntityTypeId());
$path = $entity_type
->getLinkTemplate('canonical');
$this->prefix = substr($path, 0, strpos($path, '{'));
}
return $this->prefix;
}
/**
* {@inheritdoc}
*/
public function setContextValue($name, $value) {
// Overridden to avoid merging existing cacheability metadata, which is not
// relevant for alias type plugins.
$this->context[$name] = new Context($this
->getContextDefinition($name), $value);
return $this;
}
/**
* Returns information about the path alias table and field names.
*
* @return array
* An array with the following structure:
* - table: the name of the table where path aliases are stored;
* - fields: an array containing the mapping of path alias properties to
* their table column names.
*/
private function getTableInfo() {
if (version_compare(\Drupal::VERSION, '8.8', '<')) {
return [
'table' => 'url_alias',
'fields' => [
'id' => 'pid',
'path' => 'source',
'alias' => 'alias',
'langcode' => 'langcode',
],
];
}
else {
return [
'table' => 'path_alias',
'fields' => [
'id' => 'id',
'path' => 'path',
'alias' => 'alias',
'langcode' => 'langcode',
],
];
}
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ContextAwarePluginBase:: |
protected | property | The data objects representing the context of this plugin. | |
ContextAwarePluginBase:: |
private | property | Data objects representing the contexts passed in the plugin configuration. | |
ContextAwarePluginBase:: |
protected | function | Wraps the context handler. | |
ContextAwarePluginBase:: |
protected | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
The cache contexts associated with this object. Overrides CacheableDependencyInterface:: |
9 |
ContextAwarePluginBase:: |
public | function |
The maximum age for which this object may be cached. Overrides CacheableDependencyInterface:: |
7 |
ContextAwarePluginBase:: |
public | function |
The cache tags associated with this object. Overrides CacheableDependencyInterface:: |
4 |
ContextAwarePluginBase:: |
public | function |
This code is identical to the Component in order to pick up a different
Context class. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the value for a defined context. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the values for all defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Set a context on this plugin. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function | Implements magic __get() method. | |
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 | |
EntityAliasTypeBase:: |
protected | property | The database connection. | |
EntityAliasTypeBase:: |
protected | property | The entity manager service. | |
EntityAliasTypeBase:: |
protected | property | The key/value manager service. | |
EntityAliasTypeBase:: |
protected | property | The language manager service. | |
EntityAliasTypeBase:: |
protected | property | The module handler service. | |
EntityAliasTypeBase:: |
protected | property | The path prefix for this entity type. | |
EntityAliasTypeBase:: |
public | function |
Determines if this plugin type can apply a given object. Overrides AliasTypeInterface:: |
1 |
EntityAliasTypeBase:: |
public | function |
Gets called to batch delete all aliases created by pathauto. Overrides AliasTypeBatchUpdateInterface:: |
|
EntityAliasTypeBase:: |
public | function |
Gets called to batch update all entries. Overrides AliasTypeBatchUpdateInterface:: |
|
EntityAliasTypeBase:: |
protected | function | Deletes the URL aliases for multiple entities. | |
EntityAliasTypeBase:: |
protected | function | Update the URL aliases for multiple entities. | |
EntityAliasTypeBase:: |
public | function | ||
EntityAliasTypeBase:: |
public static | function |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
1 |
EntityAliasTypeBase:: |
protected | function | Returns the entity type ID. | 1 |
EntityAliasTypeBase:: |
public | function |
Get the label. Overrides AliasTypeInterface:: |
1 |
EntityAliasTypeBase:: |
public | function |
Returns the source prefix; used for bulk delete. Overrides AliasTypeInterface:: |
1 |
EntityAliasTypeBase:: |
private | function | Returns information about the path alias table and field names. | |
EntityAliasTypeBase:: |
public | function |
Get the token types. Overrides AliasTypeInterface:: |
|
EntityAliasTypeBase:: |
public | function |
Sets the value for a defined context. Overrides ContextAwarePluginBase:: |
|
EntityAliasTypeBase:: |
public | function |
Constructs a EntityAliasTypeBase instance. Overrides ContextAwarePluginBase:: |
1 |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
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. | |
TypedDataTrait:: |
protected | property | The typed data manager used for creating the data types. | |
TypedDataTrait:: |
public | function | Gets the typed data manager. | 2 |
TypedDataTrait:: |
public | function | Sets the typed data manager. | 2 |