PHP:多次重复同一表单页面,并在整个浏览器导航中持续标识每个版本
您好,我有一个问题:我的Web应用程序要求在给定的次数内显示同一个表单,并且每次都要求不同的数据,就像在中一样,表单反复调用自己,直到必要时为止。然后使用这些不同编译的数据填充PDF模板,该模板对提交的每个数据集都有效,并输出结果。我目前正在使用会话数组来存储数据集,然后从中编译PDF表单 我需要完成的是识别生成的每个不同的数组,由于我事先不知道用户需要生成的文档数量,所以逐步统计各种数据集 我想到的是使用一个计数器变量来跟踪正确的数组,并动态生成它们的名称(如,PHP:多次重复同一表单页面,并在整个浏览器导航中持续标识每个版本,php,forms,get,persistence,Php,Forms,Get,Persistence,您好,我有一个问题:我的Web应用程序要求在给定的次数内显示同一个表单,并且每次都要求不同的数据,就像在中一样,表单反复调用自己,直到必要时为止。然后使用这些不同编译的数据填充PDF模板,该模板对提交的每个数据集都有效,并输出结果。我目前正在使用会话数组来存储数据集,然后从中编译PDF表单 我需要完成的是识别生成的每个不同的数组,由于我事先不知道用户需要生成的文档数量,所以逐步统计各种数据集 我想到的是使用一个计数器变量来跟踪正确的数组,并动态生成它们的名称(如,${$arrName.$I}=$
${$arrName.$I}=$foo)
然而,我还有一种机制,允许用户按下后退按钮并在所有其他页面中保留以前输入的表单数据,因此我不能只使用向上计数器——这意味着失去对集合中以前数组的引用
因此,我考虑使用$\u GET
变量,并通过URL传递表单编号,这样我就可以独立于其他页面识别页面的每个请求版本,但这对我来说似乎是一个难题;然而,这将消除跟踪所有后续数组代码的必要性,并为我提供某种便利
我可以对这个方法有一个看法吗?如果有更好的解决方案,我可以提供一些见解吗?请注意,应用程序只依赖于自身,没有数据库用作交换点,这将稍微方便一些。提前感谢您的建设性回复。您想做一些类似于向导的事情吗?如果这是您想要的,那么这意味着您已经知道有多少个步骤,因此您实际上可以为向导的每个步骤呈现不同的表单。通过get发送步骤号是最好的解决方案。您仍然需要跟踪它的数据。我想我会这样做:
class Wizard {
private $fromsData;/*array with forms*/
private $steps;
private $wizards;
private $lastStep;//last completed step
private function Wizard() {
$this->lastStep = 0;
}
public static function getInstance($name) {
if(isset($_SESSION["wizards"]["name"]) && !isset(self::wizards[$name])) {
self::wizards[$name] = unserialize($_SESSION["wizards"]["name"]);
unset($_SESSION["wizards"]["name"]);
}elseif(!isset(self::wizards[$name])) {
self::wizards[$name] = new Wizard();
}
return self::wizards[$name];
}
public static function commitWizard($name) {
$_SESSION["wizards"]["name"] = serialize(self::wizards[$name]);
}
public function addData($data,$step = null){
if(is_null($step)) {
$this->steps++;
$step = $this->steps;
}
$this->formsData[$step] = $data;
$this->lastStep = $step;
return $step+1;
}
public function getSteps() {
return $this->steps;
}
public function getData($step) {
return $this->formsData[$step];
}
}
这是一个可以帮助您管理表单数据和步骤的类。它在会话中保持每个步骤的数据序列化,以便您以后可以获取数据,并在步骤之间进行跳转
用法可能是这样的
$wizardName = "sample";
$myWizard = Wizard::getInstance($wizardName);
$step = isset($_POST["step"]) ? $_POST["step"] : null;
if(isset($_POST["data"])) {
if(myValidationFor($_POST["data"]) {
$step = $myWizard->addData($_POST["data"],$step);
} else {
$step =$myWizard->getLastStep();
}
}
if(!is_null($step)) {
$dataForForm = $myWizard->getData($step);//data To Be Shown in the form
};
$showStep = $step+1;
Wizard::commitWizard($wizardName);//saves it into the session
}
我不知道这是否是功能性的“原样”,但我认为你得到了主要的想法,以便进一步利用它。在template/html区域中,您可以使用ifs或一个开关,该开关根据您所处的步骤更改表单的字段。这样做的目的是在向导的各个步骤中轻松导航,并保存日期和最后一步。考虑到你已经知道了最后一步,你不需要传递步数,只需要传递后一步(意思是:减少最后一步或向前一步,意思是增加最后一步)
希望这有帮助
尽管这取决于您需要执行的操作,但您应该知道,注册表最多必须包含3个步骤。是否要执行类似于向导的操作?如果这是您想要的,那么这意味着您已经知道有多少个步骤,因此您实际上可以为向导的每个步骤呈现不同的表单。通过get发送步骤号是最好的解决方案。您仍然需要跟踪它的数据。我想我会这样做:
class Wizard {
private $fromsData;/*array with forms*/
private $steps;
private $wizards;
private $lastStep;//last completed step
private function Wizard() {
$this->lastStep = 0;
}
public static function getInstance($name) {
if(isset($_SESSION["wizards"]["name"]) && !isset(self::wizards[$name])) {
self::wizards[$name] = unserialize($_SESSION["wizards"]["name"]);
unset($_SESSION["wizards"]["name"]);
}elseif(!isset(self::wizards[$name])) {
self::wizards[$name] = new Wizard();
}
return self::wizards[$name];
}
public static function commitWizard($name) {
$_SESSION["wizards"]["name"] = serialize(self::wizards[$name]);
}
public function addData($data,$step = null){
if(is_null($step)) {
$this->steps++;
$step = $this->steps;
}
$this->formsData[$step] = $data;
$this->lastStep = $step;
return $step+1;
}
public function getSteps() {
return $this->steps;
}
public function getData($step) {
return $this->formsData[$step];
}
}
这是一个可以帮助您管理表单数据和步骤的类。它在会话中保持每个步骤的数据序列化,以便您以后可以获取数据,并在步骤之间进行跳转
用法可能是这样的
$wizardName = "sample";
$myWizard = Wizard::getInstance($wizardName);
$step = isset($_POST["step"]) ? $_POST["step"] : null;
if(isset($_POST["data"])) {
if(myValidationFor($_POST["data"]) {
$step = $myWizard->addData($_POST["data"],$step);
} else {
$step =$myWizard->getLastStep();
}
}
if(!is_null($step)) {
$dataForForm = $myWizard->getData($step);//data To Be Shown in the form
};
$showStep = $step+1;
Wizard::commitWizard($wizardName);//saves it into the session
}
我不知道这是否是功能性的“原样”,但我认为你得到了主要的想法,以便进一步利用它。在template/html区域中,您可以使用ifs或一个开关,该开关根据您所处的步骤更改表单的字段。这样做的目的是在向导的各个步骤中轻松导航,并保存日期和最后一步。考虑到你已经知道了最后一步,你不需要传递步数,只需要传递后一步(意思是:减少最后一步或向前一步,意思是增加最后一步)
希望这有帮助
尽管这取决于您需要做什么,但您应该知道,注册表最多必须包含3个步骤。为什么不将它们存储在临时数据库表中?容易多了。。我很抱歉没有以更好的方式强调这一点,但正如我所说,我的应用程序背后没有数据库;稍后我可能需要添加一个,但遗憾的是,现在我只能依靠PHP。为什么不将它们存储在临时db表中呢?容易多了。。我很抱歉没有以更好的方式强调这一点,但正如我所说,我的应用程序背后没有数据库;稍后我可能需要添加一个,但遗憾的是,现在我只能依靠PHP;我所做的是动态设置尽可能多的会话数组,因为请求的数据集实际上是一步一步地重复,但这似乎是一个更好的选择,因为我可以从一个索引良好的结构中提取数据。对于我来说,这个类唯一需要的是一个方法来处理删除过程中不需要的步骤,例如当用户返回时,存储在下一个步骤中的数据不再相关,这很容易处理。非常感谢,这正是我想要的。谢谢,这看起来很有用;我所做的是动态设置尽可能多的会话数组,因为请求的数据集实际上是一步一步地重复,但这似乎是一个更好的选择,因为我可以从一个索引良好的结构中提取数据。对于我来说,这个类唯一需要的是一个方法来处理删除过程中不需要的步骤,例如当用户返回时,存储在下一个步骤中的数据不再相关,这很容易处理。非常感谢,thi