A Qcodo based CMS/ecommerce framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

217 lines
10 KiB

<?php
/** Load in the QCodo framework
* @package QCodo
*/
require('../prepend.inc.php');
/** Load in the QCodeGen Class
* @package QCodo
*/
require(__QCODO__ . '/codegen/QCodeGen.class.php');
// Security check for ALLOW_REMOTE_ADMIN
// To allow access REGARDLESS of ALLOW_REMOTE_ADMIN, simply remove the line below
// QApplication::CheckRemoteAdmin();
/**
* Class CodeGenUI - this class provides a more flexible way to run the code generator. It is like codegen.php
* but allows you to select settings and the list of tables for which to generate ORM classes.
* Basically, this class loads the standard codegen_settings.xml, saves a temporary copy and gives
* the filename to QCodeGen::Run.
*
*@author Erik Winn <erikwinnmail@yahoo.com>
*
* $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(' ', '&nbsp;', $strText);
$strText = str_replace("\r", '', $strText);
$strText = str_replace("\n", '<br/>', $strText);
_p($strText, false);
}
}
CodeGenUI::Run('CodeGenUI');
?>