Skip to content

Commit

Permalink
Merge 4c4ce75 into c309897
Browse files Browse the repository at this point in the history
  • Loading branch information
fonsekaean committed May 30, 2018
2 parents c309897 + 4c4ce75 commit ea9cf40
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 3 deletions.
12 changes: 12 additions & 0 deletions README.md
Expand Up @@ -112,6 +112,18 @@ Alternatively, you could simply use the sort statement in your template, which w
<% end_loop %>
```

Many Many Through List
-------------

The module supports editing many many through lists as well. However to get it to completely work you'd need to add a new getter function on to the owner data object class.
```php
// Use this in your templates to get the correctly sorted images
public function getImages()
{
return $this->Images()->Sort('SortOrder');
}
```

What happened to `has_many` support?
-------------

Expand Down
33 changes: 31 additions & 2 deletions src/Forms/SortableUploadField.php
Expand Up @@ -6,9 +6,12 @@
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\File;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObjectInterface;
use SilverStripe\ORM\DB;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\ORM\ManyManyThroughList;
use SilverStripe\ORM\ManyManyThroughQueryManipulator;
use SilverStripe\ORM\Queries\SQLUpdate;
use SilverStripe\ORM\Sortable;
use SilverStripe\ORM\SS_List;
Expand Down Expand Up @@ -125,8 +128,7 @@ public function saveInto(DataObjectInterface $record)
$relation->getForeignID();
$ownerIdField = $relation->getForeignKey();
$fileIdField = $relation->getLocalKey();
$joinTable = '"'. $relation->getJoinTable() .'"';

$joinTable = '"' . $relation->getJoinTable() . '"';
$sort = 0;
foreach ($rawList as $id) {
if (in_array($id, $idList)) {
Expand All @@ -146,6 +148,33 @@ public function saveInto(DataObjectInterface $record)
} catch (\Exception $ex) {
$this->logger->warning('Unable to sort files in sortable relation.', ['exception' => $ex]);
}
} elseif ($relation instanceof ManyManyThroughList) {
$relation->getForeignID();
$dataQuery = $relation->dataQuery();
$manipulators = $dataQuery->getDataQueryManipulators();
$manyManyManipulator = null;
foreach ($manipulators as $manipulator) {
if ($manipulator instanceof ManyManyThroughQueryManipulator) {
$manyManyManipulator = $manipulator;
}
}
$joinClass = $manyManyManipulator->getJoinClass();
$ownerIDField = $manyManyManipulator->getForeignKey();
$fileIdField = $manyManyManipulator->getLocalKey();

$sort = 0;
foreach ($rawList as $id) {
if (in_array($id, $idList)) {
$fileRecord = DataList::create($joinClass)->filter([
$ownerIDField => $relation->getForeignID(),
$fileIdField => $id
])->first();
if ($fileRecord) {
$fileRecord->setField($sortColumn, $sort++);
$fileRecord->write();
}
}
}
} elseif ($relation instanceof UnsavedRelationList) {
// With an unsaved relation list the items can just be removed and re-added
$sort = 0;
Expand Down
28 changes: 28 additions & 0 deletions tests/php/Model/FileLinkDataObject.php
@@ -0,0 +1,28 @@
<?php

namespace Bummzack\SortableFile\Tests\Model;


use SilverStripe\Assets\File;
use SilverStripe\ORM\DataObject;
use SilverStripe\Versioned\Versioned;

class FileLinkDataObject extends DataObject
{

private static $db = [
'SortOrder' => 'Int'
];

private static $has_one = [
'File' => File::class,
'Owner' => TestDataObject::class
];

private static $default_sort = 'SortOrder';

private static $extensions = [
Versioned::class
];

}
21 changes: 20 additions & 1 deletion tests/php/Model/TestDataObject.php
Expand Up @@ -10,21 +10,40 @@

class TestDataObject extends DataObject implements TestOnly
{

private static $has_many = [
'LinkedFilesFile' => FileLinkDataObject::class
];

private static $many_many = [
'Files' => File::class,
'OtherFiles' => File::class
'OtherFiles' => File::class,
'LinkedFiles' => [
'through' => FileLinkDataObject::class,
'from' => 'Owner',
'to' => 'File',
]
];

private static $many_many_extraFields = [
'Files' => [ 'SortOrder' => 'Int' ],
'OtherFiles' => [ 'Sort' => 'Int' ]
];

private static $owns = [
'FileLinks'
];

public function getCMSFields()
{
return FieldList::create(
SortableUploadField::create('Files'),
SortableUploadField::create('OtherFiles')->setSortColumn('Sort')
);
}

public function getLinkedFiles()
{
return $this->LinkedFiles()->sort('Sort');
}
}
41 changes: 41 additions & 0 deletions tests/php/SortableUploadFieldTest.php
Expand Up @@ -3,6 +3,7 @@
namespace Bummzack\SortableFile\Tests;

use Bummzack\SortableFile\Forms\SortableUploadField;
use Bummzack\SortableFile\Tests\Model\FileLinkDataObject;
use Bummzack\SortableFile\Tests\Model\TestDataObject;
use SilverStripe\Assets\Dev\TestAssetStore;
use SilverStripe\Assets\File;
Expand Down Expand Up @@ -156,4 +157,44 @@ public function testAddingFilesWithoutFormSubmission()
$this->assertEquals(['FileA', 'FileB', 'FileC'], $obj->Files()->sort('SortOrder')->column('Title'));
$this->assertEquals(['FileA', 'FileB', 'FileC'], $field->getItems()->column('Title'));
}

public function testExistingSortOrderForManyManyThroughList()
{
$obj = $this->objFromFixture(TestDataObject::class, 'obj2');

$field = SortableUploadField::create('LinkedFiles', 'LinkedFiles', $obj->LinkedFiles())->setRecord($obj);
$this->assertEquals(['FileA', 'FileB', 'FileC', 'FileD'], $field->getItems()->column('Title'));

// set field items in other order
$field->setValue($obj->LinkedFiles()->sort('FileHash'));
// Items should be returned in the correct order though.
$this->assertEquals(['FileA', 'FileB', 'FileC', 'FileD'], $field->getItems()->column('Title'));
}

public function testAddingFilesToNewRecordManyManyThroughList()
{
$obj = TestDataObject::create();

// The file IDs to add, Should result in D,B,A,C
$data = ['Files' => ['4','2','1','3']];

$field = SortableUploadField::create('LinkedFiles', 'LinkedFiles', $obj->getLinkedFiles())->setRecord($obj);
$field->setSubmittedValue($data);
$field->saveInto($obj);
$obj->write();

$this->assertEquals(['FileD', 'FileB', 'FileA', 'FileC'], $obj->LinkedFiles()->sort('SortOrder')->column('Title'));
$this->assertEquals(['FileD', 'FileB', 'FileA', 'FileC'], $field->getItems()->column('Title'));

$linkObjs = FileLinkDataObject::get()->filter('OwnerID', $obj->ID);
$this->assertEquals(4, $linkObjs->count());

$titles = [];
foreach ($linkObjs as $linkObj)
$titles[] = $linkObj->File()->Title;

$this->assertEquals(['FileD', 'FileB', 'FileA', 'FileC'], $titles);

}

}
24 changes: 24 additions & 0 deletions tests/php/SortableUploadFieldTest.yml
Expand Up @@ -24,6 +24,8 @@ SilverStripe\Assets\File:
Name: FileD.txt
Title: FileD



Bummzack\SortableFile\Tests\Model\TestDataObject:
obj1:
Files:
Expand All @@ -42,3 +44,25 @@ Bummzack\SortableFile\Tests\Model\TestDataObject:
Sort: 1
- =>SilverStripe\Assets\File.fileC:
Sort: 0
obj2:
Files:
- =>SilverStripe\Assets\File.fileA:
SortOrder: 0

Bummzack\SortableFile\Tests\Model\FileLinkDataObject:
link1:
SortOrder: 0
File: =>SilverStripe\Assets\File.fileA
Owner: =>Bummzack\SortableFile\Tests\Model\TestDataObject.obj2
link2:
SortOrder: 1
File: =>SilverStripe\Assets\File.fileB
Owner: =>Bummzack\SortableFile\Tests\Model\TestDataObject.obj2
link3:
SortOrder: 1
File: =>SilverStripe\Assets\File.fileC
Owner: =>Bummzack\SortableFile\Tests\Model\TestDataObject.obj2
link4:
SortOrder: 1
File: =>SilverStripe\Assets\File.fileD
Owner: =>Bummzack\SortableFile\Tests\Model\TestDataObject.obj2

0 comments on commit ea9cf40

Please sign in to comment.