1 <?php
2 3 4 5 6 7 8 9
10 class ClassInfo {
11 12 13
14 static function allClasses() {
15 global $_ALL_CLASSES;
16 return $_ALL_CLASSES['exists'];
17 }
18
19 20 21
22 static function exists($class) {
23 global $_ALL_CLASSES;
24 return isset($_ALL_CLASSES['exists'][$class]) ? $_ALL_CLASSES['exists'][$class] : null;
25 }
26
27 28 29
30 private static $_cache_all_tables = null;
31
32 33 34
35 static function hasTable($class) {
36 if(DB::isActive()) {
37
38 if(empty(self::$_cache_all_tables)) {
39 self::$_cache_all_tables = array();
40 $tables = DB::query(DB::getConn()->allTablesSQL())->column();
41 foreach($tables as $table) self::$_cache_all_tables[strtolower($table)] = true;
42 }
43 return isset(self::$_cache_all_tables[strtolower($class)]);
44 } else {
45 return false;
46 }
47 }
48
49 static function reset_db_cache() {
50 self::$_cache_all_tables = null;
51 }
52
53 54 55
56 static function getValidSubClasses(){
57 return DB::getConn()->enumValuesForField("SiteTree", "ClassName");
58 }
59
60 61 62 63 64 65 66 67 68
69 static function dataClassesFor($class) {
70 global $_ALL_CLASSES;
71 if (is_object($class)) $class = get_class($class);
72
73 $dataClasses = array();
74
75 if(!$_ALL_CLASSES['parents'][$class]) user_error("ClassInfo::dataClassesFor() no parents for $class", E_USER_WARNING);
76 foreach($_ALL_CLASSES['parents'][$class] as $subclass) {
77 if(self::hasTable($subclass)) $dataClasses[] = $subclass;
78 }
79
80 if(self::hasTable($class)) $dataClasses[] = $class;
81
82 if(isset($_ALL_CLASSES['children'][$class]))
83 foreach($_ALL_CLASSES['children'][$class] as $subclass)
84 {
85 if(self::hasTable($subclass)) $dataClasses[] = $subclass;
86 }
87
88 return $dataClasses;
89 }
90
91 92 93 94 95 96 97
98 static function baseDataClass($class) {
99 global $_ALL_CLASSES;
100 if (is_object($class)) $class = get_class($class);
101 reset($_ALL_CLASSES['parents'][$class]);
102 while($val = next($_ALL_CLASSES['parents'][$class])) {
103 if($val == 'DataObject') break;
104 }
105 $baseDataClass = next($_ALL_CLASSES['parents'][$class]);
106 return $baseDataClass ? $baseDataClass : $class;
107 }
108
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
127 static function subclassesFor($class){
128 global $_ALL_CLASSES;
129 if (is_object($class)) $class = get_class($class);
130
131
132 $subclasses = isset($_ALL_CLASSES['children'][$class]) ? $_ALL_CLASSES['children'][$class] : null;
133
134
135 if(isset($subclasses)) {
136 array_unshift($subclasses, $class);
137 } else {
138 $subclasses[$class] = $class;
139 }
140
141 return $subclasses;
142 }
143
144 145 146
147 static function ancestry($class, $onlyWithTables = false) {
148 global $_ALL_CLASSES;
149
150 if(is_object($class)) $class = $class->class;
151 else if(!is_string($class)) user_error("Bad class value " . var_export($class, true) . " passed to ClassInfo::ancestry()", E_USER_WARNING);
152
153 $items = $_ALL_CLASSES['parents'][$class];
154 $items[$class] = $class;
155 if($onlyWithTables) foreach($items as $item) {
156 if(!DataObject::has_own_table($item)) unset($items[$item]);
157 }
158 return $items;
159 }
160
161 162 163 164
165 static function implementorsOf($interfaceName) {
166 global $_ALL_CLASSES;
167 return (isset($_ALL_CLASSES['implementors'][$interfaceName])) ? $_ALL_CLASSES['implementors'][$interfaceName] : false;
168 }
169
170 171 172
173 static function classImplements($className, $interfaceName) {
174 global $_ALL_CLASSES;
175 return isset($_ALL_CLASSES['implementors'][$interfaceName][$className]);
176 }
177
178 179 180 181
182 static function is_subclass_of($subclass, $parentClass) {
183 global $_ALL_CLASSES;
184 return isset($_ALL_CLASSES['parents'][$subclass][$parentClass]);
185 }
186
187 188 189 190 191 192 193 194 195 196
197 static function classes_for_file($filePath) {
198 $absFilePath = Director::getAbsFile($filePath);
199 global $_CLASS_MANIFEST;
200
201 $matchedClasses = array();
202 foreach($_CLASS_MANIFEST as $class => $compareFilePath) {
203 if($absFilePath == $compareFilePath) $matchedClasses[] = $class;
204 }
205
206 return $matchedClasses;
207 }
208
209 210 211 212 213 214 215 216 217
218 static function classes_for_folder($folderPath) {
219 $absFolderPath = Director::getAbsFile($folderPath);
220 global $_CLASS_MANIFEST;
221
222 $matchedClasses = array();
223 foreach($_CLASS_MANIFEST as $class => $compareFilePath) {
224 if(stripos($compareFilePath, $absFolderPath) === 0) $matchedClasses[] = $class;
225 }
226
227 return $matchedClasses;
228 }
229
230
231
232
233 234 235
236 static function ready() {
237 user_error("ClassInfo::ready() deprectaed - use Security::database_is_ready()", E_USER_NOTICE);
238 return Security::database_is_ready();
239 }
240
241 }
242 ?>
243
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-