Skip to content

Commit 78f3d4e

Browse files
kingjia90claude
andcommitted
Add null-data guard and regression tests for Block::rewriteIds
- Skip block elements with null data to avoid a potential fatal in Localizedfields::rewriteIds (setLocalizedValue() on null) - Add regression tests covering relation rewriting inside a Block and inside a Block nested in Localizedfields (Service::rewriteIds seam, as used by "Paste recursive, updating references") Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 5e4dcb7 commit 78f3d4e

2 files changed

Lines changed: 84 additions & 1 deletion

File tree

models/DataObject/ClassDefinition/Data/Block.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,14 +488,19 @@ public function rewriteIds(mixed $container, array $idMapping, array $params = [
488488
continue;
489489
}
490490

491+
$blockElementData = $blockElement->getData();
492+
if ($blockElementData === null) {
493+
continue;
494+
}
495+
491496
$blockElement->setData(
492497
$fieldDefinition->rewriteIds(
493498
$container,
494499
$idMapping,
495500
[
496501
...$params,
497502
// \Pimcore\Model\DataObject\ClassDefinition\Data::getDataFromObjectParam() reads 'injectedData'
498-
'injectedData' => $blockElement->getData(),
503+
'injectedData' => $blockElementData,
499504
],
500505
),
501506
);

tests/Model/DataType/BlockTest.php

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public function tearDown(): void
4848
protected function setUpTestClasses(): void
4949
{
5050
$this->tester->setupPimcoreClass_Block();
51+
$this->tester->setupPimcoreClass_RelationTest();
5152
}
5253

5354
/**
@@ -243,4 +244,81 @@ public function testBlockDataFromReferences(): void
243244
Cache::getHandler()->setHandleCli(false);
244245
}
245246
}
247+
248+
/**
249+
* Verifies that relations inside a Block are rewritten by Service::rewriteIds
250+
* (used by "Paste recursive, updating references")
251+
*
252+
* @throws Exception
253+
*/
254+
public function testRewriteIdsInsideBlock(): void
255+
{
256+
$oldTarget = $this->createRelationTestObject('rewrite-old-target');
257+
$newTarget = $this->createRelationTestObject('rewrite-new-target');
258+
259+
$object = $this->createBlockObject();
260+
$data = [
261+
'blockinput' => new BlockElement('blockinput', 'input', 'test-input'),
262+
'blockadvancedRelations' => new BlockElement(
263+
'blockadvancedRelations',
264+
'advancedManyToManyRelation',
265+
[new DataObject\Data\ElementMetadata('blockadvancedRelations', [], $oldTarget)]
266+
),
267+
];
268+
$object->setTestblock([$data]);
269+
$object->save();
270+
271+
$object = DataObject::getById($object->getId(), ['force' => true]);
272+
Service::rewriteIds($object, ['object' => [$oldTarget->getId() => $newTarget->getId()]]);
273+
274+
$rewritten = $object->getTestblock()[0]['blockadvancedRelations']->getData();
275+
$this->assertEquals($newTarget->getId(), $rewritten[0]->getElement()->getId());
276+
277+
//rewritten reference should survive save & reload
278+
$object->save();
279+
$object = DataObject::getById($object->getId(), ['force' => true]);
280+
281+
$reloaded = $object->getTestblock()[0]['blockadvancedRelations']->getData();
282+
$this->assertEquals($newTarget->getId(), $reloaded[0]->getElement()->getId());
283+
}
284+
285+
/**
286+
* Verifies that relations inside a Block nested in Localizedfields are rewritten
287+
* by Service::rewriteIds (used by "Paste recursive, updating references")
288+
*
289+
* @throws Exception
290+
*/
291+
public function testRewriteIdsInsideLocalizedBlock(): void
292+
{
293+
$oldTarget = TestHelper::createEmptyObject();
294+
$newTarget = TestHelper::createEmptyObject();
295+
296+
$object = $this->createBlockObject();
297+
$data = [
298+
'lblockadvancedRelations' => new BlockElement(
299+
'lblockadvancedRelations',
300+
'advancedManyToManyRelation',
301+
[new DataObject\Data\ElementMetadata('lblockadvancedRelations', [], $oldTarget)]
302+
),
303+
];
304+
$object->setLtestblock([$data], 'de');
305+
$object->save();
306+
307+
$object = DataObject::getById($object->getId(), ['force' => true]);
308+
Service::rewriteIds($object, ['object' => [$oldTarget->getId() => $newTarget->getId()]]);
309+
310+
$rewritten = $object->getLtestblock('de')[0]['lblockadvancedRelations']->getData();
311+
$this->assertEquals($newTarget->getId(), $rewritten[0]->getElement()->getId());
312+
}
313+
314+
protected function createRelationTestObject(string $key): DataObject\RelationTest
315+
{
316+
$object = new DataObject\RelationTest();
317+
$object->setParent(Service::createFolderByPath('__test/relationobjects'));
318+
$object->setKey($key);
319+
$object->setPublished(true);
320+
$object->save();
321+
322+
return $object;
323+
}
246324
}

0 commit comments

Comments
 (0)