CLICK HERE TO BUY IT TODAY! OR GET IT FREE VIA TRIALPAY  

PHP Demo Application - Source Code

/Framework/Model/FormHandlers/_Abstract.php

<?php
/**
* Script Contents: Apeel_Framework_Model_FormHandlers_Abstract Class
* @package Apeel_Framework_Model_FormHandlers
*/

/**
* Core functionality to handle displaying, populating, validating and saving 
* data from forms.  

* A form handler class in the Apeel Framework outputs the form, populated with
* data from a Data Object, it sets up the event handlers and both client side
* and server side validation, as well as handling the Save event to add/edit 
* data to the database.  

* It uses the Smarty templating engine to seperate design from coding and 
* offer maximum flexibility.  

* Form templates reside in Application/View/Templates/Forms

* Concrete classes derived from this base class contain the specifics of which
* form fields read/write to which database fields, and what kind of event
* handlers should be set up.  
*   
* @package      Apeel_Framework_Model_FormHandlers 
* @version      1.1.0
* @author       John W. King (email: contact@apeelframework.net)
* @copyright    City Business Logic Limited 2001-2011
* @license      Dual MIT / GNU Lesser General Public License Version 3
*/
abstract class Apeel_Framework_Model_FormHandlers_Abstract {

    
/**
    * The unique code belonging to the data object linked to this class, for
    * use in public areas such as javascript and hidden form fields.  
    * 
    * @var string
    */
    
public $dataObjectHash '';
    
    
    
/**
    * The name of the base data object connected to this form.  
    * 
    * @var string
    */
    
public $dataObjectName '';
    
    
    
/**
    * An instance of Smarty, a flexible templating system.  
    * 
    * @var Smarty Object
    */
    
protected $_smarty;
    
    
    
/**
    * An array containing a single record to be displayed by this form.  
    * 
    * @var array
    */
    
protected $_data;
    
    
    
/**
    * An instance of the Data Object connected to this form.  
    * 
    * @var Data Object
    */
    
protected $_dataObject;
    
    
    
/**
    * The primary key value that uniquely indentifies the current record in 
    * edit mode.  Can either be a single value or a serialized array, dependant
    * on the spec of the connected data object.  
    * 
    * @var string | array
    */
    
protected $_primaryKeyValue;
    
    
    
/**
    * Can be "Edit" or "Insert" to identify which action should be taken when 
    * the record is saved.  
    * 
    * @var string
    */
    
protected $_mode;
    
    
    
/**
    * Concrete classes must implement this method to generate and output 
    * Javascript to handle events and validation for the form.  
    * 
    * @param string $mode
    * @param integer $uniqueIndex
    * @param string $returnId
    * @param string $returnDisplay
    * @return void
    */
    
public abstract function generateClientScripts($mode$uniqueIndex$returnId$returnDisplay);
    
    
    
/**
    * Concrete classes must implement this method to return the ID and Display
    * value for the current record.  
    * 
    * It is used primarily when the user has brought up a data grid to select a
    * value, and clicks the "Add" button to bring up this form.  Upon saving 
    * the record, it needs to pass back the ID value to store in the hidden
    * value field, and the display field to show to the user.  
    * 
    * These values should be returned in an array with indexes "id" and 
    * "display".  
    * 
    * If this form is unlikely to be used in such a scenario then simply 
    * return NULL.  
    * 
    * @param Data Object $dataObject
    * @param string $mode
    * @param array $data
    * @return array
    */
    
public abstract function getIdAndDisplayValues($dataObject$mode$data);


    
/**
    * Concrete classes must implement this method to read values from the 
    * Data Object and write them to the form, using the populateX(...)
    * methods of the base class.  
    * 
    * e.g. $this->populateText('FORMFIELD', $this->_data['DBFIELD']);
    * 
    * @return void
    */
    
public abstract function populate();
    

    
/**
    * Concrete classes should implement this method to save data in Data 
    * Objects other than the main one linked to this form.  
    * 
    * For example, a typical use is in a many-to-many relationship where
    * you have a list of available values on one side and selected values
    * on the other, using a "middle" table to connect the main table for
    * this form with another table.  In this scenario, the "middle" table
    * should be written to in this method.  
    * 
    * If not applicable, simply return false.  
    * 
    * @param string | array $primaryKeyValue
    * @param string $mode
    * @return void | false
    */
    
public abstract function saveAdditionalData($primaryKeyValue$mode);
    
    
    
/**
    * Concrete classes should implement this method to save binary objects.  
    * 
    * The method should provide it's own connection to the database as the main
    * connection uses the UTF8 character set, which corrupts binary values.  
    * 
    * If not applicable, simply return false.  
    * 
    * @param string | array $primaryKeyValue
    * @return void | boolean
    */
    
public abstract function saveBinaryUploads($primaryKeyValue);


    
/**
    * Concrete classes must implement this method to set default values for
    * Insert mode.  
    * 
    * e.g. $this->_data['FORMFIELD'] = 'VALUE';
    * 
    * @return void
    */
    
public abstract function setDefaults();
    

    
/**
    * Concrete classes must implement this method to validate form values 
    * using the validateXXX(...) methods, e.g.  
    * 
    * $this->validateMinimumLength($data['DBFIELD'], 'FORMFIELD', 3, 
    * &$notValid, &$message);
    * 
    * The $notValid and $message fields are passed by reference rather than 
    * value allowing the save value to be passed to all validation methods 
    * used by the method.  
    * 
    * @param mixed $data
    * @return boolean
    */
    
public abstract function validateData($data);
    
    
    
/**
    * Creates a new instance of the Smarty templating engine, populates it with
    * data (if in edit mode), attaches javascript event handlers / validation
    * and calls the outputForm() method to load the template and output it.  
    * 
    * @param string | array $primaryKeyValue
    * @param integer $uniqueIndex
    * @param string $returnId
    * @param string $returnDisplay
    * @return void
    */
    
public function loadForm($primaryKeyValue$uniqueIndex$returnId$returnDisplay) {

        
// Smarty requires write access to templates_c folder.  When ready to enable Smarty
        // simply uncomment line below and comment the line after it.          
        //$this->_smarty = new Smarty();
        
$this->_smarty = new Apeel_Application_Templating();
        
        
$this->_primaryKeyValue $primaryKeyValue;        
        
        if (
$primaryKeyValue) {
            
$mode 'edit';
            
$this->getRecord($primaryKeyValue);
        } else {
            
$mode 'insert';
            
$this->setDefaults();
        }
        
        
$this->_mode $mode;        
        
$this->_smarty->assign('mode'$mode);
        if (
$mode == 'edit') {
            
$this->_smarty->assign('pk_' $this->dataObjectHash htmlentities(stripslashes($primaryKeyValue)));
        } else {
            
$this->_smarty->assign('pk_' $this->dataObjectHash '');
        }
        
$this->_smarty->assign('url_' $this->dataObjectHashAPEEL_BASE_URL_PATH_WITH_SCRIPT 'request/save?dataObject=' $this->dataObjectHash);
        
        
$this->populate();
        
$this->generateClientScripts($mode$uniqueIndex$returnId$returnDisplay);
        
$this->outputForm();
        
    }
    
    
    
/**
    * Reads data from connected Data Object, by filtering the results by the 
    * Primary Key.  
    * 
    * Only required in Edit mode.  
    * 
    * @param string | array $primaryKeyValue
    * @return void
    */
    
public function getRecord($primaryKeyValue) {
        
$filters = new Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters('[PRIMARYKEY]''='stripslashes($primaryKeyValue));
        
$dataObject Apeel_Framework_Model_Libraries_Data::getDataObjectByName($this->dataObjectName);
        
$dataObject->applyComponents(true$filters);
        
$this->_data $dataObject->getRecord();
    }    

    
    
/**
    * Get current date in MySQL yyyy-mm-dd format.  
    * 
    * @return string
    */
    
public function getCurrentDate() {
        return 
date('yyy-mm-dd');
    }

    
    
/**
    * Assigns a text value to the form template.  
    * 
    * @param string $field
    * @param mixed $value
    * @param bool $emptyAsSpace
    * @return void
    */
    
public function populateText($field$value$emptyAsSpace false) {
        if ((
$emptyAsSpace) && ($value == '')) {
            
$value '&nbsp;';
        }
        
$this->_smarty->assign($fieldhtmlentities(html_entity_decode($value)));    
    }
    
    
    
/**
    * Assigns a date value to the form template.  
    * 
    * The hidden field stores the date in a format suitable for writing to the
    * database, whilst the display field stores it in a format for displaying
    * to the user.  
    * 
    * @param string $hiddenField
    * @param string $displayField
    * @param string $date
    * @param boolean $incDate
    * @param boolean $incTime
    * @return void
    */
    
public function populateDate($hiddenField$displayField$date$incDate$incTime) {

        if (
$date == '') {
            
$hiddenDate '';
            if (
$incDate) {
                
$hiddenDate .= '0000-00-00';
            }
            if (
$incTime) {
                if (
$hiddenDate != '') {
                    
$hiddenDate .= ' ';
                }
                
$hiddenDate .= '00:00';
            }                        
            
$displayDate '';
        } else {
            
$hiddenFormat '';
            
$dateFormat Apeel_Framework_Model_Libraries_Data::getClientDateFormat();
            if ((
$incDate) && (!$incTime)) {
                
$hiddenFormat 'Y-m-d';
                
$displayDate date($dateFormat['form'],strtotime($date));
            } elseif ((
$incDate) && ($incTime)) {
                
$hiddenFormat 'Y-m-d h:i';
                
$displayDate date($dateFormat['form'] . ' h:i',strtotime($date));
            } elseif ((!
$incDate) && ($incTime)) {
                
$hiddenFormat 'h:i';
                
$displayDate date('h:i',strtotime($date));
            }
            
$hiddenDate date($hiddenFormat,strtotime($date));
        }
        
        
$this->_smarty->assign($hiddenField$hiddenDate);
        
$this->_smarty->assign($displayField$displayDate);
        
    }
    
    
    
/**
    * Assigns checked status to radio button contained in the form template by text value.  
    * 
    * @param string $field
    * @param mixed $value
    * @param array $options
    * @return void
    */
    
public function populateTextRadioButtons($field$value$options) {
        if (
$options) {
            foreach (
$options as $index => $optionValue) {
                if (
$value == $optionValue) {
                    
$this->_smarty->assign($field '_checked_' $index'checked="checked"');
                } else {
                    
$this->_smarty->assign($field '_checked_' $index'');
                }
            }        
        }       
    }
    
    
    
/**
    * Assigns checked status to radio button contained in the form template by option value.  
    * 
    * @param string $field
    * @param mixed $value
    * @param array $options
    * @return void
    */
    
public function populateIntRadioButtons($field$value$options) {
        if (
$options) {
            foreach (
$options as $index => $optionValue) {
                if (
$value == $index) {
                    
$this->_smarty->assign($field '_checked_' $index'checked="checked"');
                } else {
                    
$this->_smarty->assign($field '_checked_' $index'');
                }
            }        
        }       
    }    
    
    
    
/**
    * Assigns checked status to a checkbox in the form template.  
    * 
    * @param string $field
    * @param boolean $value
    * @return void
    */
    
public function populateCheckbox($field$value) {
        if (
$value) {
            
$this->_smarty->assign($field'checked="checked"');
        } else {
            
$this->_smarty->assign($field'');
        }        
    }
    
    
    
/**
    * Assigns checked value(s) to "Set" field in the form template.  
    * 
    * @param string $field
    * @param string $values
    * @param array $options
    * @return void
    */
    
public function populateSet($field$values$options) {        
        
$this->populateText($field$values);
        if (
$options) {
            foreach (
$options as $index => $value) {
                if (
strpos(',' $values ','',' $value ',') !== false) {
                    
$this->_smarty->assign($field '_checked_' $index'checked="checked"');
                } else {
                    
$this->_smarty->assign($field '_checked_' $index'');
                }
            }        
        }
    }     
    
    
    
/**
    * Populates dropdown options in a dropdown list in the form template.  
    * 
    * @param string $field
    * @param string $dataObjectName
    * @param string $version
    * @param mixed $value
    * @return void
    */
    
public function populateDropdown($field$dataObjectName$version$value) {
        
$this->_smarty->assign('APEEL_LANGUAGE_PLEASE_SELECT'APEEL_LANGUAGE_PLEASE_SELECT);
        
$this->_smarty->assign($fieldApeel_Framework_Model_Libraries_Data::getDataInDropdownFormat($dataObjectName$version$value));
    }
    
    
    
/**
    * Populates a fixed dropdownlist with the given options, and highlights the selected value.  
    * 
    * @param string $field
    * @param mixed $value
    * @param arrau $optionsAvailable
    * @return void
    */
    
public function populateFixedList($field$value$optionsAvailable) {
        
$options '';
        if (
$optionsAvailable) {
            foreach(
$optionsAvailable as $index => $description) {
                if (
$index == $value) {
                    
$selected ' SELECTED="SELECTED" ';
                } else {
                    
$selected '';
                }
                
$options .= '<option value="' $index '" ' $selected '>' $description "</option>";
            }
        }
        
$this->_smarty->assign($field '_options'$options);
    }    
    
    
    
/**
    * Assigns a formatted decimal value to the form template.  
    * 
    * @param string $field
    * @param float $value
    * @param integer $decimalPlaces
    * @return void
    */
    
public function populateDecimal($field$value$decimalPlaces) {
        
$this->_smarty->assign($fieldnumber_format($value$decimalPlaces));
    }
    
    
    
/**
    * Displays an image from the File System in the form template.  
    * 
    * @param string $field
    * @param string $filename
    * @return void
    */
    
public function populateFileSystemImage($field$filename) {
        if (
$filename != '') {
            
$this->_smarty->assign($field'<img src="' APEEL_BASE_URL_PATH_WITH_SCRIPT 'request/image?file=' $filename '&no_file=no_image.jpg&mode=4&width=300&height=300" class="formImage" /><br /><div class="fileName">' $filename '</div><div class="clear"></div>');
        } else {
            
$this->_smarty->assign($field'');
        }        
    }
    
    
    
/**
    * Displays an icon/link to a File, from the form template.  
    * 
    * @param string $field
    * @param string $filename
    * @return void
    */
    
public function populateFileSystemFile($field$filename) {
        if (
$filename != '') {
            
$this->_smarty->assign($field'<a href="' APEEL_BASE_URL_PATH_WITH_SCRIPT .'request/file?file=' $filename '"><img src="' APEEL_BASE_URL_PATH_WITH_SCRIPT 'request/icon?file=' $filename '" class="formIcon" /></a><br /><div class="fileName"><a href="' APEEL_BASE_URL_PATH_WITH_SCRIPT .'request/file?file=' $filename '" target="_blank">' $filename '</a></div><br /><div class="clear"></div>');
        } else {
            
$this->_smarty->assign($field'');
        }      
    }
    
    
    
/**
    * Displays an image from the Database in the form template.
    * 
    * $field refers to the form field to be populated.  
    * 
    * $fieldIndex is a numerical index to the database field to prevent
    * passing the actual field name around on the URL.  It can be 
    * looked up in the getBinaryObjectDefinitions(...) method of the 
    * main Data Object.  
    * 
    * @param string $field
    * @param integer $fieldIndex
    * @param integer $length
    * @param string $filename
    * @return void
    */
    
public function populateDatabaseImage($field$fieldIndex$length$filename) {
        if ((
$length 0) && ($filename != '')) {
            
$this->_smarty->assign($field'<img src="' APEEL_BASE_URL_PATH_WITH_SCRIPT 'request/image?file=' $filename '&data_object_hash=' $this->dataObjectHash '&field_index=' $fieldIndex '&primary_key=' $this->_primaryKeyValue '&no_file=no_image.jpg&mode=4&width=300&height=300" class="formImage" /><br /><div class="fileName">' $filename '</div><div class="clear"></div>');            
        } else {
            
$this->_smarty->assign($field'');
        }
    }
    
    
    
/**
    * Displays an icon/link to a File in the database, from the form template.  
    * 
    * $field refers to the form field to be populated.  
    * 
    * $fieldIndex is a numerical index to the database field to prevent
    * passing the actual field name around on the URL.  It can be 
    * looked up in the getBinaryObjectDefinitions(...) method of the 
    * main Data Object.  
    * 
    * @param string $field
    * @param integer $fieldIndex
    * @param integer $length
    * @param string $filename
    * @return void
    */
    
public function populateDatabaseFile($field$fieldIndex$length$filename) {
        if ((
$length 0) && ($filename != '')) {
            
$this->_smarty->assign($field'<a href="' APEEL_BASE_URL_PATH_WITH_SCRIPT .'request/file?file=' $filename '&data_object_hash=' $this->dataObjectHash '&field_index=' $fieldIndex '&primary_key=' $this->_primaryKeyValue '"><img src="' APEEL_BASE_URL_PATH_WITH_SCRIPT 'request/icon?file=' $filename '" class="formIcon" /></a><br /><div class="fileName"><a href="' APEEL_BASE_URL_PATH_WITH_SCRIPT .'request/file?file=' $filename '&data_object_hash=' $this->dataObjectHash '&field_index=' $fieldIndex '&primary_key=' $this->_primaryKeyValue '" target="_blank">' $filename '</a></div><br /><div class="clear"></div>');
        } else {
            
$this->_smarty->assign($field'');
        }
    }    
    
    
    
/**
    * Assigns value to CKEditor in the form template.  
    * 
    * @param string $field
    * @param string $editorField
    * @param string $value
    * @return void
    */
    
public function populateRichTextEditor($field$editorField$value) {
        
$ckEditor = new CKEditor();
        
$ckEditor->returnOutput true;
        
$ckEditor->basePath APEEL_CKEDITOR_PATH;
        
$ckEditor->config['width'] = '98%';
        
$ckEditor->config['height'] = '500';
        
$ckEditor->textareaAttributes = array("cols" => 80"rows" => 10);
        
$this->_smarty->assign($field$ckEditor->editor($editorField$value));
        unset(
$ckEditor);
    }    

    
    
/**
    * Populates AutoComplete version of Duallist
    * 
    * @param string $field
    * @param string $originalList
    * @param string $currentList
    * @param string $dataObjectName
    * @param string $version
    * @param string $value
    * @param Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters $filters
    * @return void
    */
    
public function populateDuallistAutoComplete(
        
$field,
        
$originalList,
        
$currentList
        
$dataObjectName
        
$version
        
$value
        
Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters &$filters NULL
    
) {
        
$this->_smarty->assign('APEEL_LANGUAGE_OPTIONS_AVAILABLE'APEEL_LANGUAGE_OPTIONS_AVAILABLE);
        
$this->_smarty->assign('APEEL_LANGUAGE_OPTIONS_SELECTED'APEEL_LANGUAGE_OPTIONS_SELECTED);
        
$this->_smarty->assign('APEEL_LANGUAGE_PLEASE_ENTER_TEXT'APEEL_LANGUAGE_PLEASE_ENTER_TEXT);
        
$values Apeel_Framework_Model_Libraries_Data::getDataInDropdownFormat($dataObjectName$version$value$filterstrue);
        
$this->_smarty->assign($field$values['options']);
        
$this->_smarty->assign($originalList$values['list']);
        
$this->_smarty->assign($currentList$values['list']);
    }
    
    
    
/**
    * Populates ListAll version of Duallist
    * 
    * @param string $field
    * @param string $originalList
    * @param string $currentList
    * @param string $dataObjectName
    * @param string $version
    * @param string $value
    * @param Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters $filters
    * @param string $dataObjectAvailable
    * @param string $filterFieldAvailable
    * @return void
    */
    
public function populateDuallistListAll(
        
$field,
        
$originalList,
        
$currentList
        
$dataObjectName
        
$version
        
$value
        
Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters &$filters,
        
$dataObjectAvailable,
        
$filterFieldAvailable
    
) {
        
$this->_smarty->assign('APEEL_LANGUAGE_OPTIONS_AVAILABLE'APEEL_LANGUAGE_OPTIONS_AVAILABLE);
        
$this->_smarty->assign('APEEL_LANGUAGE_OPTIONS_SELECTED'APEEL_LANGUAGE_OPTIONS_SELECTED);
        
$values Apeel_Framework_Model_Libraries_Data::getDataInDropdownFormat($dataObjectName$version$value$filterstrue);
        
$this->_smarty->assign($field$values['options']);
        
$this->_smarty->assign($originalList$values['list']);
        
$this->_smarty->assign($currentList$values['list']);
        
        
// Populate List of Available Options
        
$filters_available = new Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters('desc''NOT-IN'$values['list'], $filterFieldAvailable);
        
$values Apeel_Framework_Model_Libraries_Data::getDataInDropdownFormat($dataObjectAvailable'Dropdown'$value$filters_availabletrue);
        
$this->_smarty->assign($field '_options'$values['options']);
    }
    

    
/**
    * Tells Smarty to output the populated template form.  
    * 
    * The form name should be named after the underlying data object it is connected to, with a 
    * .tpl.html extension.  It should be located in /Application/View/Templates/Forms
    * 
    * @return void
    */
    
public function outputForm() {
        
$this->_smarty->display(APEEL_FORMS_TEMPLATE_PATH $this->dataObjectName '.tpl.html'); 
    }    
    
    
    
/**
    * Returns the javascript which should be applied to all forms.  
    * 
    * @param string $uniqueIndex
    * @param string $returnId
    * @param string $returnDisplay
    * @return string
    */
    
public function getJsGeneral($uniqueIndex$returnId$returnDisplay) {
        return 
'
            var options = { 
                success:   function(responseText, statusText, xhr, form) { saveResult(responseText, statusText, xhr, form, "' 
$uniqueIndex '", "' $returnId '", "' $returnDisplay '") },  
                timeout:   10000,
                error:     function(responseText, statusText, xhr, form) {alert("' 
APEEL_MSG_ERROR_SAVING_DATA '")}
            };       
            $("#frmUpdate_' 
$this->dataObjectHash '").ajaxForm(options);             
        '
;
    }
    
    
    
/**
    * Returns the javascript required to wire-up a text field as a 
    * JQuery UI Autocomplete field.  
    * 
    * $matching can be 'BEGINS' or 'CONTAINS'
    * 
    * @param string $field
    * @param string $hiddenField
    * @param string $lookupdataObjectHash
    * @param integer $matching
    * @param integer $minLength
    * @return string
    */
    
public function getJsAutoComplete($field$hiddenField$lookupdataObjectHash$matchingMethod$minLength) {
        return 
'
            $("#' 
$field '").autocomplete({
                source: "' 
APEEL_BASE_URL_PATH_WITH_SCRIPT .'request/autocomplete?dataObject=' $lookupdataObjectHash '&matchingMethod=' $matchingMethod '",
                minLength: ' 
$minLength ',                                                 
                select: function(event, ui) {
                    $("#' 
$hiddenField '").val(ui.item.id);
                }
            })
        '
;
    }
    
    
    
/**
    * Returns the javascript required to wire-up a text field as a 
    * JQuery Datepicker field.  
    * 
    * @param string $hiddenField
    * @param string $displayField
    * @param string $format
    * @return string
    */
    
public function getJsDatepicker($hiddenField$displayField$format 'd MM yy') {
        return 
'
            $("#' 
$displayField '").datepicker({
                changeMonth: true,
                changeYear: true,
                yearRange: "-100:+100",
                dateFormat: "' 
$format '",
                onClose: function(date, inst) {
                    $("#' 
$hiddenField '").val(inst.selectedYear + "-" + (parseInt(inst.selectedMonth) + 1) + "-" + (parseInt(inst.selectedDay)));
                }        
            });
        '
;
    }
    
    
    
/**
    * Returns the javascript required to wire-up a text field as a 
    * JQuery Datepicker field.  
    * 
    * @param string $hiddenField
    * @param string $displayField
    * @param string $format
    * @return string
    */
    
public function getJsDateTimepicker($hiddenField$displayField$format 'd MM yy') {
        return 
'
            $("#' 
$displayField '").datetimepicker({
                changeMonth: true,
                changeYear: true,
                yearRange: "-100:+100",
                dateFormat: "' 
$format '",
                onClose: function(date, inst) {
                    $("#' 
$hiddenField '").val(inst.selectedYear + "-" + (parseInt(inst.selectedMonth) + 1) + "-" + (parseInt(inst.selectedDay)) + " " + date.substring(date.length -5, date.length)  );
                }        
            });
        '
;
    }    
    
    
    
/**
    * Returns the javascript required to wire-up a text field as a 
    * JQuery Datepicker field.  
    * 
    * @param string $hiddenField
    * @param string $displayField
    * @param string $format
    * @return string
    */
    
public function getJsTimepicker($hiddenField$displayField) {
        return 
'
            $("#' 
$displayField '").timepicker({
                onClose: function(date, inst) {
                    $("#' 
$hiddenField '").val(date.substring(date.length -5, date.length));
                }        
            });
        '
;
    }    
    
    
    
/**
    * Returns the javascript required to bring up a pop-up grid to select a 
    * value.  
    * 
    * $displayColumn is an index used to identify the field from the 
    * Data Object's getEditors(...) method.  
    * 
    * @param string $field
    * @param string $dialog
    * @param string $lookupDataObject
    * @param integer $level
    * @param integer $displayColumn
    * @param string $returnIdField
    * @param string $returnDisplayField
    * @return string
    */
    
public function getJsSearchForm($field$dialog$lookupDataObject$level$displayColumn$returnIdField$returnDisplayField) {
        return 
'
                $("#' 
$dialog '").load("' APEEL_BASE_URL_PATH_WITH_SCRIPT 'request/search_form?dataObject=' $lookupDataObject '&index=' $level '&displayColumn=' $displayColumn '&returnId=' $returnIdField '&returnDisplay=' $returnDisplayField '",
                    function(){
                        $("#' 
$dialog '").dialog({
                            autoOpen: false,
                            height: "auto",
                            width: "auto",
                            modal: true,
                            buttons: {
                                "' 
APEEL_BUTTON_CANCEL '": function() {                    
                                    $(this).dialog("close");
                                }
                            },
                            close: function() {
                            }
                        });            
                    }
            )
            
            $("#' 
$field '").click(function() { $.scrollTo(100, 0);$("#' $dialog '").dialog("open"); });
        '
;        
    }
    
    
    
/**
    * Returns the javascript required to wire-up a many-to-many duallist with
    * available options on the left, and selected options on the right.  
    * 
    * @param string $field
    * @param string $listAvailable
    * @param string $listSelected
    * @param string $commaList
    * @param string $btnAdd
    * @param string $btnRemove
    * @param string $autoField
    * @param string $lookupdataObjectHash
    * @param integer $matching
    * @param boolean $autoComplete
    * @return string
    */
    
public function getJsDuallistAuto($field$listAvailable$listSelected$commaList$btnAdd$btnRemove$autoField$lookupdataObjectHash$matchingMethod$autoComplete) {
        
$script '';
        if (
$autoComplete) {
            
$script '
                 $("#' 
$autoField '")
                    .keyup(function () { $("#' 
$listAvailable '").find("option").remove();  })
                    .autocomplete({
                        source: "' 
APEEL_BASE_URL_PATH_WITH_SCRIPT .'request/autocomplete?dataObject=' $lookupdataObjectHash '&matchingMethod=' $matchingMethod '",
                    }).data( "autocomplete" )._renderItem = function( ul, item ) {
                        addToAvailableList("' 
$listSelected '", "' $listAvailable '", item);
                        return false;
                    };             
            '
;            
        }
        
        
$script .= '
            $("#' 
$btnAdd '").click(function() { moveBetweenLists("' $listAvailable '", "' $listSelected '", false);refreshCommaList("' $listSelected '", "' $commaList '"); });
            $("#' 
$btnRemove '").click(function() { moveBetweenLists("' $listSelected '", "' $listAvailable '", false);refreshCommaList("' $listSelected '", "' $commaList '"); });
            $("#' 
$listAvailable '").dblclick(function() { moveBetweenLists("' $listAvailable '", "' $listSelected '", false);refreshCommaList("' $listSelected '", "' $commaList '"); });
            $("#' 
$listSelected '").dblclick(function() { moveBetweenLists("' $listSelected '", "' $listAvailable '", false);refreshCommaList("' $listSelected '", "' $commaList '"); });
            
        '
;
        
        return 
$script;
    }
    
    
    
/**
    * Returns the javascript to restrict a textbox to numeric input.  
    * 
    * @param string $field
    * @param integer $decimalPlaces
    * @return string
    */
    
public function getJsNumeric($field$decimalPlaces) {
        return 
'
            $("#' 
$field '").keypress(function(event) { var obj = this; checknumeric(event, obj, ' $decimalPlaces '); });           
        '
;
    }
    
    
    
/**
    * Returns the javascript to make an object resizable.  
    * 
    * @param string $field
    * @return string
    */
    
public function getJsResize($field) {
        return 
'
            $("#' 
$field '").resizable({ handles: "se" });
        '
;            
    }    
    
    
    
/**
    * Returns the javascript to ensure a field contains a value before saving.  
    * 
    * @param string $field
    * @param string $message
    * @return string
    */
    
public function getJsRequired($field$message APEEL_VALIDATION_FIELD_REQUIRED) {
        return 
'
            $("#' 
$field '").rules("add", { 
                required: true,
                messages: {
                    required: "' 
$message '"
                }
            });
        '
;
    }
    
    
/**
    * Returns the javascript to ensure a password field is set and confirmation matches before saving.  
    * 
    * @param string $field
    * @param string $messageRequired
    * @param string $messageMatch
    * @return string
    */    
    
public function getJsPassword($field$messageRequired APEEL_VALIDATION_PASSWORD_IS_REQUIRED$messageMatch APEEL_VALIDATION_PASSWORDS_MUST_MATCH) {
        return 
'
            $("#' 
$field '").rules("add", {
                required: true, 
                messages: {
                    required: "' 
$messageRequired '"
                }
            });

            $("#' 
$field '_confirm").rules("add", {
                equalTo: "#' 
$field '", 
                messages: {
                    equalTo: "' 
$messageMatch '"
                }
            });
        '
;
    }
    
    
    
/**
    * Returns javascript to ensure that a field's length is a minimum of the 
    * specified length.  
    * 
    * @param string $field
    * @param integer $minLength
    * @param string $message
    * @return string
    */
    
public function getJsMinimumLengthRequired($field$minLength$message APEEL_VALIDATION_MIN_LENGTH) {
        return 
'
            $("#' 
$field '").rules("add", { 
                required: true,
                minlength: ' 
$minLength ',
                messages: {
                    required: "' 
sprintf($message$minLength)  . '",
                    minlength: "' 
sprintf($message$minLength) . '"
                }
            });
        '
;
    }
    
    
    
/**
    * Validate that a field value meets a mimumum required length.  
    * 
    * @param string $value
    * @param string $fieldDescription
    * @param integer $minLength
    * @param boolean $notValid
    * @param string $message
    * @return void
    */
    
public function validateMinimumLength($value$fieldDescription$minLength, &$notValid, &$message) {
        if (
strlen($value) < $minLength) {
            
$message[] = $fieldDescription ' ' APEEL_VALIDATION_TOO_SHORT ' ' $minLength ' ' APEEL_VALIDATION_CHARACTERS;
            
$notValid ++;
        }
    }
    
    
    
/**
    * Validate that a required field is populated.  
    * 
    * @param string $value
    * @param string $fieldDescription
    * @param boolean $notValid
    * @param string $message
    * @return void
    */
    
public function validateRequired($value$fieldDescription, &$notValid, &$message) {
        if (
$value == '') {
            
$message[] = $fieldDescription ' ' APEEL_VALIDATION_IS_REQUIRED;
            
$notValid ++;
        }
    }
    
    
    
/**
    * Validate that a password field is populated and matches confirmation value.  
    * 
    * @param string $value
    * @param string $confirmValue
    * @param string $fieldDescription
    * @param boolean $notValid
    * @param string $message
    * @return void
    */
    
public function validatePassword($value$confirmValue$fieldDescription, &$notValid, &$message) {
        if (
$value == '') {
            
$message[] = $fieldDescription ' ' APEEL_VALIDATION_IS_REQUIRED;
            
$notValid ++;
        } else if (
$value != $confirmValue) {
            
$message[] = $fieldDescription ' ' APEEL_VALIDATION_NO_MATCH;
            
$notValid ++;        
        }
    }
    
    
    
/**
    * Validate data and save changes to the database.  
    * 
    * @param array $data
    * @param string $mode
    * @return void
    */
    
protected function saveData($data$mode) {
        if (
APEEL_DEMO_MODE == '1') {
            
$validity['isValid'] = '1';
            
$validity['id'] = '0';
            
$validity['display'] = '';
            
$this->sendResponse($validityNULL);
        } else {
            
// Server Validate
            
$validity $this->validateData($data);
            
$values null;
            if (
$validity['isValid']) {
                if (
$mode == 'insert') {
                    
$dataObject Apeel_Framework_Model_Libraries_Data::addRecord($this->dataObjectName$data);
                } else {                                             
                    
$primaryKeyValue =  Apeel_Framework_Controller_Libraries_Input::request('pk_' $this->dataObjectHash);
                    
$filters = new Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters('[PRIMARYKEY]''='stripslashes($primaryKeyValue));
                    
$dataObject Apeel_Framework_Model_Libraries_Data::editRecords($this->dataObjectName$data$filters); 
                }
                
$values $this->getIdAndDisplayValues($dataObject$mode$data);
                
$this->saveAdditionalData($values['id'], $mode);
                
$this->saveBinaryUploads($values['id']);
            }
            
$this->sendResponse($validity$values);
        }
    }
    
    
    
/**
    * Saves data in data objects other than the primary one for this form.  
    * 
    * Used for example in many-to-many duallists.  Generally called by 
    * concrete instances of saveAdditionalData(...) method.   
    * 
    * @param string $dataObjectName
    * @param array $existing
    * @param array $current
    * @param string $mode
    * @param string $remoteObjectLink
    * @param string $linkField
    * @param string $linkValue
    * @return void
    */
    
public function saveRemoteData(
        
$dataObjectName
        
$existing,
        
$current
        
$mode
        
$remoteObjectLink
        
$linkField
        
$linkValue
    
) {        
        if (
APEEL_DEMO_MODE == '1') {
            return 
false;
        } else {        
            if (
$current != '') {
                
$current explode(','$current);
            } else {
                
$current =  array();
            }
            if (
$existing != '') {
                
$existing explode(','$existing);
            } else {
                
$existing = array();
            }        
            
            if (
$mode == 'edit') {
                
// Find out which items have changed
                
$removed Apeel_Framework_Model_Libraries_Data::getArrayDifferences($existing$current);
                
$added Apeel_Framework_Model_Libraries_Data::getArrayDifferences($current$existing);
                if (
$added != '') {
                    
$added explode(','$added);    
                } else {
                    
$added NULL;
                }
                
            } else {
                
$removed NULL;
                
$added $current;
            }
            
            if (
$added) {            
                
$data[$linkField] = $linkValue;
                
                foreach(
$added as $item) {
                    
$data[$remoteObjectLink] = $item;
                    
Apeel_Framework_Model_Libraries_Data::addRecord($dataObjectName$data);
                }
            }
            
            if (
$removed) {
                
$filters = new Apeel_Framework_Model_DataObjects_Parameters_Collections_Filters($linkField'='$linkValue);
                
$filters->addFilter($remoteObjectLink'IN'$removed);
                
Apeel_Framework_Model_Libraries_Data::deleteRecordsByObjectName($dataObjectName$filters);
            }
        }
    }
    
    
    
/**
    * Send a formatted Successs/Failed response to the ajax callback function
    * that called the save event.  
    * 
    * @param array $validity
    * @param array $values
    * @return void
    */
    
public function sendResponse($validity$values) {
        if (
$validity['isValid']) {
            echo 
"\r\n";
            echo 
"ID: " $values['id'];
            echo 
"\r\n";
            echo 
"DISPLAY: " $values['display'];
            echo 
"\r\n";
            echo 
"RESULT: [SUCCESS]\r\n";
        } else {
            echo 
"\r\n";
            echo 
"\r\n";
            echo 
"RESULT: [FAILED]\r\n";
            echo 
implode("\r\n"$validity['errors']);
            echo 
"\r\n==========\r\n";
        }
    }
}

?>

PHP Demo Source Code Index