diff --git a/docs/en/01_Tutorials/05_Dataobject_Relationship_Management.md b/docs/en/01_Tutorials/05_Dataobject_Relationship_Management.md index c52e6f576..918978f4f 100644 --- a/docs/en/01_Tutorials/05_Dataobject_Relationship_Management.md +++ b/docs/en/01_Tutorials/05_Dataobject_Relationship_Management.md @@ -172,7 +172,8 @@ We call `setDisplayFields()` directly on the component responsible for their ren Adding a `GridField` to a page type is a popular way to manage data, but not the only one. If your data requires a dedicated interface with more sophisticated search and management logic, consider - using the `[ModelAdmin](reference/modeladmin)` interface instead. + using the [ModelAdmin](/developer_guides/customising_the_admin_interface/modeladmin) + interface instead. ![tutorial:tutorial5_project_creation.jpg](../_images/tutorial5_project_creation.jpg) diff --git a/model/Hierarchy.php b/model/Hierarchy.php index c3e10ae17..51f510bcc 100644 --- a/model/Hierarchy.php +++ b/model/Hierarchy.php @@ -289,7 +289,8 @@ class Hierarchy extends DataExtension { foreach($children as $child) { $markingMatches = $this->markingFilterMatches($child); if($markingMatches) { - if($child->$numChildrenMethod()) { + // Mark a child node as unexpanded if it has children and has not already been expanded + if($child->$numChildrenMethod() && !$child->isExpanded()) { $child->markUnexpanded(); } else { $child->markExpanded(); diff --git a/tests/model/HierarchyTest.php b/tests/model/HierarchyTest.php index 735845529..5fee85703 100644 --- a/tests/model/HierarchyTest.php +++ b/tests/model/HierarchyTest.php @@ -59,12 +59,12 @@ class HierarchyTest extends SapphireTest { // Obj 3 has been deleted; let's bring it back from the grave $obj3 = Versioned::get_including_deleted("HierarchyTest_Object", "\"Title\" = 'Obj 3'")->First(); - // Check that both obj 3 children are returned - $this->assertEquals(array("Obj 3a", "Obj 3b", "Obj 3c"), + // Check that all obj 3 children are returned + $this->assertEquals(array("Obj 3a", "Obj 3b", "Obj 3c", "Obj 3d"), $obj3->AllHistoricalChildren()->column('Title')); // Check numHistoricalChildren - $this->assertEquals(3, $obj3->numHistoricalChildren()); + $this->assertEquals(4, $obj3->numHistoricalChildren()); } @@ -94,11 +94,11 @@ class HierarchyTest extends SapphireTest { public function testNumChildren() { $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj1')->numChildren(), 0); $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj2')->numChildren(), 2); - $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj3')->numChildren(), 3); + $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj3')->numChildren(), 4); $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj2a')->numChildren(), 2); $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj2b')->numChildren(), 0); $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj3a')->numChildren(), 2); - $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj3b')->numChildren(), 0); + $this->assertEquals($this->objFromFixture('HierarchyTest_Object', 'obj3d')->numChildren(), 0); $obj1 = $this->objFromFixture('HierarchyTest_Object', 'obj1'); $this->assertEquals($obj1->numChildren(), 0); @@ -180,6 +180,53 @@ class HierarchyTest extends SapphireTest { $this->assertEquals('Obj 2 » Obj 2a » Obj 2aa', $obj2aa->getBreadcrumbs()); } + /** + * @covers Hierarchy::markChildren() + */ + public function testMarkChildrenDoesntUnmarkPreviouslyMarked() { + $obj3 = $this->objFromFixture('HierarchyTest_Object', 'obj3'); + $obj3aa = $this->objFromFixture('HierarchyTest_Object', 'obj3aa'); + $obj3ba = $this->objFromFixture('HierarchyTest_Object', 'obj3ba'); + $obj3ca = $this->objFromFixture('HierarchyTest_Object', 'obj3ca'); + + $obj3->markPartialTree(); + $obj3->markToExpose($obj3aa); + $obj3->markToExpose($obj3ba); + $obj3->markToExpose($obj3ca); + + $expected = << +
  • Obj 3a + +
  • +
  • Obj 3b + +
  • +
  • Obj 3c + +
  • +
  • Obj 3d +
  • + + +EOT; + + $this->assertSame($expected, $obj3->getChildrenAsUL()); + } + public function testGetChildrenAsUL() { $obj1 = $this->objFromFixture('HierarchyTest_Object', 'obj1'); $obj2 = $this->objFromFixture('HierarchyTest_Object', 'obj2'); @@ -539,6 +586,8 @@ class HierarchyTest_Object extends DataObject implements TestOnly { "Versioned('Stage', 'Live')", ); + private static $default_sort = 'Title ASC'; + public function cmstreeclasses() { return $this->markingClasses(); } diff --git a/tests/model/HierarchyTest.yml b/tests/model/HierarchyTest.yml index 23993c3d0..776a3d159 100644 --- a/tests/model/HierarchyTest.yml +++ b/tests/model/HierarchyTest.yml @@ -1,34 +1,46 @@ HierarchyTest_Object: - obj1: - Title: Obj 1 - obj2: - Title: Obj 2 - obj3: - Title: Obj 3 - obj2a: - Parent: =>HierarchyTest_Object.obj2 - Title: Obj 2a - obj2b: - Parent: =>HierarchyTest_Object.obj2 - Title: Obj 2b - obj3a: - Parent: =>HierarchyTest_Object.obj3 - Title: Obj 3a - obj3b: - Parent: =>HierarchyTest_Object.obj3 - Title: Obj 3b - obj3c: - Parent: =>HierarchyTest_Object.obj3 - Title: Obj 3c - obj2aa: - Parent: =>HierarchyTest_Object.obj2a - Title: Obj 2aa - obj2ab: - Parent: =>HierarchyTest_Object.obj2a - Title: Obj 2ab - obj3aa: - Parent: =>HierarchyTest_Object.obj3a - Title: Obj 3aa - obj3ab: - Parent: =>HierarchyTest_Object.obj3a - Title: Obj 3ab + obj1: + Title: Obj 1 + obj2: + Title: Obj 2 + obj3: + Title: Obj 3 + obj2a: + Parent: =>HierarchyTest_Object.obj2 + Title: Obj 2a + obj2b: + Parent: =>HierarchyTest_Object.obj2 + Title: Obj 2b + obj3a: + Parent: =>HierarchyTest_Object.obj3 + Title: Obj 3a + obj3b: + Parent: =>HierarchyTest_Object.obj3 + Title: Obj 3b + obj3c: + Parent: =>HierarchyTest_Object.obj3 + Title: Obj 3c + obj3d: + Parent: =>HierarchyTest_Object.obj3 + Title: Obj 3d + obj2aa: + Parent: =>HierarchyTest_Object.obj2a + Title: Obj 2aa + obj2ab: + Parent: =>HierarchyTest_Object.obj2a + Title: Obj 2ab + obj3aa: + Parent: =>HierarchyTest_Object.obj3a + Title: Obj 3aa + obj3ab: + Parent: =>HierarchyTest_Object.obj3a + Title: Obj 3ab + obj3ba: + Parent: =>HierarchyTest_Object.obj3b + Title: Obj 3ba + obj3bb: + Parent: =>HierarchyTest_Object.obj3b + Title: Obj 3bb + obj3ca: + Parent: =>HierarchyTest_Object.obj3c + Title: Obj 3c \ No newline at end of file