Loading core/modules/editor/editor.module +9 −3 Original line number Diff line number Diff line Loading @@ -396,14 +396,20 @@ function editor_entity_update(EntityInterface $entity) { // File references that existed both in the previous version of the revision // and in the new one don't need their usage to be updated. else { $original_uuids_by_field = _editor_get_file_uuids_by_field($entity->original); $original_uuids_by_field = empty($entity->original) ? [] : _editor_get_file_uuids_by_field($entity->original); $uuids_by_field = _editor_get_file_uuids_by_field($entity); // Detect file usages that should be incremented. foreach ($uuids_by_field as $field => $uuids) { $added_files = array_diff($uuids_by_field[$field], $original_uuids_by_field[$field]); $original_uuids = isset($original_uuids_by_field[$field]) ? $original_uuids_by_field[$field] : []; if ($added_files = array_diff($uuids_by_field[$field], $original_uuids)) { _editor_record_file_usage($added_files, $entity); } } // Detect file usages that should be decremented. foreach ($original_uuids_by_field as $field => $uuids) { Loading core/modules/editor/tests/modules/editor_test.module +36 −0 Original line number Diff line number Diff line Loading @@ -5,9 +5,45 @@ * Helper module for the Text Editor tests. */ use Drupal\Core\Entity\EntityInterface; use Drupal\node\NodeInterface; use Drupal\filter\FilterFormatInterface; use Drupal\file\FileInterface; /** * Implements hook_entity_update(). * * @see \Drupal\Tests\editor\Kernel\EntityUpdateTest */ function editor_test_entity_update(EntityInterface $entity) { // Only act on nodes. if (!$entity instanceof NodeInterface) { return; } // Avoid infinite loop by only going through our post save logic once. if (!empty($entity->editor_test_updating)) { return; } // Set flag for whether or not the entity needs to be resaved. $needs_update = FALSE; // Perform our post save logic. if ($entity->title->value == 'test updated') { // Change the node title. $entity->title->value = 'test updated 2'; $needs_update = TRUE; } if ($needs_update) { // Set flag on entity that our logic was already executed. $entity->editor_test_updating = TRUE; // And resave entity. $entity->save(); } } /** * Implements hook_editor_js_settings_alter(). */ Loading core/modules/editor/tests/src/Kernel/EntityUpdateTest.php 0 → 100644 +68 −0 Original line number Diff line number Diff line <?php namespace Drupal\Tests\editor\Kernel; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\node\Entity\NodeType; use Drupal\node\Entity\Node; /** * Tests updating an entity. * * @group editor */ class EntityUpdateTest extends EntityKernelTestBase { /** * Modules to enable. * * @var array */ protected static $modules = ['editor', 'editor_test', 'node']; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->installSchema('node', ['node_access']); $this->installConfig(['node']); // Create a node type for testing. $type = NodeType::create(['type' => 'page', 'name' => 'page']); $type->save(); // Set editor_test module weight to be lower than editor module's weight so // that editor_test_entity_update() is called before editor_entity_update(). $extension_config = \Drupal::configFactory()->get('core.extension'); $editor_module_weight = $extension_config->get('module.editor'); module_set_weight('editor_test', $editor_module_weight - 1); } /** * Tests updating an existing entity. * * @see editor_test_entity_update() */ public function testEntityUpdate() { // Create a node. $node = Node::create([ 'type' => 'page', 'title' => 'test', ]); $node->save(); // Update the node. // What happens is the following: // 1. \Drupal\Core\Entity\EntityStorageBase::doPostSave() gets called. // 2. editor_test_entity_update() gets called. // 3. A resave of the updated entity gets triggered (second save call). // 4. \Drupal\Core\Entity\EntityStorageBase::doPostSave() gets called. // 5. editor_test_entity_update() gets called. // 6. editor_entity_update() gets called (caused by the second save call). // 7. editor_entity_update() gets called (caused by the first save call). $node->title->value = 'test updated'; $node->save(); } } Loading
core/modules/editor/editor.module +9 −3 Original line number Diff line number Diff line Loading @@ -396,14 +396,20 @@ function editor_entity_update(EntityInterface $entity) { // File references that existed both in the previous version of the revision // and in the new one don't need their usage to be updated. else { $original_uuids_by_field = _editor_get_file_uuids_by_field($entity->original); $original_uuids_by_field = empty($entity->original) ? [] : _editor_get_file_uuids_by_field($entity->original); $uuids_by_field = _editor_get_file_uuids_by_field($entity); // Detect file usages that should be incremented. foreach ($uuids_by_field as $field => $uuids) { $added_files = array_diff($uuids_by_field[$field], $original_uuids_by_field[$field]); $original_uuids = isset($original_uuids_by_field[$field]) ? $original_uuids_by_field[$field] : []; if ($added_files = array_diff($uuids_by_field[$field], $original_uuids)) { _editor_record_file_usage($added_files, $entity); } } // Detect file usages that should be decremented. foreach ($original_uuids_by_field as $field => $uuids) { Loading
core/modules/editor/tests/modules/editor_test.module +36 −0 Original line number Diff line number Diff line Loading @@ -5,9 +5,45 @@ * Helper module for the Text Editor tests. */ use Drupal\Core\Entity\EntityInterface; use Drupal\node\NodeInterface; use Drupal\filter\FilterFormatInterface; use Drupal\file\FileInterface; /** * Implements hook_entity_update(). * * @see \Drupal\Tests\editor\Kernel\EntityUpdateTest */ function editor_test_entity_update(EntityInterface $entity) { // Only act on nodes. if (!$entity instanceof NodeInterface) { return; } // Avoid infinite loop by only going through our post save logic once. if (!empty($entity->editor_test_updating)) { return; } // Set flag for whether or not the entity needs to be resaved. $needs_update = FALSE; // Perform our post save logic. if ($entity->title->value == 'test updated') { // Change the node title. $entity->title->value = 'test updated 2'; $needs_update = TRUE; } if ($needs_update) { // Set flag on entity that our logic was already executed. $entity->editor_test_updating = TRUE; // And resave entity. $entity->save(); } } /** * Implements hook_editor_js_settings_alter(). */ Loading
core/modules/editor/tests/src/Kernel/EntityUpdateTest.php 0 → 100644 +68 −0 Original line number Diff line number Diff line <?php namespace Drupal\Tests\editor\Kernel; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\node\Entity\NodeType; use Drupal\node\Entity\Node; /** * Tests updating an entity. * * @group editor */ class EntityUpdateTest extends EntityKernelTestBase { /** * Modules to enable. * * @var array */ protected static $modules = ['editor', 'editor_test', 'node']; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->installSchema('node', ['node_access']); $this->installConfig(['node']); // Create a node type for testing. $type = NodeType::create(['type' => 'page', 'name' => 'page']); $type->save(); // Set editor_test module weight to be lower than editor module's weight so // that editor_test_entity_update() is called before editor_entity_update(). $extension_config = \Drupal::configFactory()->get('core.extension'); $editor_module_weight = $extension_config->get('module.editor'); module_set_weight('editor_test', $editor_module_weight - 1); } /** * Tests updating an existing entity. * * @see editor_test_entity_update() */ public function testEntityUpdate() { // Create a node. $node = Node::create([ 'type' => 'page', 'title' => 'test', ]); $node->save(); // Update the node. // What happens is the following: // 1. \Drupal\Core\Entity\EntityStorageBase::doPostSave() gets called. // 2. editor_test_entity_update() gets called. // 3. A resave of the updated entity gets triggered (second save call). // 4. \Drupal\Core\Entity\EntityStorageBase::doPostSave() gets called. // 5. editor_test_entity_update() gets called. // 6. editor_entity_update() gets called (caused by the second save call). // 7. editor_entity_update() gets called (caused by the first save call). $node->title->value = 'test updated'; $node->save(); } }