diff options
-rw-r--r-- | HISTORY | 1 | ||||
-rwxr-xr-x | framework/prado-cli.php | 97 |
2 files changed, 98 insertions, 0 deletions
@@ -18,6 +18,7 @@ BUG: TErrorHandler: avoid an error when trying to hide the file path of a lambda BUG: TSecurityManager: avoid a race condition when first generating the encryptionkey or the validationkey (ctrlaltca) BUG: TActiveFileUpload: urlencode the base64'ed token since it can contain the "+" character (otherway it would be traslated to a space) (ctrlaltca) BUG: TCaptcha: publish images with image/png content-type (ctrlaltca) +ENH: prado-cli: added generateAll command (darthdaniel85) BUG: Issue #35 - [840] Capital letters for the initial letter of the directories name (ctrlaltca) BUG: Issue #66 - TButton.CausesValidation=False ignored when pressing Enter on the button within a control with DefaultButton (ctrlaltca) diff --git a/framework/prado-cli.php b/framework/prado-cli.php index d22296c5..25df7976 100755 --- a/framework/prado-cli.php +++ b/framework/prado-cli.php @@ -43,6 +43,7 @@ PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineCrea PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLinePhpShell'); PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineUnitTest'); PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineActiveRecordGen'); +PradoCommandLineInterpreter::getInstance()->addActionClass('PradoCommandLineActiveRecordGenAll'); //run it; PradoCommandLineInterpreter::getInstance()->run($_SERVER['argv']); @@ -730,6 +731,102 @@ EOD; } } +/** + * Create active record skeleton for all tables in DB and its relations + * + * @author Matthias Endres <me[at]me23[dot]de> + * @author Daniel Sampedro Bello <darthdaniel85[at]gmail[dot]com> + * @version $Id$ + * @since 3.2 + */ +class PradoCommandLineActiveRecordGenAll extends PradoCommandLineAction { + + protected $action = 'generateAll'; + protected $parameters = array('output'); + protected $optional = array('directory', 'soap', 'overwrite', 'prefix', 'postfix'); + protected $description = "Generate Active Record skeleton for all Tables to <output> file using application.xml in [directory]. May also generate [soap] properties.\nGenerated Classes are named like the Table with optional [Prefix] and/or [Postfix]. [Overwrite] is used to overwrite existing Files."; + private $_soap = false; + private $_prefix = ''; + private $_postfix = ''; + private $_overwrite = false; + + public function performAction($args) { + $app_dir = count($args) > 2 ? $this->getAppDir($args[2]) : $this->getAppDir(); + $this->_soap = count($args) > 3 ? ($args[3] == "soap" || $args[3] == "true" ? true : false) : false; + $this->_overwrite = count($args) > 4 ? ($args[4] == "overwrite" || $args[4] == "true" ? true : false) : false; + $this->_prefix = count($args) > 5 ? $args[5] : ''; + $this->_postfix = count($args) > 6 ? $args[6] : ''; + + if ($app_dir !== false) { + $config = $this->getActiveRecordConfig($app_dir); + + $manager = TActiveRecordManager::getInstance(); + $con = $manager->getDbConnection(); + $con->Active = true; + $command = $con->createCommand("Show Tables"); + $dataReader = $command->query(); + $dataReader->bindColumn(1, $table); + $generator = new PHP_Shell_Extensions_ActiveRecord(); + $tables = array(); + while ($dataReader->read() !== false) { + $tables[] = $table; + } + $con->Active = False; + foreach ($tables as $key => $table) { + $output = $args[1] . "." . $this->_prefix . ucfirst($table) . $this->_postfix; + if ($config !== false && $output !== false) { + $generator->generate("generate " . $table . " " . $output . " " . $this->_soap . " " . $this->_overwrite); + } + } + } + return true; + } + + protected function getAppDir($dir=".") { + if (is_dir($dir)) + return realpath($dir); + if (false !== ($app_dir = realpath($dir . '/protected/')) && is_dir($app_dir)) + return $app_dir; + echo '** Unable to find directory "' . $dir . "\".\n"; + return false; + } + + protected function getXmlFile($app_dir) { + if (false !== ($xml = realpath($app_dir . '/application.xml')) && is_file($xml)) + return $xml; + if (false !== ($xml = realpath($app_dir . '/protected/application.xml')) && is_file($xml)) + return $xml; + echo '** Unable to find application.xml in ' . $app_dir . "\n"; + return false; + } + + protected function getActiveRecordConfig($app_dir) { + if (false === ($xml = $this->getXmlFile($app_dir))) + return false; + if (false !== ($app = $this->initializePradoApplication($app_dir))) { + Prado::using('System.Data.ActiveRecord.TActiveRecordConfig'); + foreach ($app->getModules() as $module) + if ($module instanceof TActiveRecordConfig) + return $module; + echo '** Unable to find TActiveRecordConfig module in ' . $xml . "\n"; + } + return false; + } + + protected function getOutputFile($app_dir, $namespace) { + if (is_file($namespace) && strpos($namespace, $app_dir) === 0) + return $namespace; + $file = Prado::getPathOfNamespace($namespace, ""); + if ($file !== null && false !== ($path = realpath(dirname($file))) && is_dir($path)) { + if (strpos($path, $app_dir) === 0) + return $file; + } + echo '** Output file ' . $file . ' must be within directory ' . $app_dir . "\n"; + return false; + } + +} + //run PHP shell if(class_exists('PHP_Shell_Commands', false)) { |