<?
/*
* Form Class
*
* Copyright (C) 2002 Daniel Fróz Costa
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
*
* $Id: form_class.php,v 1.3 2002/02/28 10:57:27 daniel Exp $
*/
if(!defined(PHP_FORM_CLASS))
{
define(PHP_FORM_CLASS, 1);
define(FORM_GMETHOD_ARRAY, 0);
define(FORM_GMETHOD_QUEUE, 1);
define(FORM_SELECT_IS_MULTIPLE, 0);
define(FORM_SELECT_NOT_MULTIPLE, 1);
define(FORM_OK, 0);
define(FORM_EARG, 1);
define(FORM_ECALL, 2);
define(FORM_ETYPE, 3);
define(FORM_EIND, 4);
class form
{
var $action;
var $errno;
var $field; /* field buffer */
var $method; /* form method */
var $gmethod; /* get field method */
/*
* void form( string action [, string method ] )
*/
function form($action, $method="GET")
{
$this->action = $action;
$this->errno = FORM_OK;
$this->field = array();
$this->method = $method;
$this->gmethod = FORM_GMETHOD_ARR;
}
/*
* string end( void )
*/
function end()
{
return "</form>";
}
/*
* boolean freeField( [ mixed key ] )
*/
function freeField($key = 0)
{
$idx = $this->getIndice($key);
if($idx < 0) {
$this->errno = FORM_EARG;
return false;
}
switch($this->gmethod)
{
case FORM_GMETHOD_ARRAY:
unset($this->field[$idx]);
$this->field[$idx] = 0;
break;
case FORM_GMETHOD_QUEUE:
$nfield = array();
while(list($k, $v) = each($this->field)) {
if($k == $idx) continue;
$nfield[] = $this->field[$k];
}
unset($this->field);
$this->field = $nfield;
break;
}
return true;
}
/*
* getIndice( [ mixed key ] )
*/
function getIndice($key = 0)
{
if(is_numeric($key))
return $key;
for($i=0; $i < count($this->field); $i++)
if(!strcmp($this->field[$i][name], $key))
return $i;
return -1;
}
/*
* string getField ( [ mixed key ] )
*/
function getField($key=0)
{
$formtag = NULL;
$idx = $this->getIndice($key);
if($idx < 0) {
$this->errno = FORM_EIND;
return false;
}
$name =& $this->field[$idx][name];
$value =& $this->field[$idx][value];
$type =& $this->field[$idx][type];
$attr =& $this->field[$idx][attr];
$sattr =& $this->field[$idx][sattr]; /* special attribute */
switch($type)
{
case "radio":
if(count($attr) > 0)
{
$formtag = "<input type=\"$type\" name=\"$name\" ";
$formtag .= "value=\"".$attr[0]."\"";
if(!strcmp($value, $attr[0]))
$formtag .= " checked";
$formtag .= ">";
array_shift($attr);
if(!$attr[0])
$this->freeField($idx);
}
break;
case "checkbox":
if(count($attr)>0)
{
$formtag = "<input type=\"$type\" name=\"$name\"";
$formtag .= " value=\"".$attr[0]."\"";
if(is_array($value)) {
if(!strcmp($value[0], $attr[0])) {
$formtag .= " checked";
array_shift($value);
}
}
else {
if(!strcmp($value, $attr[0]))
$formtag .= " checked";
}
$formtag .= ">";
array_shift($attr);
if(!$attr[0])
$this->freeField($idx);
}
break;
case "textarea":
$formtag = "<textarea name=\"$name\"";
if($attr) {
if(is_array($attr)) $formtag .= " ".implode($attr, " ");
else $formtag .= " $attr";
}
$formtag .= ">$value</textarea>";
$this->freeField($idx);
break;
case "select":
$formtag = "<select name=\"$name\"";
if(is_array($sattr)) $formtag .= " ".implode($sattr, " ");
else $formtag .= " $sattr";
$formtag .= ">\n";
while(list($optv, $optdes) = each($attr))
{
$formtag .= "<option value=\"$optv\"";
if(!strcmp($value, $optv)) $formtag .= " selected";
$formtag .= ">$optdes</option>\n";
}
$formtag .= "</select>";
$this->freeField($idx);
break;
case "selectmultiple":
$formtag = "<select name=\"$name\" multiple";
if(is_array($sattr)) $formtag .= " ".implode($sattr, " ");
else $formtag .= " $sattr";
$formtag .= ">\n";
while(list($optv, $optdes) = each($attr))
{
$formtag .= "<option value=\"$optv\"";
if(is_array($value)) {
if(in_array($optv, $value))
$formtag .= " selected";
}
else {
if(!strcmp($value, $optv))
$formtag .= " selected";
}
$formtag .= ">$optdes</option>\n";
}
$formtag .= "</select>";
$this->freeField($idx);
break;
default:
$formtag = "<input type=\"$type\" name=\"$name\"";
$formtag .= " value=\"$value\"";
if($attr)
{
if(is_array($attr)) $formtag .= " ".implode($attr, " ");
else $formtag .= " $attr";
}
$formtag .= ">";
$this->freeField($idx);
break;
}
return $formtag;
}
/*
* boolean setField ( string name [, string value [, string type [, mixed attributes [, mixed special_attributes ]]]])
*/
function setField($name, $value=0, $type="text", $attr=NULL, $sattr=NULL)
{
switch($type)
{
case "radio":
if(!is_array($attr)) {
$this->errno = FORM_EARG;
return false;
}
break;
case "select": case "selectmultiple":
if(!is_array($attr)) {
$this->errno = FORM_EARG;
return false;
}
break;
case "checkbox": case "hidden":
case "password": case "submit":
case "text": case "textarea":
break;
default:
$this->strerr = FORM_ETYPE;
return false;
}
array_push($this->field,
array(
"name" => $name,
"value"=> $value,
"type" => $type,
"attr" => $attr,
"sattr" => $sattr,
)
);
return true;
}
/*
* boolean setGetFieldMethod ( integer gmethod )
*/
function setGetFieldMethod($gmethod)
{
if($gmethod != FORM_GMETHOD_QUEUE && $gmethod != FORM_GMETHOD_ARRAY) {
$this->errno = FORM_EARG;
return false;
}
$this->gmethod = $gmethod;
return true;
}
/*
* string start( void )
*/
function start()
{
return "<form action=\"$this->action\" method=\"$this->method\">";
}
/*
* string strError( void )
*/
function strError()
{
switch($this->errno)
{
case FORM_EARG:
return "invalid argument";
case FORM_ECALL:
return "invalid call order";
case FORM_EIND:
return "invalid index";
case FORM_ETYPE:
return "invalid element type";
default:
return "success";
}
}
} /* ! class form */
} /* ! PHP_FORM_CLASS */
?>
|