PHP: повторение одной и той же страницы формы несколько раз и постоянное определение каждой версии в браузерной навигации - PullRequest
1 голос
/ 01 февраля 2011

Привет, у меня есть вопрос: мое веб-приложение требует показывать одну и ту же форму определенное количество раз и каждый раз запрашивать разные данные, как, например, форма вызывает себя снова и снова, пока это не понадобится. Данные из этих отдельных сборников затем используются для заполнения шаблона PDF, действительного для каждого отправленного набора данных, и вывода результата. В настоящее время я использую массивы сеансов для хранения наборов данных, из которых затем формируются PDF-формы.

Что мне нужно сделать, это идентифицировать каждый отдельный сгенерированный массив, и, поскольку я априори не знаю количество документов, которые пользователь должен будет сгенерировать, необходимо постоянно вести подсчет различных наборов данных.

Я думаю о том, чтобы использовать переменную-счетчик для хранения вкладок в нужном массиве и динамически генерировать их имена (как, например, ${$arrName.$i} = $foo);, однако у меня также есть механизм, который позволяет пользователю нажимать кнопку «назад»). и сохраните ранее введенные данные формы на всех других страницах, поэтому я не могу просто иметь счетчик вверх - это означало бы потерю ссылки на предыдущие массивы в наборе.

Итак, я подумывал об использовании $_GET переменных и пропустил номер формы через URL, что позволило мне распознавать каждую запрашиваемую версию страницы независимо от остальных, но для меня это похоже на ошибку; тем не менее, это устранит необходимость отслеживать все последующие массивы кода и как-то облегчит мне задачу.

Могу ли я высказать мнение об этом методе, и некоторые идеи о лучшем решении, если таковые имеются? Обратите внимание, что приложение полагается только на себя и не имеет базы данных для использования в качестве обменного пункта, что несколько облегчило бы ситуацию. Заранее благодарим за любой конструктивный ответ.

1 Ответ

1 голос
/ 01 февраля 2011

Вы хотите сделать что-то вроде волшебника? Если это именно то, что вам нужно, это означает, что вы уже знаете, сколько шагов существует, поэтому вы фактически отображаете разные формы для каждого шага мастера. Отправка номера шага с помощью 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 шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...