diff --git a/core/modules/path/src/Plugin/Field/FieldType/PathItem.php b/core/modules/path/src/Plugin/Field/FieldType/PathItem.php index ff8d795..a335d4b 100644 --- a/core/modules/path/src/Plugin/Field/FieldType/PathItem.php +++ b/core/modules/path/src/Plugin/Field/FieldType/PathItem.php @@ -83,6 +83,28 @@ public function preSave() { /** * {@inheritdoc} */ + public function __set($name, $value) { + // Also ensure that existing values are loaded when setting a value, this + // ensures that it is possible to set a new value immediately after loading + // an entity. + $this->ensureLoaded(); + parent::__set($name, $value); + } + + /** + * {@inheritdoc} + */ + public function set($property_name, $value, $notify = TRUE) { + // Also ensure that existing values are loaded when setting a value, this + // ensures that it is possible to set a new value immediately after loading + // an entity. + $this->ensureLoaded(); + return parent::set($property_name, $value, $notify); + } + + /** + * {@inheritdoc} + */ public function postSave($update) { if (!$update) { if ($this->alias) { diff --git a/core/modules/path/tests/src/Kernel/PathItemTest.php b/core/modules/path/tests/src/Kernel/PathItemTest.php index 1d694d7..769fa3a 100644 --- a/core/modules/path/tests/src/Kernel/PathItemTest.php +++ b/core/modules/path/tests/src/Kernel/PathItemTest.php @@ -125,6 +125,23 @@ public function testPathItem() { $old_alias = $alias_storage->lookupPathSource('/foo', $node->language()->getId()); $this->assertFalse($old_alias); + // Reload the node to make sure that it is possibly to set a value + // immediately after loading. + $node_storage->resetCache(); + $loaded_node = $node_storage->load($node->id()); + $loaded_node->get('path')->alias = '/foobar'; + $loaded_node->save(); + + $node_storage->resetCache(); + $loaded_node = $node_storage->load($node->id()); + $this->assertFalse($loaded_node->get('path')->isEmpty()); + $this->assertEquals('/foobar', $loaded_node->get('path')->alias); + $stored_alias = $alias_storage->lookupPathAlias('/' . $node->toUrl()->getInternalPath(), $node->language()->getId()); + $this->assertEquals('/foobar', $stored_alias); + + $old_alias = $alias_storage->lookupPathSource('/bar', $node->language()->getId()); + $this->assertFalse($old_alias); + $loaded_node->get('path')->alias = ''; $this->assertEquals('', $loaded_node->get('path')->alias);