Skip to content

Commit 755cafa

Browse files
nicole-ashleyNathan Glasl
authored andcommitted
Enable namespace support for GridFieldAddNewMultiClass
1 parent 5c1f9cc commit 755cafa

2 files changed

Lines changed: 84 additions & 2 deletions

File tree

code/GridFieldAddNewMultiClass.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,12 @@ public function getClasses(GridField $grid) {
122122
}
123123
}
124124

125-
return $result;
125+
$sanitised = array();
126+
foreach($result as $class=>$title) {
127+
$sanitised[$this->sanitiseClassName($class)] = $title;
128+
}
129+
130+
return $sanitised;
126131
}
127132

128133
/**
@@ -168,8 +173,9 @@ public function handleAdd($grid, $request) {
168173
throw new SS_HTTPResponse_Exception(400);
169174
}
170175

176+
$unsanitisedClass = $this->unsanitiseClassName($class);
171177
$handler = Object::create($this->itemRequestClass,
172-
$grid, $component, new $class(), $grid->getForm()->getController(), 'add-multi-class'
178+
$grid, $component, new $unsanitisedClass(), $grid->getForm()->getController(), 'add-multi-class'
173179
);
174180
$handler->setTemplate($component->getTemplate());
175181

@@ -219,4 +225,20 @@ public function setItemRequestClass($class) {
219225
$this->itemRequestClass = $class;
220226
return $this;
221227
}
228+
229+
/**
230+
* Sanitise a model class' name for inclusion in a link
231+
* @return string
232+
*/
233+
protected function sanitiseClassName($class) {
234+
return str_replace('\\', '-', $class);
235+
}
236+
237+
/**
238+
* Unsanitise a model class' name from a URL param
239+
* @return string
240+
*/
241+
protected function unsanitiseClassName($class) {
242+
return str_replace('-', '\\', $class);
243+
}
222244
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace SilverStripeAustralia\Test;
4+
5+
use SapphireTest;
6+
use SS_HTTPRequest;
7+
use Form, Controller, FieldList;
8+
use GridField, GridFieldDetailForm, GridFieldAddNewMultiClass;
9+
10+
class GridFieldAddNewMultiClassWithNamespacesTest extends SapphireTest {
11+
12+
public function testGetClassesWithNamespaces() {
13+
$grid = new GridField('TestGridField');
14+
$grid->setModelClass('SilverStripeAustralia\\Test\\NamespacedClass');
15+
16+
$component = new GridFieldAddNewMultiClass();
17+
18+
$this->assertEquals(
19+
array(
20+
'SilverStripeAustralia-Test-NamespacedClass' => 'NamespacedClass'
21+
),
22+
$component->getClasses($grid),
23+
'Namespaced classes are sanitised'
24+
);
25+
}
26+
27+
public function testHandleAddWithNamespaces() {
28+
$grid = new GridField('TestGridField');
29+
$grid->getConfig()->addComponent(new GridFieldDetailForm());
30+
$grid->setModelClass('SilverStripeAustralia\\Test\\NamespacedClass');
31+
$grid->setForm(Form::create('test', Controller::create(), FieldList::create(), FieldList::create()));
32+
33+
$request = new SS_HTTPRequest('POST', 'test');
34+
$request->setRouteParams(array('ClassName' => 'SilverStripeAustralia-Test-NamespacedClass'));
35+
36+
$component = new GridFieldAddNewMultiClass();
37+
$response = $component->handleAdd($grid, $request);
38+
39+
$record = new \ReflectionProperty('GridFieldAddNewMultiClassHandler', 'record');
40+
$record->setAccessible(true);
41+
$this->assertInstanceOf('SilverStripeAustralia\\Test\\NamespacedClass', $record->getValue($response));
42+
}
43+
44+
}
45+
46+
/**#@+
47+
* @ignore
48+
*/
49+
50+
class NamespacedClass {
51+
public function i18n_singular_name() {
52+
return 'NamespacedClass';
53+
}
54+
55+
public function canCreate() {
56+
return true;
57+
}
58+
}
59+
60+
/**#@-*/

0 commit comments

Comments
 (0)