class PathItem
Same name and namespace in other branches
- 11.x core/modules/path/src/Plugin/Field/FieldType/PathItem.php \Drupal\path\Plugin\Field\FieldType\PathItem
- 10 core/modules/path/src/Plugin/Field/FieldType/PathItem.php \Drupal\path\Plugin\Field\FieldType\PathItem
- 9 core/modules/path/src/Plugin/Field/FieldType/PathItem.php \Drupal\path\Plugin\Field\FieldType\PathItem
- 8.9.x core/modules/path/src/Plugin/Field/FieldType/PathItem.php \Drupal\path\Plugin\Field\FieldType\PathItem
Defines the 'path' entity field type.
Attributes
#[FieldType(id: "path", label: new TranslatableMarkup("Path"), description: new TranslatableMarkup("An entity field containing a path alias and related data."), default_widget: "path", no_ui: TRUE, list_class: PathFieldItemList::class, constraints: [
"PathAlias" => [],
])]
Hierarchy
- class \Drupal\Core\TypedData\TypedData implements \Drupal\Core\TypedData\TypedDataInterface, \Drupal\Component\Plugin\PluginInspectionInterface uses \Drupal\Core\DependencyInjection\DependencySerializationTrait, \Drupal\Core\StringTranslation\StringTranslationTrait, \Drupal\Core\TypedData\TypedDataTrait
- class \Drupal\Core\TypedData\Plugin\DataType\Map implements \Drupal\Core\TypedData\Plugin\DataType\IteratorAggregate, \Drupal\Core\TypedData\ComplexDataInterface extends \Drupal\Core\TypedData\TypedData
- class \Drupal\Core\Field\FieldItemBase implements \Drupal\Core\Field\FieldItemInterface extends \Drupal\Core\TypedData\Plugin\DataType\Map
- class \Drupal\path\Plugin\Field\FieldType\PathItem extends \Drupal\Core\Field\FieldItemBase
- class \Drupal\Core\Field\FieldItemBase implements \Drupal\Core\Field\FieldItemInterface extends \Drupal\Core\TypedData\Plugin\DataType\Map
- class \Drupal\Core\TypedData\Plugin\DataType\Map implements \Drupal\Core\TypedData\Plugin\DataType\IteratorAggregate, \Drupal\Core\TypedData\ComplexDataInterface extends \Drupal\Core\TypedData\TypedData
Expanded class hierarchy of PathItem
4 files declare their use of PathItem
- DefaultContentSubscriber.php in core/
modules/ path/ src/ EventSubscriber/ DefaultContentSubscriber.php - EntityResourceTestBase.php in core/
modules/ rest/ tests/ src/ Functional/ EntityResource/ EntityResourceTestBase.php - ResourceTestBase.php in core/
modules/ jsonapi/ tests/ src/ Functional/ ResourceTestBase.php - XmlEntityNormalizationQuirksTrait.php in core/
modules/ rest/ tests/ src/ Functional/ EntityResource/ XmlEntityNormalizationQuirksTrait.php
File
-
core/
modules/ path/ src/ Plugin/ Field/ FieldType/ PathItem.php, line 16
Namespace
Drupal\path\Plugin\Field\FieldTypeView source
class PathItem extends FieldItemBase {
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['alias'] = DataDefinition::create('string')->setLabel(t('Path alias'));
$properties['pid'] = DataDefinition::create('integer')->setLabel(t('Path id'));
$properties['langcode'] = DataDefinition::create('string')->setLabel(t('Language Code'));
return $properties;
}
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [];
}
/**
* {@inheritdoc}
*/
public function isEmpty() {
$alias = $this->get('alias')
->getValue();
$pid = $this->get('pid')
->getValue();
$langcode = $this->get('langcode')
->getValue();
return ($alias === NULL || $alias === '') && ($pid === NULL || $pid === '') && ($langcode === NULL || $langcode === '');
}
/**
* {@inheritdoc}
*/
public function preSave() {
$alias = $this->get('alias')
->getValue();
if ($alias !== NULL) {
$this->set('alias', trim($alias));
}
}
/**
* {@inheritdoc}
*/
public function postSave($update) {
$path_alias_storage = \Drupal::entityTypeManager()->getStorage('path_alias');
$entity = $this->getEntity();
$alias = $this->get('alias')
->getValue();
$pid = $this->get('pid')
->getValue();
$langcode = $this->get('langcode')
->getValue();
// If an explicit alias langcode is provided, use it. This allows code to
// preserve an existing alias language or set a specific language,
// including language-neutral, when creating or updating an alias.
// Otherwise, fall back to the field/entity langcode.
$alias_langcode = $langcode ?: $this->getLangcode();
// If we have an alias, we need to create or update a path alias entity.
if ($alias) {
$properties = [
'path' => '/' . $entity->toUrl()
->getInternalPath(),
'alias' => $alias,
'langcode' => $alias_langcode,
];
if (!$pid) {
// Try to load it from storage before creating it. In some cases the
// path alias could be created before this function runs. For example,
// \Drupal\workspaces\EntityOperations::entityTranslationInsert will
// create a translation, and an associated path alias will be created
// with it.
$query = $path_alias_storage->getQuery()
->accessCheck(FALSE);
foreach ($properties as $field => $value) {
$query->condition($field, $value);
}
$ids = $query->execute();
$pid = $ids ? reset($ids) : $pid;
}
if (!$pid) {
$path_alias = $path_alias_storage->create($properties);
$path_alias->save();
$this->set('pid', $path_alias->id());
}
else {
$path_alias = $path_alias_storage->load($pid);
$path_alias_changed = FALSE;
if ($alias != $path_alias->getAlias()) {
$path_alias->setAlias($alias);
$path_alias_changed = TRUE;
}
// Persist langcode-only updates when the alias text is unchanged.
if ($alias_langcode !== $path_alias->language()
->getId()) {
$path_alias->set('langcode', $alias_langcode);
$path_alias_changed = TRUE;
}
if ($path_alias_changed) {
$path_alias->save();
}
}
}
elseif ($pid) {
// Otherwise, delete the old alias if the user erased it.
$path_alias = $path_alias_storage->load($pid);
if ($entity->isDefaultRevision()) {
$path_alias_storage->delete([
$path_alias,
]);
}
else {
$path_alias_storage->deleteRevision($path_alias->getRevisionID());
}
}
}
/**
* {@inheritdoc}
*/
public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
$random = new Random();
$values['alias'] = '/' . str_replace(' ', '-', strtolower($random->sentences(3)));
return $values;
}
/**
* {@inheritdoc}
*/
public static function mainPropertyName() {
return 'alias';
}
}
Members
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.