* * $Id: codegen_ui.php 522 2009-04-02 18:14:53Z erikwinn $ *@version 0.1 * @package QCodo */ class CodeGenUI extends QForm { ///@var QPanel - the panel containing controls for selecting settings public $pnlSettings; ///@var QButton - triggers code generation public $btnRun; ///@var QListBox - a list of tables for which to generate code public $lstTables; ///@var QCheckBox - check to support old style manual queries public $chkManualQuerySupport; ///@var QTextBox - type table suffix public $txtTypeTableIdentifier; ///@var QTextBox - association table suffix public $txtAssociationTableIdentifier; ///@var QTextBox - optional table prefix to remove public $txtStripFromTableName; ///@var QCheckBox - check to preserve previously generated QQN file public $chkSaveORM; ///@var string - comma delimited list of tables to generate private $strIncludeList; ///@var DOMDocument - contains the codegen_settings.xml XML private $objSettingsDom; ///@var string - file name for the QCodo standard codegen_settings.xml; adjust to fit your set up. private $strSettingsTpl; ///@var string - file name for the temporary settings XML; adjust to fit your set up. private $strMySettingsFile = '/tmp/code_generator_settings.xml'; ///@var boolean - whether to preserve the old QQN.class.php private $blnSaveORM; ///@var array - contains names of ORM files to save and replace private $aryORMFiles; ///Runs last .. replace old ORM if desired protected function Form_Exit() { if($this->blnSaveORM) { foreach($this->aryORMFiles as $strFileName => $strTempFileName) if(file_exists($strTempFileName) ) copy($strTempFileName, $strFileName); } } ///Runs once, first time the page is accessed (in a session) protected function Form_Create() { $this->strSettingsTpl = __DOCROOT__ . __DEVTOOLS__ . '/codegen_settings.xml'; // $this->strTemplate = 'codegen_ui.tpl.php'; if( !is_file($this->strSettingsTpl) ) throw new QCallerException('Settings template missing: ' . $this->strSettingsTpl); //Set up array of ORM classes to preserve .. $strBaseDir = __DATAGEN_CLASSES__; $this->aryORMFiles = array( $strBaseDir . '/_type_class_paths.inc.php' => $strBaseDir . '/_type_class_paths.inc.php-gentmp', $strBaseDir . '/_class_paths.inc.php' => $strBaseDir . '/_class_paths.inc.php-gentmp', $strBaseDir . '/QQN.class.php' => $strBaseDir . '/QQN.class.php-gentmp', $strBaseDir . '/QMetaDataBase.class.php' => $strBaseDir . '/QMetaDataBase.class.php-gentmp', ); $this->objSettingsDom = new DOMDocument(); $this->objSettingsDom->load( $this->strSettingsTpl ); $this->pnlSettings = new QPanel($this); //Note that we are setting a template for the child panel here: $this->pnlSettings->Template = 'codegen_ui_settings.tpl.php'; $this->initTableList(); //get the other settings in the standard file .. $objTypeTableIdentifierNode = $this->objSettingsDom->getElementsByTagName('typeTableIdentifier')->item(0); $objAssociationTableIdentifierNode = $this->objSettingsDom->getElementsByTagName('associationTableIdentifier')->item(0); $objManualQueryNode = $this->objSettingsDom->getElementsByTagName('manualQuery')->item(0); $objStripFromTableName= $this->objSettingsDom->getElementsByTagName('stripFromTableName')->item(0); $this->chkManualQuerySupport = new QCheckBox($this->pnlSettings); $this->chkManualQuerySupport->Name = 'Support (old) Manual Queries'; $this->chkManualQuerySupport->Checked = ( 'true' == $objManualQueryNode->getAttribute('support') ); $this->txtAssociationTableIdentifier = new QTextBox($this->pnlSettings); $this->txtAssociationTableIdentifier->Name = 'Association table suffix'; $this->txtAssociationTableIdentifier->Text = $objAssociationTableIdentifierNode->getAttribute('suffix'); $this->txtTypeTableIdentifier = new QTextBox($this->pnlSettings); $this->txtTypeTableIdentifier->Name = 'Type table suffix'; $this->txtTypeTableIdentifier->Text = $objTypeTableIdentifierNode->getAttribute('suffix'); $this->txtStripFromTableName = new QTextBox($this->pnlSettings); $this->txtStripFromTableName->Name = 'Remove table prefix'; $this->txtStripFromTableName->Text = $objStripFromTableName->getAttribute('prefix'); $this->chkSaveORM = new QCheckBox($this->pnlSettings); $this->chkSaveORM->Name = 'Preserve ORM (Recommended)'; $this->chkSaveORM->Checked = true; $this->btnRun = new QButton($this); $this->btnRun->Text = 'Run Generator'; $this->btnRun->AddAction(new QClickEvent(), new QServerAction('btnRun_Click')); } /** * Creates a list box with a list of the possible tables for which to generate ORM code * * @todo - suppport multiple databases .. */ private function initTableList() { $this->lstTables = new QListBox($this->pnlSettings); $this->lstTables->Name = 'Select tables'; $this->lstTables->SelectionMode = QSelectionMode::Multiple; $objDbi = QApplication::$Database[1]; $aryTables = $objDbi->GetTables(); $intSize = 0; foreach($aryTables as $strTableName) { $intSize += 1; $this->lstTables->AddItem(new QListItem($strTableName, $strTableName)); } $this->lstTables->Rows = $intSize > 10 ? 10: $intSize; } /** * This is called when the user clicks "Run Generator". It collects the values set in the upper * half of the page, writes a temporary XML doc for CodeGen settings and runs QCodeGen::Run * using the temporary settings. * Parameters are ignored. */ protected function btnRun_Click($strFormId, $strControlId, $strParameter) { $this->objSettingsDom->load( $this->strSettingsTpl ); $this->strIncludeList = ''; $arySelectedItems = $this->lstTables->SelectedItems; if(!$arySelectedItems) return; foreach( $arySelectedItems as $objListItem) { if('' != $this->strIncludeList) $this->strIncludeList .= ','; $this->strIncludeList .= $objListItem->Value; } if('' == $this->strIncludeList) return; //first, set up the table selection .. $objExcludesNode = $this->objSettingsDom->getElementsByTagName('excludeTables')->item(0); $objIncludesNode = $this->objSettingsDom->getElementsByTagName('includeTables')->item(0); $objExcludesNode->setAttribute('pattern','[0-9a-zA-Z_]*'); $objIncludesNode->setAttribute('list', $this->strIncludeList); //extra settings .. $objManualQueryNode = $this->objSettingsDom->getElementsByTagName('manualQuery')->item(0); $objTypeTableIdentifierNode = $this->objSettingsDom->getElementsByTagName('typeTableIdentifier')->item(0); $objAssociationTableIdentifierNode = $this->objSettingsDom->getElementsByTagName('associationTableIdentifier')->item(0); $objStripFromTableName= $this->objSettingsDom->getElementsByTagName('stripFromTableName')->item(0); $objManualQueryNode->setAttribute('support', $this->chkManualQuerySupport->Checked ? 'true' : 'false'); $objAssociationTableIdentifierNode->setAttribute('suffix', trim($this->txtTypeTableIdentifier->Text)); $objTypeTableIdentifierNode->setAttribute('suffix', trim($this->txtTypeTableIdentifier->Text)); $objStripFromTableName->setAttribute('suffix', trim($this->txtStripFromTableName->Text)); $this->objSettingsDom->save( $this->strMySettingsFile ); //By default QCodeGen creates new ORM files - save these and replace if desired .. $this->blnSaveORM = $this->chkSaveORM->Checked; if($this->blnSaveORM) { foreach($this->aryORMFiles as $strFileName => $strTempFileName) if(file_exists($strFileName) ) copy($strFileName, $strTempFileName); } QCodeGen::Run($this->strMySettingsFile); } /** * Convenience function for formatting output - pretty prints the given text *@param string strText - text to format and print to screen */ protected function DisplayMonospacedText($strText) { $strText = QApplication::HtmlEntities($strText); $strText = str_replace(' ', ' ', $strText); $strText = str_replace(' ', ' ', $strText); $strText = str_replace("\r", '', $strText); $strText = str_replace("\n", '
', $strText); _p($strText, false); } } CodeGenUI::Run('CodeGenUI'); ?>