mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FIX: remove_extension should work on parameterized extensions
This commit is contained in:
parent
b25eda83c4
commit
1427a0637b
@ -492,6 +492,7 @@ abstract class Object {
|
||||
|
||||
/**
|
||||
* Remove an extension from a class.
|
||||
*
|
||||
* Keep in mind that this won't revert any datamodel additions
|
||||
* of the extension at runtime, unless its used before the
|
||||
* schema building kicks in (in your _config.php).
|
||||
@ -509,6 +510,20 @@ abstract class Object {
|
||||
$class = get_called_class();
|
||||
|
||||
Config::inst()->remove($class, 'extensions', Config::anything(), $extension);
|
||||
|
||||
// remove any instances of the extension with parameters
|
||||
$config = Config::inst()->get($class, 'extensions');
|
||||
|
||||
if($config) {
|
||||
foreach($config as $k => $v) {
|
||||
// extensions with parameters will be stored in config as
|
||||
// ExtensionName("Param").
|
||||
if(preg_match(sprintf("/^(%s)\(/", preg_quote($extension, '/')), $v)) {
|
||||
Config::inst()->remove($class, 'extensions', Config::anything(), $v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Config::inst()->extraConfigSourcesChanged($class);
|
||||
|
||||
// unset singletons to avoid side-effects
|
||||
|
@ -265,10 +265,12 @@ class ObjectTest extends SapphireTest {
|
||||
|
||||
// ObjectTest_ExtendTest1 is already present in $extensions
|
||||
ObjectTest_ExtensionRemoveTest::remove_extension('ObjectTest_ExtendTest1');
|
||||
|
||||
$this->assertFalse(
|
||||
ObjectTest_ExtensionRemoveTest::has_extension('ObjectTest_ExtendTest1'),
|
||||
"Extension added through \$extensions are detected as removed in has_extension()"
|
||||
);
|
||||
|
||||
$objectTest_ExtensionRemoveTest = new ObjectTest_ExtensionRemoveTest();
|
||||
$this->assertFalse(
|
||||
$objectTest_ExtensionRemoveTest->hasExtension('ObjectTest_ExtendTest1'),
|
||||
@ -276,6 +278,27 @@ class ObjectTest extends SapphireTest {
|
||||
);
|
||||
}
|
||||
|
||||
public function testRemoveExtensionWithParameters() {
|
||||
ObjectTest_ExtensionRemoveTest::add_extension('ObjectTest_ExtendTest2("MyParam")');
|
||||
|
||||
$this->assertTrue(
|
||||
ObjectTest_ExtensionRemoveTest::has_extension('ObjectTest_ExtendTest2'),
|
||||
"Extension added through \$add_extension() are added correctly"
|
||||
);
|
||||
|
||||
ObjectTest_ExtensionRemoveTest::remove_extension('ObjectTest_ExtendTest2');
|
||||
$this->assertFalse(
|
||||
Object::has_extension('ObjectTest_ExtensionRemoveTest', 'ObjectTest_ExtendTest2'),
|
||||
"Extension added through \$add_extension() are detected as removed in has_extension()"
|
||||
);
|
||||
|
||||
$objectTest_ExtensionRemoveTest = new ObjectTest_ExtensionRemoveTest();
|
||||
$this->assertFalse(
|
||||
$objectTest_ExtensionRemoveTest->hasExtension('ObjectTest_ExtendTest2'),
|
||||
"Extensions added through \$extensions are detected as removed in instances through hasExtension()"
|
||||
);
|
||||
}
|
||||
|
||||
public function testParentClass() {
|
||||
$this->assertEquals(ObjectTest_MyObject::create()->parentClass(), 'Object');
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user