diff --git a/core/ClassInfo.php b/core/ClassInfo.php index 3c0a3daa2..b371f9682 100644 --- a/core/ClassInfo.php +++ b/core/ClassInfo.php @@ -59,34 +59,29 @@ class ClassInfo { } /** - * Return the database tables linked to this class. - * Gets an array of the current class, it subclasses and its ancestors. It then filters that list - * to those with DB tables + * Returns an array of the current class and all its ancestors and children + * which have a DB table. * - * @param mixed $class string of the classname or instance of the class + * @param string|object $class * @todo Move this into data object * @return array */ - static function dataClassesFor($class) { - global $_ALL_CLASSES; - if (is_object($class)) $class = get_class($class); - - $dataClasses = array(); - - if(!$_ALL_CLASSES['parents'][$class]) user_error("ClassInfo::dataClassesFor() no parents for $class", E_USER_WARNING); - foreach($_ALL_CLASSES['parents'][$class] as $subclass) { - if(self::hasTable($subclass)) $dataClasses[] = $subclass; - } - - if(self::hasTable($class)) $dataClasses[] = $class; + public static function dataClassesFor($class) { + $result = array(); - if(isset($_ALL_CLASSES['children'][$class])) - foreach($_ALL_CLASSES['children'][$class] as $subclass) - { - if(self::hasTable($subclass)) $dataClasses[] = $subclass; + if (is_object($class)) { + $class = get_class($class); } - - return $dataClasses; + + $classes = array_merge( + self::ancestry($class), + self::subclassesFor($class)); + + foreach ($classes as $class) { + if (self::hasTable($class)) $result[$class] = $class; + } + + return $result; } /** diff --git a/tests/ClassInfoTest.php b/tests/ClassInfoTest.php index 194bc5757..f11d454fb 100644 --- a/tests/ClassInfoTest.php +++ b/tests/ClassInfoTest.php @@ -66,6 +66,26 @@ class ClassInfoTest extends SapphireTest { ClassInfo::ancestry(42); } + /** + * @covers ClassInfo::dataClassesFor() + */ + public function testDataClassesFor() { + $expect = array( + 'ClassInfoTest_BaseDataClass' => 'ClassInfoTest_BaseDataClass', + 'ClassInfoTest_HasFields' => 'ClassInfoTest_HasFields' + ); + + $classes = array( + 'ClassInfoTest_BaseDataClass', + 'ClassInfoTest_NoFields', + 'ClassInfoTest_HasFields' + ); + + foreach ($classes as $class) { + $this->assertEquals($expect, ClassInfo::dataClassesFor($class)); + } + } + } class ClassInfoTest_BaseClass extends DataObject { @@ -79,3 +99,11 @@ class ClassInfoTest_ChildClass extends ClassInfoTest_BaseClass { class ClassInfoTest_GrandChildClass extends ClassInfoTest_ChildClass { } + +class ClassInfoTest_BaseDataClass extends DataObject { + public static $db = array('Title' => 'Varchar'); +} +class ClassInfoTest_NoFields extends ClassInfoTest_BaseDataClass {} +class ClassInfoTest_HasFields extends ClassInfoTest_NoFields { + public static $db = array('Description' => 'Varchar'); +}