Skip to content

Commit ce9c294

Browse files
committed
FIX ModelAdmin::$model_importers alias support
Hasn't been considered when introducing aliases rather than class names in $managed_models.
1 parent 15258b2 commit ce9c294

File tree

4 files changed

+100
-36
lines changed

4 files changed

+100
-36
lines changed

code/ModelAdmin.php

+31-28
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,34 @@
22

33
namespace SilverStripe\Admin;
44

5-
use SilverStripe\Control\Controller;
6-
use SilverStripe\Control\HTTPRequest;
7-
use SilverStripe\Control\HTTPResponse;
5+
use SilverStripe\Forms\Form;
86
use SilverStripe\Core\Convert;
7+
use SilverStripe\ORM\ArrayList;
98
use SilverStripe\Dev\BulkLoader;
9+
use SilverStripe\ORM\DataObject;
10+
use SilverStripe\View\ArrayData;
1011
use SilverStripe\Dev\Deprecation;
11-
use SilverStripe\Forms\CheckboxField;
1212
use SilverStripe\Forms\FieldList;
1313
use SilverStripe\Forms\FileField;
14-
use SilverStripe\Forms\Form;
1514
use SilverStripe\Forms\FormAction;
15+
use SilverStripe\Dev\CsvBulkLoader;
16+
use SilverStripe\Forms\HiddenField;
17+
use SilverStripe\Security\Security;
18+
use SilverStripe\Control\Controller;
19+
use SilverStripe\Forms\LiteralField;
20+
use SilverStripe\Control\HTTPRequest;
21+
use SilverStripe\Forms\CheckboxField;
22+
use SilverStripe\Control\HTTPResponse;
23+
use SilverStripe\ORM\ValidationResult;
1624
use SilverStripe\Forms\GridField\GridField;
1725
use SilverStripe\Forms\GridField\GridFieldConfig;
18-
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
26+
use SilverStripe\Forms\GridField\GridFieldPaginator;
1927
use SilverStripe\Forms\GridField\GridFieldDetailForm;
28+
use SilverStripe\Forms\GridField\GridFieldPrintButton;
2029
use SilverStripe\Forms\GridField\GridFieldExportButton;
2130
use SilverStripe\Forms\GridField\GridFieldFilterHeader;
2231
use SilverStripe\Forms\GridField\GridFieldImportButton;
23-
use SilverStripe\Forms\GridField\GridFieldPaginator;
24-
use SilverStripe\Forms\GridField\GridFieldPrintButton;
25-
use SilverStripe\Forms\HiddenField;
26-
use SilverStripe\Forms\LiteralField;
27-
use SilverStripe\ORM\ArrayList;
28-
use SilverStripe\ORM\DataObject;
29-
use SilverStripe\ORM\ValidationResult;
30-
use SilverStripe\Security\Security;
31-
use SilverStripe\View\ArrayData;
32+
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
3233

