PHPRO.ORG

Due to the unprecedented amount of emails recieved for support for this class, a seperate documentation page has been created to deal with issues as they arise. Both of the emails were for feature requests and have been added. To access the documentation for this class see http://www.phpro.org/classes/PDOFormGen-Doc.html

The PDOFormGen.class.php File


<?php

/**
 *
 * @Generates an HTML form from a PDO result set
 *
 * @author Kevin Waterson <kevin@phpro.org>
 * @copyright  2007 PHPRO 
 * @version    CVS: $Id:$
 * @since      Class available since Release 0.0.1
 *
 * If the submit value is not set, the default is "Submit"
 *
 * If the query_cond(ition) is not set, the default is 1 and
 * no values are shown in the form
 *
 */
class PDOFormGen {

/*** table name ***/
private $table_name;

/*** the form action ***/
private $form_action;

/*** the meta data ***/
private $meta_data = array();

/*** PDO instance ***/
private static $instance;

/*** dsn ***/
private $dsn;

/*** database username ***/
private $db_username null;

/*** database password ***/
private $db_password null;

/*** query conditional ***/
private $query_cond;

/*** the field_values array ***/
private $field_values = array();

/*** the excluded fields array ***/
private $exclude_fields = array();

/*** custom fields array ***/
private $custom_fields = array();

/*** the reset button ***/
private $reset_button null;
/**
 *
 * Constructor, duh!
 *
 */
public function __construct(){
 
/*** set the default value of the submit button ***/
 
$this->setSubmitButtonValue();

 
/*** set the default condition for the SQL statement ***/
 
$this->setQueryCond();
}

/**
 *
 * @set the table name
 *
 * @access public
 *
 * @param string $name
 *
 * @return void
 *
 */
public function setTableName($name){
 
$this->table_name $name;
 return;
}

/**
 *
 * @set the table meta data
 *
 * @access private
 *
 * @return void
 *
 */
private function setMetaData(){
  
$i 0;
  
$select $this->getInstance()->query("SELECT * FROM "$this->table_name.'  WHERE '.$this->query_cond );
  
/*** loop through the results of the query ***/
  
while($i $select->columnCount())
    {
    
/*** populate the field values, if the query condition is not 1, we use values from db ***/
    
if($this->query_cond != 1)
        {
        
$this->field_values[$i] = $select->fetch(PDO::FETCH_NUM);
        }
    
/*** populate the meta data array ***/
    
$this->meta_data[] = $select->getColumnMeta($i);
    
$i++;
    }
  return;
}


/**
 *
 * @get set an input type=text
 *
 * @access private
 *
 * @param string $fieldname
 *
 * @param INT maxlength
 *
 * @return string
 *
 */
private function inputTextField($fieldname$maxlength$field_value=null){
 return 
'<input type="text" name="'.$fieldname.'" maxlength="'.$maxlength.'" value="'.$field_value.'" id="'.$fieldname.'" />'."\n";
}


/**
 *
 * @get set an input type=password
 *
 * @access private
 *
 * @param string $fieldname
 *
 * @param INT maxlength
 *
 * @return string
 *
 */
private function inputPasswordField($fieldname$maxlength$field_value=null){
 return 
'<input type="password" name="'.$fieldname.'" maxlength="'.$maxlength.'" value="'.$field_value.'" id="'.$fieldname.'" />'."\n";
}


/**
 *
 * @get set an input type=hidden
 *
 * @access private
 *
 * @param string $fieldname
 *
 * @param INT maxlength
 *
 * @return string
 *
 */
private function inputHiddenField($fieldname$field_value=null){
 return 
'<input type="hidden" name="'.$fieldname.'" value="'.$field_value.'" id="'.$fieldname.'" />'."\n";
}


/**
 *
 * @get set an input <textarea>
 *
 * @access private
 *
 * @param string $fieldname
 *
 * @param INT maxlength
 *
 * @return string
 *
 */
private function textarea($fieldname$field_value=null){
 
$ret ='<textarea cols="40" rows="10" name="'.$fieldname.'" id="'.$fieldname.'" />';
 
$ret .= $field_value.'</textarea>'."\n";
 return 
$ret;
}

/**
 *
 * @Create a <input type="file"..>
 *
 * @access private
 *
 * @param string $fieldname
 *
 * @return string
 *
 */
private function inputFileField($fieldname){
  return 
'<input type="file" name="'.$fieldname.'" id="'.$fieldname.'" />'."\n";
}


/**
 *
 * @generate the form label
 *
 * @access private
 *
 * @param string $fieldname
 *
 * @return string $label
 *
 */
private function formLabel($fieldname){
  
$label '<label for="'.$fieldname.'">'.$this->formatFormLabel($fieldname).'</label>'."\n";
  return 
$label;
}


/**
 *
 * @set the submit button value
 *
 * @access public
 *
 * @param string $submit_value
 *
 * @return void
 *
 */
public function setSubmitButtonValue($submit_value='Submit'){
  
$this->submit_value $submit_value;
  return;
}

/**
 *
 * @The submit button
 *
 * @access private
 *
 * @return string;
 *
 */
private function submitButton(){
  return 
'<input type="submit" value="'.$this->submit_value.'" />'."\n";
}


/**
*
* Return DB instance or create intitial connection
*
* @return object (PDO)
*
* @access public
*
*/
public function getInstance() {

if (!
self::$instance)
    {
    
self::$instance = new PDO($this->dsn$this->db_username$this->db_password);
    
self::$instance-> setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    }
return 
self::$instance;
}

/**
 *
 * @Generate the form string
 *
 * @access public
 *
 * return string (form data)
 *
 */
public function generateForm(){
 
$this->setMetaData();
 
/*** begin the form ***/
 
$form $this->formBegin();
 
/*** get the inputs ***/
$i=0;
/***
echo '<pre>';
var_dump($this->meta_data);
echo '</pre>';
***/

 
foreach($this->meta_data as $data)
    {
    
/*** check the value is not in the excluded fields array ***/
    
if(!in_array($data['name'], $this->exclude_fields))
        {
    
/*** set the native type ***/
    
$native_type = (isset($data['native_type'])) ? $data['native_type'] : null;
        
/*** if the query condition is not set, we do not need to pass the field_name 
        value from $field_values array to the inputTextField method
        ***/
    
if(array_key_exists($data['name'], $this->custom_fields))
        {
        
/*** the custom array ***/
        
$ca $this->custom_fields[$data['name']];

        
/*** No label is required if the input type is "hidden" ***/
        
if($ca['field_type'] != "hidden")
            {
            echo 
'boo';
            
$form .= $this->formLabel($data['name']);
            }
        if(
$ca['field_type'] == 'dropdown')
            {
            
$form .= $this->dropDownField($data['name'], $ca['db_table'], $ca['db_field'], $ca['db_id']);
            }
        elseif(
$ca['field_type'] == 'listbox')
            {
            
$form .= $this->listBoxField($data['name'], $ca['db_table'], $ca['db_field'], $ca['db_id']);
            }
        elseif(
$ca['field_type'] == 'radio')
            {
            
$form .= $this->radioButtonField($data['name'], $ca['db_table'], $ca['db_field']);
            }
        elseif(
$ca['field_type'] == 'checkbox')
            {
            
$form .= $this->checkBoxField($data['name'], $ca['db_table'], $ca['db_field']);
            }
        elseif(
$ca['field_type'] == 'password')
            {
            
$value =($this->query_cond != 1) ? $this->field_values[0][$i] : null;
            
$form .= $this->inputPasswordField($data['name'], $data['len'], $value);
            }
        elseif(
$ca['field_type'] == 'hidden')
            {
            
$value =($this->query_cond != 1) ? $this->field_values[0][$i] : null;
                        
$form .= $this->inputHiddenField($data['name'], $value);
            }
        else
            {
            throw new 
Exception("Invalid type supplied");
            }
        }
    
    else
        {
        
/*** the form label ***/
        
$form .= $this->formLabel($data['name']);
        
// $field_type, $fieldname, $maxlength, $field_value
               
$form .= ($this->query_cond !=1) ? $this->getFieldType($native_type$data['name'], $data['len'], $this->field_values[0][$i]) : $this->getFieldType($native_type$data['name'], $data['len']);
        }
        
$i++;
        }
    }
 
$form .= $this->submitButton();
 
$form .= $this->reset_button;
 
$form .= $this->formEnd();
 return 
$form;
}


/**
 *
 * @set the form action
 *
 * @access public
 *
 * @param string
 *
 */
public function setFormAction($action){
 
$this->form_action $action;
}


/**
 *
 * @set the form action
 *
 * @access private
 *
 * @return string
 *
 */
private function formBegin(){
 return 
'<form action="'.$this->form_action.'" method="post">'."\n";
}

/**
 *
 * @end of form
 *
 * @access private
 *
 * @return string
 *
 */
private function formEnd(){
 return 
'</form>'."\n";
}

/**
 *
 * @set the dsn
 *
 * @access public
 *
 * @param string $dsn
 *
 */
public function setDSN($dsn){
 
$this->dsn $dsn;
}

/**
 *
 * @set database username
 *
 * @access public
 *
 * @param string $username
 *
 */
public function setDbUsername($username){
 
$this->db_username $username;
}

/**
 *
 * @set the database password
 *
 * @access public
 *
 * @param string
 *
 */
public function setDbPassword($password){
 
$this->db_password $password;
}

/**
 * prepare the text for the form label
 * get rid of underscores and CamelCase
 *
 * @access private
 *
 * @param string $string
 *
 * @return string
 *
 */
private function formatFormLabel($string){
 
$string ucwords(str_replace('_'' '$string));
 
$split preg_split("/(?<=[a-z]) (?=[A-Z])/x"$string);
 return 
implode(' ',$split);
}

/**
 *
 * @Set the query condition for the query (default 1)
 *
 * @access public
 *
 * @param string $cond(ition)
 *
 */
public function setQueryCond($cond=1){
  
$this->query_cond $cond;
}

/**
 *
 * @set the Excluded fields
 *
 * @access public
 *
 * @param array $array
 *
 */
public function setExcludeFields($array){
 
$this->exclude_fields $array;
}


/**
 *
 * @check for field type eg: blob, string, var_string
 * and return the input type for the form <input type=$file_type>
 *
 * @access private
 *
 * @param string $field_type
 *
 * @return string
 *
 * Need to discern between MySQL text and blob fields ext/pdo_mysql/mysql_statement.c
 *
 */
private function getFieldType($field_type$fieldname$maxlength$field_value=null){
switch (
strtolower($field_type)) {
case 
'blob':
    
/*** this needs to be changed to inputTypeField ***/
    
return $this->textarea($fieldname$field_value);
    break;
case 
'text':
    return 
$this->textarea($fieldname$field_value);
    break;
case 
'bytea':
    return 
$this->inputFileField($fieldname);
    break;
default:
    return 
$this->inputTextField($fieldname$maxlength$field_value);
  }
}


/**
 * Create a dropdown box field
 *
 * @access public
 *
 * @param string $fieldname, The name of the select field
 *
 * @param string $db_table, The name of the table to snarf the values
 *
 * @param string $db_field, The name of the table field to snarf the values
 *
 * @param string $db_id, The id of table
 *
 * @return string
 */
public function dropDownField($fieldname$db_table$db_field$db_id){
 
$dd '<select name="'.$fieldname.'">'."\n";
 
$sql "SELECT * FROM $db_table ORDER BY $db_id";
 foreach(
$this->getInstance()->query($sql) as $row)
    {
    
$dd .= '<option value="'.$row[$db_id].'">'.$row[$db_field].'</option>'."\n";
    }
 
$dd .= '</select>'."\n";
 return 
$dd;
}


/**
 * Create a listbox field
 *
 * @access public
 *
 * @param string $fieldname, The name of the select field
 *
 * @param string $db_table, The name of the table to snarf the values
 *
 * @param string $db_field, The name of the table field to snarf the values
 *
 * @param string $db_id, The id of table
 *
 * @return string
 */
public function listBoxField($fieldname$db_table$db_field$db_id){
 
$dd '<select name="'.$fieldname.'" size="4">'."\n";
 
$sql "SELECT * FROM $db_table ORDER BY $db_id";
 foreach(
$this->getInstance()->query($sql) as $row)
        {
        
$dd .= '<option value="'.$row[$db_id].'">'.$row[$db_field].'</option>'."\n";
        }
 
$dd .= '</select>'."\n";
 return 
$dd;
}

/**
 * Create a checkbox field
 *
 * @access public
 *
 * @param string $fieldname, The name of the select field
 *
 * @param string $table, The name of the table to snarf the values
 *
 * @param string $field, The name of the table field to snarf the values
 *
 * @return string
 */
public function checkBoxField($fieldname$table$field){
 
$cb ='';
 
$sql "SELECT $field FROM $table";
 foreach(
$this->getInstance()->query($sql) as $row)
        {
    
$cb .= '<span class="checkbox">'.$row[$field].'</span>';
    
$cb .= '<input type="checkbox" name="'.$fieldname.'" value="'.$row[$field].'" />'."\n";
        }
 return 
$cb;
}


/**
 * Create a radio button field
 *
 * @access public
 *
 * @param string $fieldname, The name of the select field
 *
 * @param string $table, The name of the table to snarf the values
 *
 * @param string $field, The name of the table field to snarf the values
 *
 * @return string
 */
public function radioButtonField($fieldname$table$field){
 
$rb ='';
 
$sql "SELECT $field FROM $table";
 foreach(
$this->getInstance()->query($sql) as $row)
        {
    
$rb .= '<span class="radio">'.$row[$field].'</span>';
        
$rb .= '<input type="radio" name="'.$fieldname.'" value="'.$row[$field].'" />'."\n";
        }
 return 
$rb;
}

/**
 *
 * @A form reset button
 *
 * @access public
 *
 * @param string $value, the text on the button
 *
 */
public function setResetButton($value="Reset"){
 
$this->reset_button '<input type="reset" value="'.$value.'" />'."\n";
}

/**
 *
 * @set a custom field 
 *
 * @access public
 *
 * @param string $form_fieldname, the name of the db field
 *
 * @param string $fieldtype, dropdown, radio etc
 *
 * @param string $db_table the db table to select from
 *
 * @param string $db_field, the db field to select from
 *
 * @param[optional] string db_id, an id for the values
 *
 */
public function setCustomField($form_fieldname$fieldtype$db_table=null$db_field=null$db_id=null) {
 
/*** set the db_id to $db_id or the value of $db_field ***/
 
$db_id is_null($db_id) ? $db_field $db_id;
 
$this->custom_fields[$form_fieldname] = array('field_type'=>$fieldtype'db_table'=>$db_table'db_field'=>$db_field'db_id'=>$db_id);
}

/*** end of class ***/
?>