Zend форма со средним шагом, как изменить нормальный код - PullRequest
2 голосов
/ 01 февраля 2011

Как можно иметь многоступенчатую форму с Zend.Это то, что я пытаюсь сделать ..

Обычно у меня есть форма, пользователь заполняет форму.Когда форма отправлена ​​(опубликовано) И действует, я выполняю последнее действие (добавляю в базу данных или что-нибудь еще).

public function indexAction(){
   $form = new Application_Form_Test();

   if(form is valid){
      //do the final thing.. add to the database or whatever
   }
   $this->view->form = $form;
}

Что я хочу сделать, это вставить средний шаг.Когда пользователь отправляет форму, я не хочу вставлять в базу данных сразу.Я хочу сначала рассчитать некоторые дополнительные данные, показать рассчитанные данные пользователю в дополнение к только что введенному им вводу и отобразить кнопку подтверждения.Если пользователь нажимает «Отправить», я делаю последнее, что добавляется в базу данных, в противном случае я отменяю всю операцию.Так может ли кто-нибудь придумать простой способ сделать это, не совершая много сумасшедших взломов?

Ответы [ 2 ]

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

Я подготовил проект возможного способа преодоления вашей проблемы.В основном это два действия (indexAction и index2Action) и сеанс.

indexAction

public function indexAction() {
    $form = new Application_Form_Test();

    if ($this->getRequest()->isPost()) {
        if ($form->isValid($_POST)) {

            // calculate some additional data
            $calculatedData = someCalulations();

            // if form is valid than save submitted and calculated data in a session
            $addAccInfoNamespace = new Zend_Session_Namespace('data');
            $addAccInfoNamespace->postData = $form->getValues();
            $addAccInfoNamespace->calculatedData = $calculatedData;
            $addAccInfoNamespace->lock();

            // and redirect to the second stage (or middle stage)
            return $this->_redirect('index/index2');
        }
    }
    $this->view->form = $form;
}

index2Action

 public function index2Action() {

        // retrieve data saved in the first stage (indexAction).
        $sessionData = new Zend_Session_Namespace('data');

        if (null === $sessionData->postData || null === $sessionData->calculatedData) {
            // if no data go to index, or throw execption or whatever.
            return $this->_redirect('index/index');
        }

        // get the data
        $oldPostData = $addAccInfoNamespace->postData;
        $calculatedData = $sessionData->calculatedData;

        // form that only shows cunfirmation button
        // However, if you want to show data in this form, that you need to 
        // populate Application_Form_Test2 with whatever data you want.
        $form = new Application_Form_Test2();


        if ($this->getRequest()->isPost()) {
            if ($form->isValid($_POST)) {

                if (!$form->confirm->isChecked()) {
                    // if confirm submit button was NOT clicked go to e.g. index
                    // This may mean that ,e.g. cancel submit button was click.
                    return $this->_redirect('index/index');
                }


                //do the final thing.. add to the database or whatever


                // don't need this session namespace anymore
                Zend_Session::namespaceUnset('data');

                // and redirect to e.g. success confirmation page
                return $this->_redirect('index/success');
            }
        }

        // show confirmation button and additional calculated data
        $this->view->calculatedData = $calculatedData;
        $this->view->form = $form;
    }

Что ты думаешь?

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

Вот как я это сделаю ...

  1. Создайте два действия контроллера, назовем их "stepOneAction" и "stepTwoAction".
  2. stepOneAction создаст и подтвердит вашФорма (по почте).При успешной проверке сохраните данные формы ($form->getValues()) в пространстве имен сеанса, затем перенаправьте на stepTwoAction
  3. stepTwoAction затем извлечет данные формы из сеанса, выполнит вычисления и передаст их все в представление для отображения,Представление также будет содержать небольшую форму (может быть Zend_Form или только в разметке) с двумя кнопками («Подтвердить» и «Отмена»), которая отправляется в stepTwoAction.
  4. Также в stepTwoAction проверьтедля запроса POST очистите пространство имен сеанса, проверьте нажатую кнопку и затем действуйте соответствующим образом.

Некоторые дополнительные соображения

  • stepOneAction, вероятно, должны очистить пространство имен сеанса наобычный запрос GET
  • Обе формы, вероятно, должны содержать некоторую защиту CSRF с использованием Zend_Form_Element_Hash
...