3334
/**
3435
* Generates a three-pane UI for editing model classes, tabular results and edit forms.
@@ -485,23 +486,25 @@ public function getManagedModels()
485486
* with a default {@link CsvBulkLoader} class. In this case the column names of the first row
486487
* in the CSV file are assumed to have direct mappings to properties on the object.
487488
*
488-
* @return array Map of model class names to importer instances
489+
* @return array Map of model keys to importer instances (same keys as $managed_models)
489490
*/
490491
public function getModelImporters()
491492
{
492-
$importerClasses = $this->config()->get('model_importers');
493+
$importers = [];
494+
$importerSpec = $this->config()->get('model_importers');
495+
$models = $this->getManagedModels();
493496

494-
// fallback to all defined models if not explicitly defined
495-
if (is_null($importerClasses)) {
496-
$models = $this->getManagedModels();
497-
foreach ($models as $modelName => $options) {
498-
$importerClasses[$modelName] = 'SilverStripe\\Dev\\CsvBulkLoader';
497+
foreach ($models as $modelName => $options) {
498+
$modelClass = $options['dataClass'];
499+
if (isset($importerSpec[$modelName])) {
500+
$importerClass = $importerSpec[$modelName];
501+
} elseif (isset($importerSpec[$modelClass])) {
502+
$importerClass = $importerSpec[$modelClass];
503+
} else {
504+
$importerClass = CsvBulkLoader::class;
499505
}
500-
}
501-
502-
$importers = array();
503-
foreach ($importerClasses as $modelClass => $importerClass) {
504-
$importers[$modelClass] = new $importerClass($modelClass);
506+
// Needs to be indexed by name to avoid collisions
507+
$importers[$modelName] = new $importerClass($modelClass);
505508
}
506509

507510
return $importers;
@@ -608,7 +611,7 @@ public function import($data, $form, $request)
608611

609612
$importers = $this->getModelImporters();
610613
/** @var BulkLoader $loader */
611-
$loader = $importers[$this->modelClass];
614+
$loader = $importers[$this->modelTab];
612615

613616
// File wasn't properly uploaded, show a reminder to the user
614617
if (empty($_FILES['_CsvFile']['tmp_name']) ||

tests/php/ModelAdminTest.php

+48-7
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
namespace SilverStripe\Admin\Tests;
44

5-
use SilverStripe\Admin\Tests\ModelAdminTest\Contact;
6-
use SilverStripe\Admin\Tests\ModelAdminTest\Player;
7-
use SilverStripe\Control\HTTPRequest;
5+
use SilverStripe\View\ArrayData;
86
use SilverStripe\Control\Session;
7+
use SilverStripe\Dev\CsvBulkLoader;
8+
use SilverStripe\Dev\FunctionalTest;
9+
use SilverStripe\Control\HTTPRequest;
10+
use SilverStripe\Security\Permission;
911
use SilverStripe\Forms\GridField\GridField;
12+
use SilverStripe\Admin\Tests\ModelAdminTest\Player;
13+
use SilverStripe\Admin\Tests\ModelAdminTest\Contact;
14+
use SilverStripe\Forms\GridField\GridFieldPrintButton;
1015
use SilverStripe\Forms\GridField\GridFieldExportButton;
1116
use SilverStripe\Forms\GridField\GridFieldImportButton;
12-
use SilverStripe\Forms\GridField\GridFieldPrintButton;
13-
use SilverStripe\Security\Permission;
14-
use SilverStripe\Dev\FunctionalTest;
15-
use SilverStripe\View\ArrayData;
17+
use SilverStripe\Admin\Tests\ModelAdminTest\ModelAdminTestBulkLoader;
1618

1719
class ModelAdminTest extends FunctionalTest
1820
{
@@ -164,6 +166,45 @@ public function testGetManagedModels()
164166
);
165167
}
166168

169+
public function testGetModelImporters()
170+
{
171+
$admin = new ModelAdminTest\MultiModelAdmin();
172+
$importers = $admin->getModelImporters();
173+
174+
$this->assertArrayHasKey(
175+
Contact::class,
176+
$importers,
177+
'Implicit models'
178+
);
179+
$this->assertInstanceOf(
180+
CsvBulkLoader::class,
181+
$importers[Contact::class],
182+
'Implicit models create default bulk loaders'
183+
);
184+
185+
$this->assertArrayHasKey(
186+
'Player',
187+
$importers,
188+
'Explicit models by alias'
189+
);
190+
$this->assertInstanceOf(
191+
ModelAdminTestBulkLoader::class,
192+
$importers['Player'],
193+
'Explicit models by alias allow custom bulk loaders'
194+
);
195+
196+
$this->assertArrayHasKey(
197+
Player::class,
198+
$importers,
199+
'Explicit models by class'
200+
);
201+
$this->assertInstanceOf(
202+
ModelAdminTestBulkLoader::class,
203+
$importers[Player::class],
204+
'Explicit models by alias allow custom bulk loaders'
205+
);
206+
}
207+
167208
public function testGetManagedModelTabs()
168209
{
169210
$mock = $this->getMockBuilder(ModelAdminTest\MultiModelAdmin::class)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace SilverStripe\Admin\Tests\ModelAdminTest;
4+
5+
use SilverStripe\Dev\CsvBulkLoader;
6+
7+
class ModelAdminTestBulkLoader extends CsvBulkLoader
8+
{
9+
10+
}

tests/php/ModelAdminTest/MultiModelAdmin.php

+11-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
namespace SilverStripe\Admin\Tests\ModelAdminTest;
44

5+
use SilverStripe\Dev\TestOnly;
56
use SilverStripe\Admin\ModelAdmin;
67
use SilverStripe\Control\Controller;
7-
use SilverStripe\Dev\TestOnly;
8+
use SilverStripe\Admin\Tests\ModelAdminTest\ModelAdminTestBulkLoader;
89

910
class MultiModelAdmin extends ModelAdmin implements TestOnly
1011
{
@@ -21,6 +22,15 @@ class MultiModelAdmin extends ModelAdmin implements TestOnly
2122
]
2223
];
2324

25+
private static $model_importers = [
26+
// Implicit for class
27+
// Contact::class,
28+
// Explicit for alias
29+
'Player' => ModelAdminTestBulkLoader::class,
30+
// Explicit for class
31+
Player::class => ModelAdminTestBulkLoader::class
32+
];
33+
2434
public function Link($action = null)
2535
{
2636
if (!$action) {

0 commit comments

Comments
 (0)