MINOR: Refactored ClassInfo::dataClassesFor() to use existing methods rather than creating the class array itself.

This commit is contained in:
ajshort 2011-02-19 15:35:59 +11:00
parent eba1a85ead
commit f55cc7ec67
2 changed files with 45 additions and 22 deletions

View File

@ -59,34 +59,29 @@ class ClassInfo {
} }
/** /**
* Return the database tables linked to this class. * Returns an array of the current class and all its ancestors and children
* Gets an array of the current class, it subclasses and its ancestors. It then filters that list * which have a DB table.
* to those with DB tables
* *
* @param mixed $class string of the classname or instance of the class * @param string|object $class
* @todo Move this into data object * @todo Move this into data object
* @return array * @return array
*/ */
static function dataClassesFor($class) { public static function dataClassesFor($class) {
global $_ALL_CLASSES; $result = array();
if (is_object($class)) $class = get_class($class);
$dataClasses = array(); if (is_object($class)) {
$class = get_class($class);
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; $classes = array_merge(
self::ancestry($class),
self::subclassesFor($class));
if(isset($_ALL_CLASSES['children'][$class])) foreach ($classes as $class) {
foreach($_ALL_CLASSES['children'][$class] as $subclass) if (self::hasTable($class)) $result[$class] = $class;
{
if(self::hasTable($subclass)) $dataClasses[] = $subclass;
} }
return $dataClasses; return $result;
} }
/** /**

View File

@ -66,6 +66,26 @@ class ClassInfoTest extends SapphireTest {
ClassInfo::ancestry(42); 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 { class ClassInfoTest_BaseClass extends DataObject {
@ -79,3 +99,11 @@ class ClassInfoTest_ChildClass extends ClassInfoTest_BaseClass {
class ClassInfoTest_GrandChildClass extends ClassInfoTest_ChildClass { 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');
}