private static function _getORMPlurals() { $orm_dirs = \Gini\Core::pharFilePaths(CLASS_DIR, 'Gini/ORM'); $onames = []; foreach ($orm_dirs as $orm_dir) { if (!is_dir($orm_dir)) { continue; } \Gini\File::eachFilesIn($orm_dir, function ($file) use($orm_dir, &$onames) { $oname = preg_replace('|.php$|', '', $file); if ($oname == 'Object') { return; } $class_name = '\\Gini\\ORM\\' . str_replace('/', '\\', $oname); // Check if it is abstract class $rc = new \ReflectionClass($class_name); if ($rc->isAbstract()) { return; } $onames[] = strtolower($oname); }); } if (count($onames) == 0) { return []; } printf("%s\n", 'Generating ORM plurals cache...'); if (!class_exists('\\Doctrine\\Common\\Inflector\\Inflector')) { echo " [31m*[0m doctrine/inflector is missing! Perhaps you did't update your composer packages yet.\n\n"; return []; } $plurals = []; $onames = array_unique($onames); foreach ($onames as $oname) { $plural = \Doctrine\Common\Inflector\Inflector::pluralize($oname); printf(" %s => %s\n", $plural, $oname); $plurals[$plural] = $oname; } echo "\n"; return $plurals; }
private function _merge_assets($force = false) { printf("%s\n", 'Merging all assets...'); $assets_dir = APP_PATH . '/web/assets'; \Gini\File::ensureDir($assets_dir); $filemtime = []; $pinfo = (array) \Gini\Core::$MODULE_INFO; foreach ($pinfo as $p) { $src_dir = $p->path . '/' . RAW_DIR . '/assets'; \Gini\File::eachFilesIn($src_dir, function ($file) use($src_dir, $assets_dir, $force, &$filemtime) { //ignore less|css|js since we will process them later. if (preg_match('/^(?:less|css|js)\\//', $file)) { return; } $src_path = $src_dir . '/' . $file; $dst_path = $assets_dir . '/' . $file; \Gini\File::ensureDir(dirname($dst_path)); if (!isset($filemtime[$dst_path])) { $filemtime[$dst_path] = file_exists($dst_path) ? filemtime($dst_path) : 0; } if ($force || filemtime($src_path) > $filemtime[$dst_path] || !file_exists($dst_path) || filesize($src_path) != filesize($dst_path)) { printf(" copy %s\n", $file); copy($src_path, $dst_path); } }); } echo " [32mdone.[0m\n"; }
public function actionUpgradeId() { // ORM required class map. if (!isset($GLOBALS['gini.class_map'])) { echo "[31mYou need to run [1m\"gini cache class\"[0;31m before upgrade ORM id.[0m\n"; return; } // enumerate orms echo "Updating database structures according ORM definition...\n"; $orm_dirs = \Gini\Core::pharFilePaths(CLASS_DIR, 'Gini/ORM'); foreach ($orm_dirs as $orm_dir) { if (!is_dir($orm_dir)) { continue; } \Gini\File::eachFilesIn($orm_dir, function ($file) use($orm_dir) { $oname = preg_replace('|.php$|', '', $file); if ($oname == 'Object') { return; } $class_name = '\\Gini\\ORM\\' . str_replace('/', '\\', $oname); // Check if it is abstract class $rc = new \ReflectionClass($class_name); if ($rc->isAbstract()) { return; } $o = \Gini\IoC::construct($class_name); // some object might not have database backend $db = $o->db(); if (!$db) { return; } printf(" %s\n", $oname); $structure = $o->structure(); foreach ($structure as $field => $option) { if (isset($option['object'])) { $db->query('UPDATE :table SET :field=NULL WHERE :field=0', [':table' => $o->tableName(), ':field' => $field . '_id']); } } }); } echo " [32mdone.[0m\n"; }
public static function possibleCommands($argv) { // list available cli programs $candidates = ['/' => []] + Util::pathAndArgs($argv, true); $commands = []; $class = null; foreach (array_reverse($candidates) as $path => $params) { $paths = \Gini\Core::pharFilePaths(CLASS_DIR, rtrim('Gini/Controller/CLI/' . ltrim($path, '/'), '/')); foreach ($paths as $p) { if (!is_dir($p)) { continue; } \Gini\File::eachFilesIn($p, function ($file) use(&$commands) { $name = basename(strtolower(explode('/', $file, 2)[0]), '.php'); $commands[$name] = $name; }); } // enumerate actions in class $path = strtr(ltrim($path, '/'), ['-' => '', '_' => '']); $basename = basename($path); $dirname = dirname($path); $class_namespace = '\\Gini\\Controller\\CLI\\'; if ($dirname != '.') { $class_namespace .= strtr($dirname, ['/' => '\\']) . '\\'; } $class = $class_namespace . $basename; if (class_exists($class)) { break; } $class = $class_namespace . 'Controller' . $basename; if (class_exists($class)) { break; } $class = null; } if (!$class) { $class = '\\Gini\\Controller\\CLI\\App'; $params = $argv; } if (class_exists($class)) { $rc = new \ReflectionClass($class); $methods = $rc->getMethods(\ReflectionMethod::IS_PUBLIC); foreach ($methods as $m) { if (strncmp('action', $m->name, 6) != 0) { continue; } if (preg_match_all('`([A-Z]+[a-z\\d]+|.+)`', substr($m->name, 6), $parts)) { $method = strtolower(implode('-', $parts[0])); if ($params[0] === $method) { $commands = []; break; } $commands[] = $method; } } } return $commands; }
public function actionExport($args) { printf("Exporting ORM structures...\n\n"); $orm_dirs = \Gini\Core::pharFilePaths(CLASS_DIR, 'Gini/ORM'); foreach ($orm_dirs as $orm_dir) { if (!is_dir($orm_dir)) { continue; } \Gini\File::eachFilesIn($orm_dir, function ($file) use($orm_dir) { $oname = strtolower(preg_replace('|.php$|', '', $file)); if ($oname == 'object') { return; } $class_name = '\\Gini\\ORM\\' . str_replace('/', '\\', $oname); // Check if it is abstract class $rc = new \ReflectionClass($class_name); if ($rc->isAbstract()) { return; } printf(" %s\n", $oname); $o = \Gini\IoC::construct($class_name); $structure = $o->structure(); // unset system fields unset($structure['id']); unset($structure['_extra']); $i = 1; $max = count($structure); foreach ($structure as $k => $v) { if ($i == $max) { break; } printf(" ├─ %s (%s)\n", $k, implode(',', array_map(function ($k, $v) { return $v ? "{$k}:{$v}" : $k; }, array_keys($v), $v))); ++$i; } printf(" └─ %s (%s)\n\n", $k, implode(',', array_map(function ($k, $v) { return $v ? "{$k}:{$v}" : $k; }, array_keys($v), $v))); }); } }