diff --git a/code/GridFieldAddNewMultiClass.php b/code/GridFieldAddNewMultiClass.php index 9df4ded..108e434 100755 --- a/code/GridFieldAddNewMultiClass.php +++ b/code/GridFieldAddNewMultiClass.php @@ -122,7 +122,12 @@ class GridFieldAddNewMultiClass implements GridField_HTMLProvider, GridField_URL } } - return $result; + $sanitised = array(); + foreach($result as $class=>$title) { + $sanitised[$this->sanitiseClassName($class)] = $title; + } + + return $sanitised; } /** @@ -168,8 +173,9 @@ class GridFieldAddNewMultiClass implements GridField_HTMLProvider, GridField_URL throw new SS_HTTPResponse_Exception(400); } + $unsanitisedClass = $this->unsanitiseClassName($class); $handler = Object::create($this->itemRequestClass, - $grid, $component, new $class(), $grid->getForm()->getController(), 'add-multi-class' + $grid, $component, new $unsanitisedClass(), $grid->getForm()->getController(), 'add-multi-class' ); $handler->setTemplate($component->getTemplate()); @@ -219,4 +225,20 @@ class GridFieldAddNewMultiClass implements GridField_HTMLProvider, GridField_URL $this->itemRequestClass = $class; return $this; } + + /** + * Sanitise a model class' name for inclusion in a link + * @return string + */ + protected function sanitiseClassName($class) { + return str_replace('\\', '-', $class); + } + + /** + * Unsanitise a model class' name from a URL param + * @return string + */ + protected function unsanitiseClassName($class) { + return str_replace('-', '\\', $class); + } } diff --git a/tests/GridFieldAddNewMultiClassWithNamespacesTest.php b/tests/GridFieldAddNewMultiClassWithNamespacesTest.php new file mode 100644 index 0000000..2d3420e --- /dev/null +++ b/tests/GridFieldAddNewMultiClassWithNamespacesTest.php @@ -0,0 +1,60 @@ +setModelClass('SilverStripeAustralia\\Test\\NamespacedClass'); + + $component = new GridFieldAddNewMultiClass(); + + $this->assertEquals( + array( + 'SilverStripeAustralia-Test-NamespacedClass' => 'NamespacedClass' + ), + $component->getClasses($grid), + 'Namespaced classes are sanitised' + ); + } + + public function testHandleAddWithNamespaces() { + $grid = new GridField('TestGridField'); + $grid->getConfig()->addComponent(new GridFieldDetailForm()); + $grid->setModelClass('SilverStripeAustralia\\Test\\NamespacedClass'); + $grid->setForm(Form::create('test', Controller::create(), FieldList::create(), FieldList::create())); + + $request = new SS_HTTPRequest('POST', 'test'); + $request->setRouteParams(array('ClassName' => 'SilverStripeAustralia-Test-NamespacedClass')); + + $component = new GridFieldAddNewMultiClass(); + $response = $component->handleAdd($grid, $request); + + $record = new \ReflectionProperty('GridFieldAddNewMultiClassHandler', 'record'); + $record->setAccessible(true); + $this->assertInstanceOf('SilverStripeAustralia\\Test\\NamespacedClass', $record->getValue($response)); + } + +} + +/**#@+ + * @ignore + */ + +class NamespacedClass { + public function i18n_singular_name() { + return 'NamespacedClass'; + } + + public function canCreate() { + return true; + } +} + +/**#@-*/