我有一个小应用程序,其中我有9个不同的表单,每个表单都有至少一个40+字段,用户必须在其中输入一些数据。
我已经在一个单独的php文件中编写了每个表单,并制作了一个主PHP文件,其中我只将表单添加到页面中间。
我的问题是:
我不想为每个表单写9个不同的函数,因为它太长了,我认为这不是最好的做法,所以有没有一种方法或想法可以帮助我制作一个通用的函数,在这个函数中,我可以将一些变量传递给数据库,并将数据添加到数据库中。
我可以像这样遍历$_POST数组,提取数据并重新格式化吗?但话又说回来,每个字段都有不同的名称,我似乎不可能做到这一点。
发布于 2009-05-24 04:37:10
尝试这样做:
<?php
abstract class FormData
{
const BOOLEAN = 'bool';
const INTEGER = 'int';
const FLOAT = 'float';
const STRING = 'string';
protected $_types = array();
public static function create($data)
{
$action = isset($data['action']) ? $data['action'] : '';
switch ($action)
{
case 'form1': return new MyForm1($data);
default: return null;
}
return null;
}
protected function loadPostVars($data)
{
foreach ($data AS $var=>$value)
{
$value = $this->convertVar($var, $value);
if (!is_null($value) && property_exists($this, $var))
{
$this->$var = $value;
}
}
}
protected function convertVar($var, $value)
{
if (array_key_exists($var, $this->_types))
{
$type = $this->_types[$var];
switch ($type)
{
case FormData::BOOLEAN: return (bool)(int)$value;
case FormData::INTEGER: return (int)$value;
case FormData::FLOAT: return (float)$value;
case FormData::STRING: // drop down
default:
return myEscapeString($value);
}
}
return null;
}
}
class MyForm1 extends FormData
{
public $fld1;
public $fld2;
public $fld3;
// etc...
public function __construct($data)
{
$this->_types = array(
'fld1' => FormData::INTEGER,
'fld2' => FormData::STRING,
'fld3' => FormData::BOOLEAN,
);
$this->loadPostVars($data);
}
}
// And finally process your form data
// You should add hidden input 'action' to each form to identify the form
if ($form = FormData::create($_POST))
{
echo $form->fld1, $form->fld2, $form->fld3;
}
else
{
exit('error: unknown action provided');
}
?>
这个解决方案必须改进--我写得非常快。但我希望你能领会大意。希望这能有所帮助。当然,在每个表单类中,您可以添加特定的方法来处理请求等。
发布于 2009-05-24 00:12:56
您可能会对Zend_Form之类的东西感兴趣。
发布于 2009-05-24 03:39:57
我在我的一个项目中使用了类似的东西。基本上,我定义了所有字段,包括如何显示它们,它们具有什么数据类型(数字、日期等),以及回发后如何处理它们。然后将该信息传递给一个生成HTML表单的函数。当该表单提交时,您将相同的信息传递给执行必要任务的不同函数。
在我的特定案例中,它只是用来创建搜索表单,所以处理过程涉及到创建一条SELECT sql语句。下面是其中一个字段定义的示例:
$criteria = array(
array("label" => "Search clients",
"type" => "radio",
"values"=> array("1" => "Just " . $client->getName(),
"2" => "All clients"),
"where" => array("1" => "c.`clientId` = " . $client->getId(),
"2" => "1"), // always true
"default" => "1"),
array("label" => "Last Name",
"type" => "text",
"where" => "s.`lastName` LIKE '%s'"),
array("label" => "First Name",
"type" => "text",
"where" => "s.`firstName` LIKE '%s'")
// etc...
https://stackoverflow.com/questions/903275
复制