PHP Classes

File: buildProcessForm.php

Recommend this page to a friend!
  Classes of Richard Munroe   SQL Data   buildProcessForm.php   Download  
File: buildProcessForm.php
Role: Application script
Content type: text/plain
Description: Build the "save" action associated with a generated form
Class: SQL Data
Generate classes to store objects in SQL databases
Author: By
Last change: Minor tweak for better php5 compatibility.
Date: 16 years ago
Size: 5,327 bytes
 

Contents

Class file image Download
<?php
/**
 * @author Dick Munroe <munroe@csworks.com>
 * @copyright copyright @ Dick Munroe, 2004-2006, All rights reserved
 * @license http://www.csworks.com/publications/ModifiedNetBSD.html
 * @version 2.0.0
 */

//
// Construct a processor of an "edit" form using the class interface to a
// mySQL table generated by buildClass
//
// Build a processor of an HTML form from a mySQL table description that uses
// a SQLData derived class to access the data for the form.
// The processor program generated will require tweaking in order
// to be complete. Experience shows that the generated processor form is
// about 80% of the work.
//
// $Author: dickmunroe $
// $Date: 2007/12/26 15:41:56 $
//
// Edit History:
//
// Dick Munroe munroe@csworks.com 06-Nov-2004
// Initial Version Created
//
// Dick Munroe munroe@csworks.com 04-May-2005
// Clean up for publication.
//
// Dick Munroe munroe@csworks.com 14-Mar-2006
// Change licensing, reorganize includes.
//
// Dick Munroe (munroe@csworks.com) 15-Oct-2006
// Switch to database independent interfaces.
//
// Dick Munroe (munroe@csworks.com) 02-Nov-2006
// Minor tweak for better php5 compatibility.
//

include_once('SQLData/options.php') ;

$theOptions = getopt("h:p:u:d:") ;

if (
count($_SERVER['argv']) < 3)
{
    print(
"
buildProcessForm [-h hostname] [-u username] [-p password] [-d DBType] tableName databaseName

    Write a file named \"process.tableName.php\" and renames any existing file of
    the same name to process.tableName.php.old.
"
) ;
    return
0 ;
}

//
// Unfortunately PHP doesn't do the argv reduction common to all
// other implementations of getopt, so I'm requiring that the
// table and database names be the first two arguments.
//

$theTableName = $_SERVER['argv'][count($_SERVER['argv']) - 2] ;
$theDatabaseName = $_SERVER['argv'][count($_SERVER['argv']) - 1] ;

if (empty(
$theTableName))
{
    die(
'A table name is needed') ;
}

if (empty(
$theDatabaseName))
{
    die(
'A database name is needed') ;
}

options($theOptions) ;

$theValidResults = array() ;

$theDB =
   
FactoryDB::factory(
       
$theOptions['u'], // Username
       
$theOptions['p'], // Password
       
$theDatabaseName, // Database
       
$theOptions['h'], // Host
       
$theOptions['d']) ; // Database Type


//
// Save the old output file.
//

$theFileName = sprintf("process.%s.php", ucfirst($theTableName)) ;
$theOldFileName = $theFileName . ".old" ;

if (
file_exists($theFileName))
{
  if (
is_file($theFileName))
    {
      if (!
rename($theFileName, $theOldFileName))
    {
      exit(
1) ;
    }
    }
  else
    {
      exit(
2) ;
    }
}

if (!(
$theStream = @fopen($theFileName, 'w')))
{
  exit(
3) ;
}

//
// Emit the rough draft of the form processor.
//

fwrite($theStream, sprintf('<?php

//
// Edit form processor for:
//
// Class: %s
// Table: %s
// Database: %s
//
// Generated by buildProcessForm.php, written by Dick Munroe (munroe@csworks.com)
//

include_once("class.%s.php") ;
include_once("config.%s.php") ;
include_once("requestUtils/requestUtils.class.php") ;

session_start() ;

$the%s = new %s($the%sDatabase, $the%sHost, $the%sUser, $the%sPassword) ;

'
, ucfirst($theTableName),
      
$theTableName,
      
$theDatabaseName,
      
ucfirst($theTableName),
      
$theDatabaseName,
      
ucfirst($theTableName),
      
ucfirst($theTableName),
      
$theDatabaseName,
      
$theDatabaseName,
      
$theDatabaseName,
      
$theDatabaseName)) ;

fwrite(
   
$theStream,
   
'$theQuery = (empty($_SESSION["query"]) ? NULL : $_SESSION["query"]) ;

'
) ;

$thePrimaryKey = "" ;
$thePrimaryKeyIsAutoIncrement = false ;

$theResult = $theDB->describeTable($theTableName) ;

foreach (
$theResult as $theRow)
{
  if (!
preg_match("/auto_increment/", $theRow['Extra']))
    {
     
fwrite($theStream, sprintf('$the%s->set%s(stripslashes(requestUtils::getRequestObject("%s"))) ;
'
, ucfirst($theTableName),
        
ucfirst($theRow['Field']),
        
$theRow['Field'])) ;
    } ;

  if (
$theRow['Key'] == 'PRI')
    {
     
$thePrimaryKey = $theRow['Field'] ;
     
$thePrimaryKeyIsAutoIncrement = preg_match("/auto_increment/", $theRow['Extra']) ;
    }
}

fwrite($theStream, '
if (empty($theQuery))
{
'
) ;

fwrite($theStream, sprintf(' if (!$the%s->insert())
    {
        $the%s->showErrors() ;
        die() ;
    }
'
, ucfirst($theTableName),
      
ucfirst($theTableName))) ;

if (empty(
$thePrimaryKey))
{
 
fwrite($theStream, ' $theQuery = "where theField = theValue" ;
    die("You must specify a unique selector and store it in $theQuery") ;
'
) ;
}
else
{
 
fwrite($theStream, sprintf(' $theQuery = "where %s = \'" . $the%s->escape_string($the%s->get("%s")) . "\'" ;
'
, addcslashes($theDB->quoteIdentifier($thePrimaryKey), '"'),
    
ucfirst($theTableName),
    
ucfirst($theTableName),
    
$thePrimaryKey)) ;
}

fwrite($theStream, sprintf('}
else
{
    if (!$the%s->update($theQuery))
    {
        $the%s->showErrors() ;
        die() ;
    }
}
'
, ucfirst($theTableName),
      
ucfirst($theTableName))) ;

fwrite($theStream, '
$_SESSION["query"] = $theQuery ;
$theUrl = explode("?", $_SERVER["HTTP_REFERER"]) ;

header("Location: " . $theUrl[0]) ;
?>
'
) ;
?>