diff --git a/src/GridFieldOrderableRows.php b/src/GridFieldOrderableRows.php index 1003c96..56538f0 100755 --- a/src/GridFieldOrderableRows.php +++ b/src/GridFieldOrderableRows.php @@ -545,10 +545,8 @@ class GridFieldOrderableRows extends RequestHandler implements $sortTable = $this->getSortTable($list); $now = DBDatetime::now()->Rfc2822(); $additionalSQL = ''; - $baseTable = $sortTable; - if (class_exists($sortTable)) { - $baseTable = singleton($sortTable)->baseTable(); - } + $baseTable = DataObject::getSchema()->baseDataTable($list->dataClass()); + $isBaseTable = ($baseTable == $sortTable); if (!$list instanceof ManyManyList && $isBaseTable) { $additionalSQL = ", \"LastEdited\" = '$now'"; @@ -565,7 +563,7 @@ class GridFieldOrderableRows extends RequestHandler implements $this->getSortTableClauseForIds($list, $id) )); - if (!$isBaseTable) { + if (!$isBaseTable && !$list instanceof ManyManyList) { DB::query(sprintf( 'UPDATE "%s" SET "LastEdited" = \'%s\' WHERE %s', $baseTable, @@ -600,10 +598,8 @@ class GridFieldOrderableRows extends RequestHandler implements $clause = sprintf('"%s"."%s" = 0', $table, $this->getSortField()); $now = DBDatetime::now()->Rfc2822(); $additionalSQL = ''; - $baseTable = $table; - if (class_exists($table)) { - $baseTable = singleton($table)->baseTable(); - } + $baseTable = DataObject::getSchema()->baseDataTable($list->dataClass()); + $isBaseTable = ($baseTable == $table); if (!$list instanceof ManyManyList && $isBaseTable) { $additionalSQL = ", \"LastEdited\" = '$now'"; @@ -622,7 +618,7 @@ class GridFieldOrderableRows extends RequestHandler implements $this->getSortTableClauseForIds($list, $id) )); - if (!$isBaseTable) { + if (!$isBaseTable && !$list instanceof ManyManyList) { DB::query(sprintf( 'UPDATE "%s" SET "LastEdited" = \'%s\' WHERE %s', $baseTable, diff --git a/tests/GridFieldOrderableRowsTest.php b/tests/GridFieldOrderableRowsTest.php index cc846af..d49674d 100644 --- a/tests/GridFieldOrderableRowsTest.php +++ b/tests/GridFieldOrderableRowsTest.php @@ -7,9 +7,11 @@ use SilverStripe\Dev\SapphireTest; use SilverStripe\Forms\GridField\GridField; use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor; use Symbiote\GridFieldExtensions\GridFieldOrderableRows; +use Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild; use Symbiote\GridFieldExtensions\Tests\Stub\StubOrdered; use Symbiote\GridFieldExtensions\Tests\Stub\StubParent; use Symbiote\GridFieldExtensions\Tests\Stub\StubSubclass; +use Symbiote\GridFieldExtensions\Tests\Stub\StubUnorderable; /** * Tests for the {@link GridFieldOrderableRows} component. @@ -21,11 +23,13 @@ class GridFieldOrderableRowsTest extends SapphireTest protected static $fixture_file = 'GridFieldOrderableRowsTest.yml'; - protected static $extra_dataobjects = array( + protected static $extra_dataobjects = [ StubParent::class, StubOrdered::class, StubSubclass::class, - ); + StubUnorderable::class, + StubOrderableChild::class, + ]; public function testReorderItems() { @@ -46,7 +50,7 @@ class GridFieldOrderableRowsTest extends SapphireTest ); $originalOrder = $parent->MyManyMany()->sort('ManyManySort')->column('ID'); - $desiredOrder = array(); + $desiredOrder = []; // Make order non-contiguous, and 1-based foreach (array_reverse($originalOrder) as $index => $id) { @@ -62,8 +66,38 @@ class GridFieldOrderableRowsTest extends SapphireTest $this->assertEquals($desiredOrder, $newOrder); } + public function testSortableChildClass() + { + $orderable = new GridFieldOrderableRows('Sort'); + $reflection = new ReflectionMethod($orderable, 'executeReorder'); + $reflection->setAccessible(true); + + $parent = $this->objFromFixture(StubOrdered::class, 'nestedtest'); + + $config = new GridFieldConfig_RelationEditor(); + $config->addComponent($orderable); + + $grid = new GridField( + 'Children', + 'Children', + $parent->Children(), + $config + ); + + $originalOrder = $parent->Children()->column('ID'); + $desiredOrder = array_reverse($originalOrder); + + $this->assertNotEquals($originalOrder, $desiredOrder); + + $reflection->invoke($orderable, $grid, $desiredOrder); + + $newOrder = $parent->Children()->column('ID'); + + $this->assertEquals($desiredOrder, $newOrder); + } + /** - * @covers GridFieldOrderableRows::getSortTable + * @covers \Symbiote\GridFieldExtensions\GridFieldOrderableRows::getSortTable */ public function testGetSortTable() { diff --git a/tests/GridFieldOrderableRowsTest.yml b/tests/GridFieldOrderableRowsTest.yml index c40f34c..20d5c34 100644 --- a/tests/GridFieldOrderableRowsTest.yml +++ b/tests/GridFieldOrderableRowsTest.yml @@ -1,3 +1,12 @@ +Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild: + item1: + Sort: 1 + item2: + Sort: 2 + item3: + Sort: 3 + item4: + Sort: 4 Symbiote\GridFieldExtensions\Tests\Stub\StubOrdered: item1: Sort: 1 @@ -11,7 +20,8 @@ Symbiote\GridFieldExtensions\Tests\Stub\StubOrdered: Sort: 5 item6: Sort: 6 - + nestedtest: + Children: =>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item1,=>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item2,=>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item3,=>Symbiote\GridFieldExtensions\Tests\Stub\StubOrderableChild.item4 Symbiote\GridFieldExtensions\Tests\Stub\StubParent: parent: MyManyMany: diff --git a/tests/Stub/StubOrderableChild.php b/tests/Stub/StubOrderableChild.php new file mode 100644 index 0000000..890ac9a --- /dev/null +++ b/tests/Stub/StubOrderableChild.php @@ -0,0 +1,18 @@ + 'Int', + ]; + + private static $has_one = [ + 'Parent' => StubOrdered::class, + ]; + + private static $default_sort = '"Sort" ASC'; + + private static $table_name = 'StubOrderableChild'; +} diff --git a/tests/Stub/StubOrdered.php b/tests/Stub/StubOrdered.php index e333864..b764ba5 100644 --- a/tests/Stub/StubOrdered.php +++ b/tests/Stub/StubOrdered.php @@ -15,6 +15,10 @@ class StubOrdered extends DataObject implements TestOnly 'Parent' => StubParent::class ); + private static $has_many = array( + 'Children' => StubOrderableChild::class, + ); + private static $belongs_many_many =array( 'MyManyMany' => StubParent::class, ); diff --git a/tests/Stub/StubUnorderable.php b/tests/Stub/StubUnorderable.php new file mode 100644 index 0000000..a1969ab --- /dev/null +++ b/tests/Stub/StubUnorderable.php @@ -0,0 +1,15 @@ + 'Varchar', + ]; + + private static $table_name = 'StubUnorderable'; +}