Issue #2974156 by MegaChriz, k4v, John.nie, jian he, darrenwh, jurgenhaas, daffie, DuneBL, alexpott: TypeError: Argument 1 passed to _editor_get_file_uuids_by_field() must implement interface Drupal\Core\Entity\EntityInterface

merge-requests/1236/head^2
Alex Pott 2021-10-14 13:33:22 +01:00
parent c1933e73e7
commit cd735be4dd
No known key found for this signature in database
GPG Key ID: BDA67E7EE836E5CE
3 changed files with 113 additions and 3 deletions

View File

@ -396,13 +396,19 @@ 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]);
_editor_record_file_usage($added_files, $entity);
$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.

View File

@ -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().
*/

View File

@ -0,0 +1,68 @@
<?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();
}
}