/** * Returns the passed class name along with all its parent class names in an * array, sorted with the root class first. * * @param string $class * @param bool $tablesOnly Only return classes that have a table in the db. * @return array */ public static function ancestry($class, $tablesOnly = false) { if (is_string($class) && !class_exists($class)) { return array(); } $class = self::class_name($class); $lClass = strtolower($class); $cacheKey = $lClass . '_' . (string) $tablesOnly; $parent = $class; if (!isset(self::$_cache_ancestry[$cacheKey])) { $ancestry = array(); do { if (!$tablesOnly || DataObject::has_own_table($parent)) { $ancestry[$parent] = $parent; } } while ($parent = get_parent_class($parent)); self::$_cache_ancestry[$cacheKey] = array_reverse($ancestry); } return self::$_cache_ancestry[$cacheKey]; }
/** * Determine if a class is supporting the Versioned extensions (e.g. * $table_versions does exists). * * @param string $class Class name * @return boolean */ public function canBeVersioned($class) { return ClassInfo::exists($class) && is_subclass_of($class, 'SilverStripe\\ORM\\DataObject') && DataObject::has_own_table($class); }
/** * Remove invalid records from tables - that is, records that don't have * corresponding records in their parent class tables. */ public function cleanup() { $allClasses = get_declared_classes(); foreach ($allClasses as $class) { if (get_parent_class($class) == 'SilverStripe\\ORM\\DataObject') { $baseClasses[] = $class; } } foreach ($baseClasses as $baseClass) { // Get data classes $subclasses = ClassInfo::subclassesFor($baseClass); unset($subclasses[0]); foreach ($subclasses as $k => $subclass) { if (DataObject::has_own_table($subclass)) { unset($subclasses[$k]); } } if ($subclasses) { $records = DB::query("SELECT * FROM \"{$baseClass}\""); foreach ($subclasses as $subclass) { $recordExists[$subclass] = DB::query("SELECT \"ID\" FROM \"{$subclass}\"")->keyedColumn(); } foreach ($records as $record) { foreach ($subclasses as $subclass) { $id = $record['ID']; if ($record['ClassName'] != $subclass && !is_subclass_of($record['ClassName'], $subclass) && isset($recordExists[$subclass][$id])) { $sql = "DELETE FROM \"{$subclass}\" WHERE \"ID\" = {$record['ID']}"; echo "<li>{$sql}"; DB::query($sql); } } } } } }
public function TestHasOwnTable() { /* Test DataObject::has_own_table() returns true if the object has $has_one or $db values */ $this->assertTrue(DataObject::has_own_table("DataObjectTest_Player")); $this->assertTrue(DataObject::has_own_table("DataObjectTest_Team")); $this->assertTrue(DataObject::has_own_table("DataObjectTest_Fixture")); /* Root DataObject that always have a table, even if they lack both $db and $has_one */ $this->assertTrue(DataObject::has_own_table("DataObjectTest_FieldlessTable")); /* Subclasses without $db or $has_one don't have a table */ $this->assertFalse(DataObject::has_own_table("DataObjectTest_FieldlessSubTable")); /* Return false if you don't pass it a subclass of DataObject */ $this->assertFalse(DataObject::has_own_table("SilverStripe\\ORM\\DataObject")); $this->assertFalse(DataObject::has_own_table("ViewableData")); $this->assertFalse(DataObject::has_own_table("ThisIsntADataObject")); }