Merge pull request #3623 from kinglozzer/pulls/dataobject-db-inheritance

FIX: DataObject::db() doesn't respect overloaded db types (fixes #3620)
This commit is contained in:
Sam Minnée 2014-11-12 13:41:03 +13:00
commit 71c354d768
2 changed files with 25 additions and 15 deletions

View File

@ -1664,19 +1664,10 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
* @return array The database fields * @return array The database fields
*/ */
public function db($fieldName = null) { public function db($fieldName = null) {
$classes = ClassInfo::ancestry($this); $classes = ClassInfo::ancestry($this, true);
$good = false;
$items = array(); $items = array();
foreach($classes as $class) { foreach(array_reverse($classes) as $class) {
// Wait until after we reach DataObject
if(!$good) {
if($class == 'DataObject') {
$good = true;
}
continue;
}
if(isset(self::$_cache_db[$class])) { if(isset(self::$_cache_db[$class])) {
$dbItems = self::$_cache_db[$class]; $dbItems = self::$_cache_db[$class];
} else { } else {

View File

@ -16,18 +16,31 @@ class DataObjectTest extends SapphireTest {
'DataObjectTest_FieldlessSubTable', 'DataObjectTest_FieldlessSubTable',
'DataObjectTest_ValidatedObject', 'DataObjectTest_ValidatedObject',
'DataObjectTest_Player', 'DataObjectTest_Player',
'DataObjectTest_TeamComment' 'DataObjectTest_TeamComment',
'DataObjectTest_ExtendedTeamComment'
); );
public function testBaseFieldsExcludedFromDb() { public function testDb() {
$obj = new DataObjectTest_ValidatedObject(); $obj = new DataObjectTest_TeamComment();
$dbFields = $obj->db(); $dbFields = $obj->db();
// Assert fields are included
$this->assertArrayHasKey('Name', $dbFields); $this->assertArrayHasKey('Name', $dbFields);
// Assert the base fields are excluded
$this->assertArrayNotHasKey('Created', $dbFields); $this->assertArrayNotHasKey('Created', $dbFields);
$this->assertArrayNotHasKey('LastEdited', $dbFields); $this->assertArrayNotHasKey('LastEdited', $dbFields);
$this->assertArrayNotHasKey('ClassName', $dbFields); $this->assertArrayNotHasKey('ClassName', $dbFields);
$this->assertArrayNotHasKey('ID', $dbFields); $this->assertArrayNotHasKey('ID', $dbFields);
// Assert that the correct field type is returned when passing a field
$this->assertEquals('Varchar', $obj->db('Name'));
$this->assertEquals('Text', $obj->db('Comment'));
$obj = new DataObjectTest_ExtendedTeamComment();
// Assert overloaded fields have correct data type
$this->assertEquals('HTMLText', $obj->db('Comment'));
} }
public function testValidObjectsForBaseFields() { public function testValidObjectsForBaseFields() {
@ -1443,5 +1456,11 @@ class DataObjectTest_TeamComment extends DataObject {
} }
class DataObjectTest_ExtendedTeamComment extends DataObjectTest_TeamComment {
private static $db = array(
'Comment' => 'HTMLText'
);
}
DataObjectTest_Team::add_extension('DataObjectTest_Team_Extension'); DataObjectTest_Team::add_extension('DataObjectTest_Team_Extension');