/** * clazz es el nombre de una clase de modelo (tambien puede ser PersistentObject). * Devuelve una estructura multiple con los nombres de todas las clases que heredan de clazz (hijas, nietas, etc) */ public static function getAllSubclassesOf($clazz) { //echo "<h1>ModelUtils.getAllSubclassesOf $clazz</h1>"; //Logger::struct( get_declared_classes(), "Declared classes ".__FILE__." ".__LINE__ ); // Esto en realidad se deberia hacer con getLoadedModelClasses // porque ModelUtils es para resolver temas de las clases del modelo. //$loadedClasses = YuppLoader::getLoadedClasses(); // Como las clases cargadas dependen de la aplicacion, // me ancargo de cargar todas las clases de la aplicacion // actual para obtener correctamente las subclases. // Mismo codigo que getSubclassesOf. $ctx = YuppContext::getInstance(); $appName = $ctx->getApp(); if ($appName == 'core') { // Si no se cargaron todas las clases y no se pasa el nombre de la app, no devuelve realmente todas las subclases, solo las que estan cargadas. YuppLoader::loadModel(); // Carga el modelo de todas las aplicaciones } else { // TODO: metodo para cargar todas las clases del modelo de una aplicacion. $classes = array(); // FIXME: Mismo codigo que CoreController.dbStatus YuppLoader::load('core.app', 'App'); // Puede no estar cargada $app = new App($appName); $modelClassFileNames = $app->getModel(); // Logger::struct( $modelClassFileNames, "modelClassFileNames ".__FILE__." ".__LINE__ ); $modelClassFileNames = self::array_flatten($modelClassFileNames); $fn = new FileNames(); foreach ($modelClassFileNames as $classFileName) { $fileInfo = $fn->getFileNameInfo($classFileName); YuppLoader::load($fileInfo['package'], $fileInfo['name']); } } $loadedClasses = YuppLoader::getLoadedModelClasses(); $res = array(); foreach ($loadedClasses as $loadedClass) { if (class_exists($loadedClass) && is_subclass_of($loadedClass, $clazz)) { $res[] = $loadedClass; } } return $res; }