Zend Framework: публикация к другому действию, а затем возврат к исходному действию, если проверка не пройдена, и сохранение полей формы - PullRequest
2 голосов
/ 07 октября 2010

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

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

Ответы [ 4 ]

3 голосов
/ 07 октября 2010

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

Application_Form_Login:

 /* other form elements */
 $this->addElement('hidden', 'login', array(
      'value' => 1
 ));

Application_Form_Register:

 /* other form elements */
 $this->addElement('hidden', 'register', array(
      'value' => 1
 ));

Контроллер:

$loginForm = new Application_Form_Login();
$registerForm = new Application_Form_Register();

if($this->_request->isPost()) {
     if($this->_request->getPost('login')) {
         if($loginForm->isValid($this->_request->getPost())) {
             // validated, redirect
             $this->_helper->redirector('profile', 'user');
         }
     }
     if($this->_request->getPost('register')) {
         if($registerForm->isValid($this->_request->getPost())) {
             // validated, proceed as needed
         }
     }
}

$this->view->loginForm = $loginForm;
$this->view->registerForm = $registerForm;

Вид:

echo $this->loginForm;

echo $this->registerForm;

При таком типе настройки, если любая из ваших форм не прошла проверку, isValid() сохранит все введенные данные, и вы все равно будете перенаправлять при успешной проверке одной или обеих форм.

1 голос
/ 07 октября 2010

Лично я считаю, что каждая форма должна отправлять сообщения на свой собственный контроллер, как у вас. Это сохраняет код для обработки этой формы в одном месте. Проблема здесь в том, что вы хотите вернуться на исходную страницу при неудачной проверке. Но почему? Почему бы просто не перезапустить форму в целевом контроллере, как если бы на странице была одна форма?

Например, рассмотрим форму входа в систему, которая появляется на каждой странице сайта (возможно, потому что она есть в шаблоне / макете сайта). Он отправляет что-то вроде AuthController::loginAction(). Если вход в систему не удается, вы обычно не отправляете его обратно на страницу, с которой он пришел. Вы оставляете его на странице входа в систему, предварительно заполнив форму из $_POST, какой вы хотите (вероятно, имя пользователя, но не его пароль).

См. этот ответ для аналогичного обсуждения.

Обновление : Еще одна мысль об этом. Если вы действительно хотите обрабатывать обработку в двух разных контроллерах, чтобы держать его на странице, с которой он отправил форму, по крайней мере извлеките эту обработку формы в action helper . Таким образом, вы могли бы по крайней мере сохранить эту обработку форм DRY .

Обновление : Роб Аллен только что написал отличный пост в блоге "Форма в вашем макете" , в котором он описывает метод, использующий помощник действий с preDispatch() метод, который создает и обрабатывает форму. Очень мило.

0 голосов
/ 07 октября 2010

Ну, я бы просто отправил обе формы на одну и ту же страницу.

Я не понимаю, почему ваш код должен стать менее читабельным.Узнайте, как использовать помощники действий, и ваши контроллеры внезапно будут выглядеть чрезвычайно просто и читабельно:

public function indexAction() 
{
    $request = $this->getRequest();

    // send forms to view, so we can print them
    // but also so we can access them in action helpers
    $this->view->form = $this->_getForm('Form1', '/');
    $this->view->form2 = $this->_getForm('Form2', '/');

    if ($request->isPost())
    {
        // process the first form
        if (isset($_POST['form_submit_button']) && $this->view->form->isValid($_POST))
        {
            $this->_helper->form($this->view->form->getValues());
        }
        // process the second form
        else if (isset($_POST['form2_submit_button']) && $this->view->form2->isValid($_POST))
        {
            $this->_helper->form2($this->view->form2->getValues());
        }
}

У каждой формы обработки будет свой помощник действий.

0 голосов
/ 07 октября 2010

Как вы перенаправляете? Я не вижу проблемы, если вы просто отобразите страницу формы снова. Вы можете предварительно заполнить формы, используя Zend_Form :: populate ().

...