Skip to content

Commit d367d44

Browse files
FIX Get valid CMS edit link for non-page data object (#1401)
The edit link for an elemental block on a DataObject that didn't subclass SiteTree was incorrectly created.
1 parent 2804343 commit d367d44

File tree

3 files changed

+45
-23
lines changed

3 files changed

+45
-23
lines changed

src/Models/BaseElement.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private function getElementCMSLink(bool $directLink)
916916
if ($page instanceof SiteTree) {
917917
$link = $page->CMSEditLink();
918918
} elseif (ClassInfo::hasMethod($page, 'CMSEditLink')) {
919-
$link = Controller::join_links($page->CMSEditLink(), 'ItemEditForm');
919+
$link = $page->CMSEditLink();
920920
}
921921
// In-line editable blocks should just take you to the page.
922922
// Editable ones should add the suffix for detail form.
@@ -931,10 +931,12 @@ private function getElementCMSLink(bool $directLink)
931931
$this->ID,
932932
'edit'
933933
);
934-
} else {
935-
// If $page is not a Page, then generate $link base on $page->CMSEditLink()
934+
} elseif ($link) {
935+
// If $page is not a Page, then generate $link based on $page->CMSEditLink()
936+
// for a gridfield edit form
936937
return Controller::join_links(
937938
$link,
939+
'ItemEditForm',
938940
'field',
939941
$relationName,
940942
'item',

tests/BaseElementTest.php

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -310,44 +310,52 @@ public function testGetAnchorsInContent(string $elementClass, string $elementNam
310310
public function getElementCMSLinkDataProvider()
311311
{
312312
return [
313-
// Element in DataObject with $directLink === true
314-
'element1' => [
313+
// Regular DataObject as parent
314+
'DataObject using $directLink' => [
315315
TestElement::class,
316316
'elementDataObject1',
317-
'http://localhost/admin/1/ItemEditForm/field/ElementalArea/item/',
317+
'@admin/[0-9]+/ItemEditForm/field/ElementalArea/item/[0-9]+/edit/?$@',
318318
true
319319
],
320-
// Element in DataObject with $inline_editable = false
321-
'element2' => [
320+
'DataObject not inline editable' => [
322321
TestElementDataObject::class,
323322
'testElementDataObject1',
324-
'http://localhost/admin/1/ItemEditForm/field/ElementalArea/item/',
323+
'@admin/[0-9]+/ItemEditForm/field/ElementalArea/item/[0-9]+/edit/?$@',
325324
],
326-
// Element in DataObject with $inline_editable = true
327-
'element3' => [
325+
'DataObject is inline editable' => [
328326
ElementContent::class,
329327
'contentDataObject1',
330-
'http://localhost/admin/1/ItemEditForm',
328+
'@admin/[0-9]+/?$@',
331329
],
332-
// Element in Page with $inline_editable = true
333-
'element4' => [
330+
// SiteTree subclass as parent
331+
'Page using $directLink' => [
334332
ElementContent::class,
335333
'content1',
336-
'http://localhost/admin/pages/edit/show/1',
334+
'@admin/pages/edit/EditForm/[0-9]+/field/ElementalArea/item/[0-9]+/edit/?$@',
335+
true
337336
],
338-
// Element in DataObject with $directLink === true
339-
'element5' => [
337+
'page not inline editable' => [
338+
TestElementDataObject::class,
339+
'testElementDataObject2',
340+
'@admin/pages/edit/EditForm/[0-9]+/field/ElementalArea/item/[0-9]+/edit/?$@',
341+
],
342+
'Page is inline editable' => [
340343
ElementContent::class,
341344
'content1',
342-
'admin/pages/edit/EditForm/1/field/ElementalArea/item/1/edit',
343-
true
345+
'@admin/pages/edit/show/[0-9]+/?$@',
344346
],
345-
// DataObject without CMSEditLink method
346-
'element6' => [
347+
// DataObject without CMSEditLink method implemented
348+
'No CMSEditLink method (inline editable)' => [
347349
TestElement::class,
348350
'elementDataObject2',
349351
null
350352
],
353+
'Not CMSEditLink method (using directLink)' => [
354+
TestElement::class,
355+
'elementDataObject2',
356+
null,
357+
true
358+
],
351359
];
352360
}
353361

@@ -360,9 +368,9 @@ public function testCMSEditLink(string $class, string $element, ?string $link, b
360368
$editLink = $object->CMSEditLink($directLink);
361369

362370
if ($link) {
363-
$this->assertStringContainsString($link, $editLink);
371+
$this->assertMatchesRegularExpression($link, $editLink);
364372
} else {
365-
$this->assertNull($link);
373+
$this->assertNull($editLink);
366374
}
367375
}
368376

tests/ElementalAreaDataObjectTest.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ DNADesign\Elemental\Models\ElementalArea:
1414
areaDataObject5:
1515
Title: Area 5
1616
OwnerClassName: DNADesign\Elemental\Tests\Src\TestPreviewableDataObjectWithLink
17+
areaDataObject6:
18+
Title: Area 6
19+
OwnerClassName: DNADesign\Elemental\Tests\Src\TestPage
1720

1821
DNADesign\Elemental\Tests\Src\TestDataObjectWithCMSEditLink:
1922
dataObject1:
@@ -66,6 +69,10 @@ DNADesign\Elemental\Tests\Src\TestElementDataObject:
6669
Title: Test Element inline-editable
6770
TestValue: 'Hello Test'
6871
ParentID: =>DNADesign\Elemental\Models\ElementalArea.areaDataObject1
72+
testElementDataObject2:
73+
Title: Test Element inline-editable
74+
TestValue: 'Hello Test'
75+
ParentID: =>DNADesign\Elemental\Models\ElementalArea.areaDataObject6
6976

7077
DNADesign\Elemental\Models\ElementContent:
7178
contentDataObject1:
@@ -80,3 +87,8 @@ DNADesign\Elemental\Tests\Src\TestMultipleHtmlFieldsElement:
8087
multiHtmlFields2:
8188
Field1: '<p>id="not-anchor"</p>'
8289
Field2: '<p>name="not-anchor2"</p>'
90+
91+
DNADesign\Elemental\Tests\Src\TestPage:
92+
testpage1:
93+
Title: Test Elemental
94+
ElementalAreaID: =>DNADesign\Elemental\Models\ElementalArea.areaDataObject6

0 commit comments

Comments
 (0)