mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
parent
d8ea6ceccc
commit
5138bf1b7f
@ -94,6 +94,15 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
|
||||
*/
|
||||
private static $api_access = false;
|
||||
|
||||
/**
|
||||
* Allows specification of a default value for the ClassName field.
|
||||
* Configure this value only in subclasses of DataObject.
|
||||
*
|
||||
* @config
|
||||
* @var string
|
||||
*/
|
||||
private static $default_classname = null;
|
||||
|
||||
/**
|
||||
* True if this DataObject has been destroyed.
|
||||
* @var boolean
|
||||
|
@ -632,7 +632,6 @@ abstract class DBSchemaManager {
|
||||
} else if ($fieldValue != $specValue) {
|
||||
// If enums/sets are being modified, then we need to fix existing data in the table.
|
||||
// Update any records where the enum is set to a legacy value to be set to the default.
|
||||
// One hard-coded exception is SiteTree - the default for this is Page.
|
||||
foreach (array('enum', 'set') as $enumtype) {
|
||||
if (preg_match("/^$enumtype/i", $specValue)) {
|
||||
$newStr = preg_replace("/(^$enumtype\s*\(')|('$\).*)/i", "", $spec_orig);
|
||||
@ -650,7 +649,6 @@ abstract class DBSchemaManager {
|
||||
if (count($holder)) {
|
||||
$default = explode('default ', $spec_orig);
|
||||
$default = $default[1];
|
||||
if ($default == "'SiteTree'") $default = "'Page'";
|
||||
$query = "UPDATE \"$table\" SET $field=$default WHERE $field IN (";
|
||||
for ($i = 0; $i + 1 < count($holder); $i++) {
|
||||
$query .= "'{$holder[$i]}', ";
|
||||
|
@ -195,6 +195,13 @@ class DBClassName extends Enum {
|
||||
return $default;
|
||||
}
|
||||
|
||||
// Allow classes to set default class
|
||||
$baseClass = $this->getBaseClass();
|
||||
$defaultClass = Config::inst()->get($baseClass, 'default_classname');
|
||||
if($defaultClass && class_exists($defaultClass)) {
|
||||
return $defaultClass;
|
||||
}
|
||||
|
||||
// Fallback to first option
|
||||
$enum = $this->getEnum();
|
||||
return reset($enum);
|
||||
|
@ -63,29 +63,41 @@ class DBClassNameTest extends SapphireTest {
|
||||
// Explicit DataObject
|
||||
$field1 = new DBClassName('MyClass', 'DataObject');
|
||||
$this->assertEquals('DataObject', $field1->getBaseClass());
|
||||
$this->assertNotEquals('DataObject', $field1->getDefault());
|
||||
|
||||
// Explicit base class
|
||||
$field2 = new DBClassName('MyClass', 'DBClassNameTest_Object');
|
||||
$this->assertEquals('DBClassNameTest_Object', $field2->getBaseClass());
|
||||
$this->assertEquals('DBClassNameTest_Object', $field2->getDefault());
|
||||
|
||||
// Explicit subclass
|
||||
$field3 = new DBClassName('MyClass');
|
||||
$field3->setValue(null, new DBClassNameTest_ObjectSubClass());
|
||||
$this->assertEquals('DBClassNameTest_Object', $field3->getBaseClass());
|
||||
$this->assertEquals('DBClassNameTest_Object', $field3->getDefault());
|
||||
|
||||
// Implicit table
|
||||
$field4 = new DBClassName('MyClass');
|
||||
$field4->setTable('DBClassNameTest_ObjectSubClass_versions');
|
||||
$this->assertEquals('DBClassNameTest_Object', $field4->getBaseClass());
|
||||
$this->assertEquals('DBClassNameTest_Object', $field4->getDefault());
|
||||
|
||||
// Missing
|
||||
$field5 = new DBClassName('MyClass');
|
||||
$this->assertEquals('DataObject', $field5->getBaseClass());
|
||||
$this->assertNotEquals('DataObject', $field5->getDefault());
|
||||
|
||||
// Invalid class
|
||||
$field6 = new DBClassName('MyClass');
|
||||
$field6->setTable('InvalidTable');
|
||||
$this->assertEquals('DataObject', $field6->getBaseClass());
|
||||
$this->assertNotEquals('DataObject', $field6->getDefault());
|
||||
|
||||
// Custom default_classname
|
||||
$field7 = new DBClassName('MyClass');
|
||||
$field7->setTable('DBClassNameTest_CustomDefault');
|
||||
$this->assertEquals('DBClassNameTest_CustomDefault', $field7->getBaseClass());
|
||||
$this->assertEquals('DBClassNameTest_CustomDefaultSubclass', $field7->getDefault());
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,3 +131,18 @@ class DBClassNameTest_OtherClass extends DataObject implements TestOnly {
|
||||
'Title' => 'Varchar'
|
||||
);
|
||||
}
|
||||
|
||||
class DBClassNameTest_CustomDefault extends DataObject implements TestOnly {
|
||||
|
||||
private static $default_classname = 'DBClassNameTest_CustomDefaultSubclass';
|
||||
|
||||
private static $db = array(
|
||||
'Title' => 'Varchar'
|
||||
);
|
||||
}
|
||||
|
||||
class DBClassNameTest_CustomDefaultSubclass extends DBClassNameTest_CustomDefault implements TestOnly {
|
||||
private static $db = array(
|
||||
'Content' => 'HTMLText'
|
||||
);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user