1174 lines
35 KiB
PHP
1174 lines
35 KiB
PHP
|
<?php
|
||
|
|
||
|
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||
|
|
||
|
/**
|
||
|
* DB_Table_QuickForm creates HTML_QuickForm objects from DB_Table properties.
|
||
|
*
|
||
|
* PHP versions 4 and 5
|
||
|
*
|
||
|
* LICENSE:
|
||
|
*
|
||
|
* Copyright (c) 1997-2007, Paul M. Jones <pmjones@php.net>
|
||
|
* David C. Morse <morse@php.net>
|
||
|
* Mark Wiesemann <wiesemann@php.net>
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions
|
||
|
* are met:
|
||
|
*
|
||
|
* * Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
* * Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in the
|
||
|
* documentation and/or other materials provided with the distribution.
|
||
|
* * The names of the authors may not be used to endorse or promote products
|
||
|
* derived from this software without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
* @category Database
|
||
|
* @package DB_Table
|
||
|
* @author Paul M. Jones <pmjones@php.net>
|
||
|
* @author David C. Morse <morse@php.net>
|
||
|
* @author Mark Wiesemann <wiesemann@php.net>
|
||
|
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||
|
* @version CVS: $Id: QuickForm.php,v 1.45 2008/03/28 20:00:38 wiesemann Exp $
|
||
|
* @link http://pear.php.net/package/DB_Table
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Needed to build forms.
|
||
|
*/
|
||
|
require_once 'HTML/QuickForm.php';
|
||
|
|
||
|
/**
|
||
|
* US-English messages for some QuickForm rules. Moritz Heidkamp
|
||
|
* suggested this approach for easier i18n.
|
||
|
*/
|
||
|
if (! isset($GLOBALS['_DB_TABLE']['qf_rules'])) {
|
||
|
$GLOBALS['_DB_TABLE']['qf_rules'] = array(
|
||
|
'required' => 'The item %s is required.',
|
||
|
'numeric' => 'The item %s must be numbers only.',
|
||
|
'maxlength' => 'The item %s can have no more than %d characters.'
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* If you want to use an extended HTML_QuickForm object, you can specify the
|
||
|
* class name in $_DB_TABLE['qf_class_name'].
|
||
|
* ATTENTION: You have to include the class file yourself, DB_Table does
|
||
|
* not take care of this!
|
||
|
*/
|
||
|
if (!isset($GLOBALS['_DB_TABLE']['qf_class_name'])) {
|
||
|
$GLOBALS['_DB_TABLE']['qf_class_name'] = 'HTML_QuickForm';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* DB_Table_QuickForm creates HTML_QuickForm objects from DB_Table properties.
|
||
|
*
|
||
|
* DB_Table_QuickForm provides HTML form creation facilities based on
|
||
|
* DB_Table column definitions transformed into HTML_QuickForm elements.
|
||
|
*
|
||
|
* @category Database
|
||
|
* @package DB_Table
|
||
|
* @author Paul M. Jones <pmjones@php.net>
|
||
|
* @author David C. Morse <morse@php.net>
|
||
|
* @author Mark Wiesemann <wiesemann@php.net>
|
||
|
* @version Release: 1.5.6
|
||
|
* @link http://pear.php.net/package/DB_Table
|
||
|
*/
|
||
|
|
||
|
class DB_Table_QuickForm {
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Build a form based on DB_Table column definitions.
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param array $cols A sequential array of DB_Table column definitions
|
||
|
* from which to create form elements.
|
||
|
*
|
||
|
* @param string $arrayName By default, the form will use the names
|
||
|
* of the columns as the names of the form elements. If you pass
|
||
|
* $arrayName, the column names will become keys in an array named
|
||
|
* for this parameter.
|
||
|
*
|
||
|
* @param array $args An associative array of optional arguments to
|
||
|
* pass to the QuickForm object. The keys are...
|
||
|
*
|
||
|
* 'formName' : String, name of the form; defaults to the name of the
|
||
|
* table.
|
||
|
*
|
||
|
* 'method' : String, form method; defaults to 'post'.
|
||
|
*
|
||
|
* 'action' : String, form action; defaults to
|
||
|
* $_SERVER['REQUEST_URI'].
|
||
|
*
|
||
|
* 'target' : String, form target target; defaults to '_self'
|
||
|
*
|
||
|
* 'attributes' : Associative array, extra attributes for <form>
|
||
|
* tag; the key is the attribute name and the value is attribute
|
||
|
* value.
|
||
|
*
|
||
|
* 'trackSubmit' : Boolean, whether to track if the form was
|
||
|
* submitted by adding a special hidden field
|
||
|
*
|
||
|
* @param string $clientValidate By default, validation will match
|
||
|
* the 'qf_client' value from the column definition. However,
|
||
|
* if you set $clientValidate to true or false, this will
|
||
|
* override the value from the column definition.
|
||
|
*
|
||
|
* @param array $formFilters An array with filter function names or
|
||
|
* callbacks that will be applied to all form elements.
|
||
|
*
|
||
|
* @return object HTML_QuickForm
|
||
|
*
|
||
|
* @see HTML_QuickForm
|
||
|
*
|
||
|
* @see DB_Table_QuickForm::createForm()
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function &getForm($cols, $arrayName = null, $args = array(),
|
||
|
$clientValidate = null, $formFilters = null)
|
||
|
{
|
||
|
$form = DB_Table_QuickForm::createForm($args);
|
||
|
DB_Table_QuickForm::addElements($form, $cols, $arrayName);
|
||
|
DB_Table_QuickForm::addRules($form, $cols, $arrayName, $clientValidate);
|
||
|
DB_Table_QuickForm::addFilters($form, $cols, $arrayName, $formFilters);
|
||
|
|
||
|
return $form;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Creates an empty form object.
|
||
|
*
|
||
|
* In case you want more control over your form, you can call this function
|
||
|
* to create it, then add whatever elements you want.
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @author Ian Eure <ieure@php.net>
|
||
|
*
|
||
|
* @param array $args An associative array of optional arguments to
|
||
|
* pass to the QuickForm object. The keys are...
|
||
|
*
|
||
|
* 'formName' : String, name of the form; defaults to the name of the
|
||
|
* table.
|
||
|
*
|
||
|
* 'method' : String, form method; defaults to 'post'.
|
||
|
*
|
||
|
* 'action' : String, form action; defaults to
|
||
|
* $_SERVER['REQUEST_URI'].
|
||
|
*
|
||
|
* 'target' : String, form target target; defaults to '_self'
|
||
|
*
|
||
|
* 'attributes' : Associative array, extra attributes for <form>
|
||
|
* tag; the key is the attribute name and the value is attribute
|
||
|
* value.
|
||
|
*
|
||
|
* 'trackSubmit' : Boolean, whether to track if the form was
|
||
|
* submitted by adding a special hidden field
|
||
|
*
|
||
|
* @return object HTML_QuickForm
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function &createForm($args = array())
|
||
|
{
|
||
|
if (isset($args['formName'])) {
|
||
|
$formName = $args['formName'];
|
||
|
} elseif (isset($this)) {
|
||
|
$formName = $this->table;
|
||
|
} else {
|
||
|
$formName = '_db_table_form_';
|
||
|
}
|
||
|
|
||
|
$method = isset($args['method'])
|
||
|
? $args['method'] : 'post';
|
||
|
|
||
|
$action = isset($args['action'])
|
||
|
? $args['action'] : $_SERVER['REQUEST_URI'];
|
||
|
|
||
|
$target = isset($args['target'])
|
||
|
? $args['target'] : '_self';
|
||
|
|
||
|
$attributes = isset($args['attributes'])
|
||
|
? $args['attributes'] : null;
|
||
|
|
||
|
$trackSubmit = isset($args['trackSubmit'])
|
||
|
? $args['trackSubmit'] : false;
|
||
|
|
||
|
$form = new $GLOBALS['_DB_TABLE']['qf_class_name']($formName, $method,
|
||
|
$action, $target, $attributes, $trackSubmit);
|
||
|
|
||
|
return $form;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Adds DB_Table columns to a pre-existing HTML_QuickForm object.
|
||
|
*
|
||
|
* @author Ian Eure <ieure@php.net>
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param object &$form An HTML_QuickForm object.
|
||
|
*
|
||
|
* @param array $cols A sequential array of DB_Table column definitions
|
||
|
* from which to create form elements.
|
||
|
*
|
||
|
* @param string $arrayName By default, the form will use the names
|
||
|
* of the columns as the names of the form elements. If you pass
|
||
|
* $arrayName, the column names will become keys in an array named
|
||
|
* for this parameter.
|
||
|
*
|
||
|
* @return void
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function addElements(&$form, $cols, $arrayName = null)
|
||
|
{
|
||
|
$elements = DB_Table_QuickForm::getElements($cols, $arrayName);
|
||
|
$cols_keys = array_keys($cols);
|
||
|
foreach (array_keys($elements) as $k) {
|
||
|
|
||
|
$element =& $elements[$k];
|
||
|
|
||
|
// are we adding a group?
|
||
|
if (is_array($element)) {
|
||
|
|
||
|
// get the label for the group. have to do it this way
|
||
|
// because the group of elements does not itself have a
|
||
|
// label, there are only the labels for the individual
|
||
|
// elements.
|
||
|
$tmp = $cols[$cols_keys[$k]];
|
||
|
if (! isset($tmp['qf_label'])) {
|
||
|
$label = $cols_keys[$k];
|
||
|
if ($arrayName) {
|
||
|
$label = $arrayName . "[$label]";
|
||
|
}
|
||
|
} else {
|
||
|
$label = $tmp['qf_label'];
|
||
|
}
|
||
|
|
||
|
// set the element name
|
||
|
if ($arrayName) {
|
||
|
$name = $arrayName . '[' . $cols_keys[$k] . ']';
|
||
|
} else {
|
||
|
$name = $cols_keys[$k];
|
||
|
}
|
||
|
|
||
|
// fix the column definition temporarily to get the separator
|
||
|
// for the group
|
||
|
$col = $cols[$cols_keys[$k]];
|
||
|
DB_Table_QuickForm::fixColDef($col, $name);
|
||
|
|
||
|
// done
|
||
|
$group =& $form->addGroup($element, $name, $label,
|
||
|
$col['qf_groupsep']);
|
||
|
|
||
|
// set default value (if given) for radio elements
|
||
|
// (reason: QF "resets" the checked state, when adding a group)
|
||
|
if ($tmp['qf_type'] == 'radio' && isset($tmp['qf_setvalue'])) {
|
||
|
$form->setDefaults(array($name => $tmp['qf_setvalue']));
|
||
|
}
|
||
|
|
||
|
} elseif (is_object($element)) {
|
||
|
$form->addElement($element);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Gets controls for a list of columns
|
||
|
*
|
||
|
* @author Ian Eure <ieure@php.net>
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param object &$form An HTML_QuickForm object.
|
||
|
*
|
||
|
* @param array $cols A sequential array of DB_Table column definitions
|
||
|
* from which to create form elements.
|
||
|
*
|
||
|
* @param string $arrayName By default, the form will use the names
|
||
|
* of the columns as the names of the form elements. If you pass
|
||
|
* $arrayName, the column names will become keys in an array named
|
||
|
* for this parameter.
|
||
|
*
|
||
|
* @return array Form elements
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function &getElements($cols, $arrayName = null)
|
||
|
{
|
||
|
$elements = array();
|
||
|
|
||
|
foreach ($cols as $name => $col) {
|
||
|
|
||
|
if ($arrayName) {
|
||
|
$elemname = $arrayName . "[$name]";
|
||
|
} else {
|
||
|
$elemname = $name;
|
||
|
}
|
||
|
|
||
|
DB_Table_QuickForm::fixColDef($col, $elemname);
|
||
|
|
||
|
$elements[] = DB_Table_QuickForm::getElement($col, $elemname);
|
||
|
}
|
||
|
|
||
|
return $elements;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Build a single QuickForm element based on a DB_Table column.
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param array $col A DB_Table column definition.
|
||
|
*
|
||
|
* @param string $elemname The name to use for the generated QuickForm
|
||
|
* element.
|
||
|
*
|
||
|
* @return object HTML_QuickForm_Element
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function &getElement($col, $elemname)
|
||
|
{
|
||
|
if (isset($col['qf_setvalue'])) {
|
||
|
$setval = $col['qf_setvalue'];
|
||
|
}
|
||
|
|
||
|
switch ($col['qf_type']) {
|
||
|
|
||
|
case 'advcheckbox':
|
||
|
case 'checkbox':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
'advcheckbox',
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
isset($col['qf_label_append']) ?
|
||
|
$col['qf_label_append'] : null,
|
||
|
$col['qf_attrs'],
|
||
|
$col['qf_vals']
|
||
|
);
|
||
|
|
||
|
// WARNING: advcheckbox elements in HTML_QuickForm v3.2.2
|
||
|
// and earlier do not honor setChecked(); they will always
|
||
|
// be un-checked, unless a POST value sets them. Upgrade
|
||
|
// to QF 3.2.3 or later.
|
||
|
if (isset($setval) && $setval == true) {
|
||
|
$element->setChecked(true);
|
||
|
} else {
|
||
|
$element->setChecked(false);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'autocomplete':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_vals'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'date':
|
||
|
|
||
|
if (! isset($col['qf_opts']['format'])) {
|
||
|
$col['qf_opts']['format'] = 'Y-m-d';
|
||
|
}
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
'date',
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_opts'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'time':
|
||
|
|
||
|
if (! isset($col['qf_opts']['format'])) {
|
||
|
$col['qf_opts']['format'] = 'H:i:s';
|
||
|
}
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
'date',
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_opts'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'timestamp':
|
||
|
|
||
|
if (! isset($col['qf_opts']['format'])) {
|
||
|
$col['qf_opts']['format'] = 'Y-m-d H:i:s';
|
||
|
}
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
'date',
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_opts'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'hidden':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
null,
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
|
||
|
case 'radio':
|
||
|
|
||
|
$element = array();
|
||
|
|
||
|
foreach ((array) $col['qf_vals'] as $btnvalue => $btnlabel) {
|
||
|
|
||
|
$element[] =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
null, // elemname not added because this is a group
|
||
|
null,
|
||
|
$btnlabel,
|
||
|
$btnvalue,
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'select':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_vals'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setSelected($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'password':
|
||
|
case 'text':
|
||
|
case 'textarea':
|
||
|
|
||
|
if (! isset($col['qf_attrs']['maxlength']) &&
|
||
|
isset($col['size'])) {
|
||
|
$col['qf_attrs']['maxlength'] = $col['size'];
|
||
|
}
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'static':
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
(isset($setval) ? $setval : '')
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case 'hierselect':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_attrs'],
|
||
|
$col['qf_groupsep']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'jscalendar':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_opts'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'header':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'static':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'link':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_href'], // link href
|
||
|
$setval, // link text
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'reset':
|
||
|
case 'submit':
|
||
|
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
null,
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 'callback': // custom QF elements that need more than
|
||
|
// the standard parameters
|
||
|
// code from Arne Bippes <arne.bippes@brandao.de>
|
||
|
|
||
|
if (is_callable(array($col['qf_callback'], 'createElement'))) {
|
||
|
// Does an object with name from $col['qf_callback'] and
|
||
|
// a method with name 'createElement' exist?
|
||
|
$ret_value = call_user_func_array(
|
||
|
array($col['qf_callback'], 'createElement'),
|
||
|
array(&$element, &$col, &$elemname, &$setval));
|
||
|
}
|
||
|
elseif (is_callable($col['qf_callback'])) {
|
||
|
// Does a method with name from $col['qf_callback'] exist?
|
||
|
$ret_value = call_user_func_array(
|
||
|
$col['qf_callback'],
|
||
|
array(&$element, &$col, &$elemname, &$setval));
|
||
|
}
|
||
|
if ($ret_value) {
|
||
|
break;
|
||
|
}
|
||
|
// fall into default block of switch statement:
|
||
|
// - if $col['qf_callback'] is ...
|
||
|
// - not a valid object
|
||
|
// - a valid object, but a method 'createElement' doesn't exist
|
||
|
// - not a valid method name
|
||
|
// - if an error occured in 'createElement' or in the method
|
||
|
|
||
|
default:
|
||
|
|
||
|
/**
|
||
|
* @author Moritz Heidkamp <moritz.heidkamp@invision-team.de>
|
||
|
*/
|
||
|
|
||
|
// not a recognized type. is it registered with QuickForm?
|
||
|
if (HTML_QuickForm::isTypeRegistered($col['qf_type'])) {
|
||
|
|
||
|
// yes, create it with some minimalist parameters
|
||
|
$element =& HTML_QuickForm::createElement(
|
||
|
$col['qf_type'],
|
||
|
$elemname,
|
||
|
$col['qf_label'],
|
||
|
$col['qf_attrs']
|
||
|
);
|
||
|
|
||
|
// set its default value, if there is one
|
||
|
if (isset($setval)) {
|
||
|
$element->setValue($setval);
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
// element type is not registered with QuickForm.
|
||
|
$element = null;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
return $element;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Build an array of form elements based from DB_Table columns.
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param array $cols A sequential array of DB_Table column
|
||
|
* definitions from which to create form elements.
|
||
|
*
|
||
|
* @param string $arrayName By default, the form will use the names
|
||
|
* of the columns as the names of the form elements. If you pass
|
||
|
* $arrayName, the column names will become keys in an array named
|
||
|
* for this parameter.
|
||
|
*
|
||
|
* @return array An array of HTML_QuickForm_Element objects.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function &getGroup($cols, $arrayName = null)
|
||
|
{
|
||
|
$group = array();
|
||
|
|
||
|
foreach ($cols as $name => $col) {
|
||
|
|
||
|
if ($arrayName) {
|
||
|
$elemname = $arrayName . "[$name]";
|
||
|
} else {
|
||
|
$elemname = $name;
|
||
|
}
|
||
|
|
||
|
DB_Table_QuickForm::fixColDef($col, $elemname);
|
||
|
|
||
|
$group[] = DB_Table_QuickForm::getElement($col, $elemname);
|
||
|
}
|
||
|
|
||
|
return $group;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Adds static form elements like 'header', 'static', 'submit' or 'reset' to
|
||
|
* a pre-existing HTML_QuickForm object.
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param object &$form An HTML_QuickForm object.
|
||
|
*
|
||
|
* @param array $elements A sequential array of form element definitions.
|
||
|
*
|
||
|
* @return void
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function addStaticElements(&$form, $elements)
|
||
|
{
|
||
|
foreach ($elements as $name => $elemDef) {
|
||
|
|
||
|
DB_Table_QuickForm::fixColDef($elemDef, $name);
|
||
|
|
||
|
$element = DB_Table_QuickForm::getElement($elemDef, $name);
|
||
|
|
||
|
if (!is_object($element)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (isset($elemDef['before']) && !empty($elemDef['before'])) {
|
||
|
$form->insertElementBefore($element, $elemDef['before']);
|
||
|
} else {
|
||
|
$form->addElement($element);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Adds DB_Table filters to a pre-existing HTML_QuickForm object.
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param object &$form An HTML_QuickForm object.
|
||
|
*
|
||
|
* @param array $cols A sequential array of DB_Table column definitions
|
||
|
* from which to create form elements.
|
||
|
*
|
||
|
* @param string $arrayName By default, the form will use the names
|
||
|
* of the columns as the names of the form elements. If you pass
|
||
|
* $arrayName, the column names will become keys in an array named
|
||
|
* for this parameter.
|
||
|
*
|
||
|
* @param array $formFilters An array with filter function names or
|
||
|
* callbacks that will be applied to all form elements.
|
||
|
*
|
||
|
* @return void
|
||
|
*
|
||
|
*/
|
||
|
function addFilters(&$form, $cols, $arrayName = null,
|
||
|
$formFilters = null)
|
||
|
{
|
||
|
foreach ($cols as $name => $col) {
|
||
|
if ($arrayName) {
|
||
|
$elemname = $arrayName . "[$name]";
|
||
|
} else {
|
||
|
$elemname = $name;
|
||
|
}
|
||
|
|
||
|
DB_Table_QuickForm::fixColDef($col, $elemname);
|
||
|
|
||
|
foreach (array_keys($col['qf_filters']) as $fk) {
|
||
|
$form->applyFilter($elemname, $col['qf_filters'][$fk]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (is_array($formFilters)) {
|
||
|
foreach (array_keys($formFilters) as $fk) {
|
||
|
$form->applyFilter('__ALL__', $formFilters[$fk]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* Adds element rules to a pre-existing HTML_QuickForm object.
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param object &$form An HTML_QuickForm object.
|
||
|
*
|
||
|
* @param array $cols A sequential array of DB_Table column definitions
|
||
|
* from which to create form elements.
|
||
|
*
|
||
|
* @param string $arrayName By default, the form will use the names
|
||
|
* of the columns as the names of the form elements. If you pass
|
||
|
* $arrayName, the column names will become keys in an array named
|
||
|
* for this parameter.
|
||
|
*
|
||
|
* @param string $clientValidate By default, validation will match
|
||
|
* the 'qf_client' value from the column definition. However,
|
||
|
* if you set $clientValidate to true or false, this will
|
||
|
* override the value from the column definition.
|
||
|
*
|
||
|
* @return void
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function addRules(&$form, $cols, $arrayName = null,
|
||
|
$clientValidate = null)
|
||
|
{
|
||
|
foreach ($cols as $name => $col) {
|
||
|
|
||
|
if ($arrayName) {
|
||
|
$elemname = $arrayName . "[$name]";
|
||
|
} else {
|
||
|
$elemname = $name;
|
||
|
}
|
||
|
|
||
|
// make sure all necessary elements are in place
|
||
|
DB_Table_QuickForm::fixColDef($col, $elemname);
|
||
|
|
||
|
// if clientValidate is specified, override the column
|
||
|
// definition. otherwise use the col def as it is.
|
||
|
if (! is_null($clientValidate)) {
|
||
|
// override
|
||
|
if ($clientValidate) {
|
||
|
$validate = 'client';
|
||
|
} else {
|
||
|
$validate = 'server';
|
||
|
}
|
||
|
} else {
|
||
|
// use as-is
|
||
|
if ($col['qf_client']) {
|
||
|
$validate = 'client';
|
||
|
} else {
|
||
|
$validate = 'server';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// **always** override these rules to make them
|
||
|
// server-side only. suggested by Mark Wiesemann,
|
||
|
// debugged by Hero Wanders.
|
||
|
$onlyServer = array('filename', 'maxfilesize', 'mimetype',
|
||
|
'uploadedfile');
|
||
|
|
||
|
// loop through the rules and add them
|
||
|
foreach ($col['qf_rules'] as $type => $opts) {
|
||
|
|
||
|
// some rules (e.g. rules for file elements) can only be
|
||
|
// checked on the server; therefore, don't use client-side
|
||
|
// validation for these rules
|
||
|
$ruleValidate = $validate;
|
||
|
if (in_array($type, $onlyServer)) {
|
||
|
$ruleValidate = 'server';
|
||
|
}
|
||
|
|
||
|
switch ($type) {
|
||
|
|
||
|
case 'alphanumeric':
|
||
|
case 'email':
|
||
|
case 'lettersonly':
|
||
|
case 'nonzero':
|
||
|
case 'nopunctuation':
|
||
|
case 'numeric':
|
||
|
case 'required':
|
||
|
case 'uploadedfile':
|
||
|
// $opts is the error message
|
||
|
$message = $opts;
|
||
|
$format = null;
|
||
|
break;
|
||
|
|
||
|
case 'filename':
|
||
|
case 'maxfilesize':
|
||
|
case 'maxlength':
|
||
|
case 'mimetype':
|
||
|
case 'minlength':
|
||
|
case 'regex':
|
||
|
// $opts[0] is the message
|
||
|
// $opts[1] is the size, mimetype, or regex
|
||
|
$message = $opts[0];
|
||
|
$format = $opts[1];
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// by Alex Hoebart: this should allow any registered rule.
|
||
|
if (!in_array($type, $form->getRegisteredRules())) {
|
||
|
// rule is not registered ==> do not add a rule
|
||
|
continue;
|
||
|
}
|
||
|
if (is_array($opts)) {
|
||
|
// $opts[0] is the message
|
||
|
// $opts[1] is the size or regex
|
||
|
$message = $opts[0];
|
||
|
$format = $opts[1];
|
||
|
} else {
|
||
|
// $opts is the error message
|
||
|
$message = $opts;
|
||
|
$format = null;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
switch ($col['qf_type']) {
|
||
|
|
||
|
case 'date':
|
||
|
case 'time':
|
||
|
case 'timestamp':
|
||
|
// date "elements" are groups ==> use addGroupRule()
|
||
|
$form->addGroupRule($elemname, $message, $type, $format,
|
||
|
null, $ruleValidate);
|
||
|
break;
|
||
|
|
||
|
default: // use addRule() for all other elements
|
||
|
$form->addRule($elemname, $message, $type, $format,
|
||
|
$ruleValidate);
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* "Fixes" a DB_Table column definition for QuickForm.
|
||
|
*
|
||
|
* Makes it so that all the 'qf_*' key constants are populated
|
||
|
* with appropriate default values; also checks the 'require'
|
||
|
* value (if not set, defaults to false).
|
||
|
*
|
||
|
* @static
|
||
|
*
|
||
|
* @access public
|
||
|
*
|
||
|
* @param array &$col A DB_Table column definition.
|
||
|
*
|
||
|
* @param string $elemname The name for the target form element.
|
||
|
*
|
||
|
* @return void
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
function fixColDef(&$col, $elemname)
|
||
|
{
|
||
|
// always have a "require" value, false if not set
|
||
|
if (! isset($col['require'])) {
|
||
|
$col['require'] = false;
|
||
|
}
|
||
|
|
||
|
// array of acceptable values, typically for
|
||
|
// 'select' or 'radio'
|
||
|
if (! isset($col['qf_vals'])) {
|
||
|
$col['qf_vals'] = null;
|
||
|
}
|
||
|
|
||
|
// are we doing client validation in addition to
|
||
|
// server validation? by default, no.
|
||
|
if (! isset($col['qf_client'])) {
|
||
|
$col['qf_client'] = false;
|
||
|
}
|
||
|
|
||
|
if (! isset($col['qf_filters'])) {
|
||
|
$col['qf_filters'] = array();
|
||
|
}
|
||
|
|
||
|
// the element type; if not set,
|
||
|
// assigns an element type based on the column type.
|
||
|
// by default, the type is 'text' (unless there are
|
||
|
// values, in which case the type is 'select')
|
||
|
if (! isset($col['qf_type'])) {
|
||
|
|
||
|
// if $col['type'] is not set, set it to null
|
||
|
// ==> in the switch statement below, the
|
||
|
// default case will be used
|
||
|
if (!isset($col['type'])) {
|
||
|
$col['type'] = null;
|
||
|
}
|
||
|
|
||
|
switch ($col['type']) {
|
||
|
|
||
|
case 'boolean':
|
||
|
$col['qf_type'] = 'checkbox';
|
||
|
$col['qf_vals'] = array(0,1);
|
||
|
break;
|
||
|
|
||
|
case 'date':
|
||
|
$col['qf_type'] = 'date';
|
||
|
break;
|
||
|
|
||
|
case 'time':
|
||
|
$col['qf_type'] = 'time';
|
||
|
break;
|
||
|
|
||
|
case 'timestamp':
|
||
|
$col['qf_type'] = 'timestamp';
|
||
|
break;
|
||
|
|
||
|
case 'clob':
|
||
|
$col['qf_type'] = 'textarea';
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
if (isset($col['qf_vals'])) {
|
||
|
$col['qf_type'] = 'select';
|
||
|
} else {
|
||
|
$col['qf_type'] = 'text';
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// label for the element; defaults to the element
|
||
|
// name. adds both quickform label and table-header
|
||
|
// label if qf_label is not set.
|
||
|
if (! isset($col['qf_label'])) {
|
||
|
if (isset($col['label'])) {
|
||
|
$col['qf_label'] = $col['label'];
|
||
|
}
|
||
|
else {
|
||
|
$col['qf_label'] = $elemname . ':';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// special options for the element, typically used
|
||
|
// for 'date' element types
|
||
|
if (! isset($col['qf_opts'])) {
|
||
|
$col['qf_opts'] = array();
|
||
|
}
|
||
|
|
||
|
// array of additional HTML attributes for the element
|
||
|
if (! isset($col['qf_attrs'])) {
|
||
|
// setting to array() generates an error in HTML_Common
|
||
|
$col['qf_attrs'] = null;
|
||
|
}
|
||
|
|
||
|
// array of QuickForm validation rules to apply
|
||
|
if (! isset($col['qf_rules'])) {
|
||
|
$col['qf_rules'] = array();
|
||
|
}
|
||
|
|
||
|
// if the element is hidden, then we're done
|
||
|
// (adding rules to hidden elements is mostly useless)
|
||
|
if ($col['qf_type'] == 'hidden') {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// code to keep BC for the separator for grouped QF elements
|
||
|
if (isset($col['qf_radiosep'])) {
|
||
|
$col['qf_groupsep'] = $col['qf_radiosep'];
|
||
|
}
|
||
|
|
||
|
// add a separator for grouped elements
|
||
|
if (!isset($col['qf_groupsep'])) {
|
||
|
$col['qf_groupsep'] = '<br />';
|
||
|
}
|
||
|
|
||
|
// $col['qf_set_default_rules'] === false allows to turn off
|
||
|
// the automatic creation of QF rules for this "column"
|
||
|
// (suggested by Arne Bippes)
|
||
|
if (isset($col['qf_set_default_rules']) &&
|
||
|
$col['qf_set_default_rules'] === false) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// the element is required
|
||
|
// ==> set 'uploadedfile' (for file elements) or 'required' (for all
|
||
|
// other elements) rule if it is was not already set
|
||
|
$req_rule_name = ($col['qf_type'] == 'file') ? 'uploadedfile' : 'required';
|
||
|
if (!isset($col['qf_rules'][$req_rule_name]) && $col['require']) {
|
||
|
|
||
|
$col['qf_rules'][$req_rule_name] = sprintf(
|
||
|
$GLOBALS['_DB_TABLE']['qf_rules']['required'],
|
||
|
$col['qf_label']
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
// for file elements the 'numeric' and 'maxlength' rules must not be set
|
||
|
if ($col['qf_type'] == 'file') {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$numeric = array('smallint', 'integer', 'bigint', 'decimal',
|
||
|
'single', 'double');
|
||
|
|
||
|
// the element is numeric
|
||
|
if (!isset($col['qf_rules']['numeric']) && isset($col['type']) &&
|
||
|
in_array($col['type'], $numeric)) {
|
||
|
|
||
|
$col['qf_rules']['numeric'] = sprintf(
|
||
|
$GLOBALS['_DB_TABLE']['qf_rules']['numeric'],
|
||
|
$col['qf_label']
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
// the element has a maximum length
|
||
|
if (!isset($col['qf_rules']['maxlength']) && isset($col['size'])) {
|
||
|
|
||
|
$max = $col['size'];
|
||
|
|
||
|
$msg = sprintf(
|
||
|
$GLOBALS['_DB_TABLE']['qf_rules']['maxlength'],
|
||
|
$col['qf_label'],
|
||
|
$max
|
||
|
);
|
||
|
|
||
|
$col['qf_rules']['maxlength'] = array($msg, $max);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
?>
|