PHP:多次重复相同的表单页面,并在整个浏览器导航过程中持久识别每个版本

时间:2011-02-01 08:48:36

标签: php forms get persistence

问候,我有一个问题:我的webapplication要求在给定次数下显示相同的表单,并且每次都要求不同的数据,因为表单会一次又一次地调用自己,直到需要为止。然后使用来自这些不同编辑的数据填充PDF模板,对提交的每个数据集都有效,并输出结果。我目前正在使用会话数组存储数据集,然后从中编译PDF表单。

我需要完成的是识别生成的每个不同阵列,并且因为我不知道用户需要生成的文档数量,所以要逐步计算各种数据集。

我正在考虑的是使用计数器变量来保持对正确数组的关注,并动态生成它们的名称(例如,${$arrName.$i} = $foo);但是,我还有一种机制允许用户推送后退按钮并保留以前在所有其他页面中输入的表单数据,所以我不能只有一个向上的计数器 - 这意味着失去对该集合中先前数组的引用。

所以,我正在考虑使用$_GET变量,并通过URL传递表单编号,这样我就可以独立于其余部分识别每个请求的页面版本,但这对我来说似乎是个蠢货;然而,这将消除以代码方式跟踪所有后续数组的必要性,并为我提供便利。

我是否可以就此方法发表意见,并对更好的解决方案有所了解?请注意,应用程序仅依赖于自身,并且没有可用作交换点的数据库,这会略微方便。提前感谢任何建设性的回应。

1 个答案:

答案 0 :(得分:1)

你想做像巫师这样的事吗?如果这是您想要的,那么这意味着您已经知道有多少步骤,因此您实际为向导的每个步骤呈现不同的表单。通过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

}

我不知道这是否正常“按现状”,但我认为你得到的主要想法是为了进一步使用它。在模板/ html区域中,您可以使用ifs或开关根据您所使用的步骤更改表单的字段。这个想法是通过向导的步骤轻松导航,保持日期和最后一步保存。考虑到你已经知道了最后一步,而不是传递步骤编号,你可以传递回来(意思是:减少最后一步或向前意义增加最后一步)。

希望这有帮助。

虽然这取决于您需要做什么,但您应该知道注册表格最多必须有3个步骤。