Zend Framework:別のアクションに投稿してから、検証に失敗した場合は元のアクションに戻り、フォームフィールドを保持します
-
28-09-2019 - |
質問
これは奇妙なシナリオのように聞こえるかもしれませんが、1つのページに2つのフォームがあります。 1つは自分自身に戻って投稿するだけです。コードをきれいに保つために、別のアクションに2番目の投稿をしました。多分正しい選択ではない...
私が今抱えている問題は、その2番目のフォームが検証されていない場合、フォームでページにリダイレクトしますが、ユーザーが入力した元の情報でフォームフィールドを埋める方法がわからないことです。それを行い、2つの別々のアクションに投稿し続ける方法はありますか、それとも弾丸を噛んで、両方のフォームを同じアクションに戻し、乱雑なロジックに対処する必要がありますか?
解決
私は両方のフォームを同じアクションに提出します。それについてあまり厄介なことは本当にないはずです。それぞれの形式には、どのフォームが提出されているかを示す隠されたフィールドが含まれています。
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か所で処理するためのコードが保持されます。ここでの問題は、失敗した検証で元のページに戻りたいということです。しかし、なぜ?ページに単一のフォームがある場合と同じように、ターゲットコントローラーのフォームを単純に再表示してみませんか?
たとえば、SIEのすべてのページに表示されるログインフォームを検討してください(おそらく、サイトテンプレート/レイアウトにあるため)。それはようなものに投稿します AuthController::loginAction()
. 。ログインが失敗した場合、通常、彼が来たページに彼を送り返すことはありません。あなたは彼をログインページに残し、フォームは $_POST
あなたが望むように(おそらくユーザー名ですが、彼のパスワードではありません)。
見る この答え 同様の議論のために。
アップデート: :これについて別の考えがありました。彼がフォームを投稿したページに彼を維持するために、2つの異なるコントローラーで処理を本当に処理したい場合は、少なくともフォームの処理を抽出します。 アクションヘルパー. 。これにより、少なくともそのフォームプロセスを維持することができます ドライ.
アップデート: :ロブ・アレンは素晴らしいブログ投稿を書いたばかりです 「あなたのレイアウトのフォーム」 彼は、アクションヘルパーをで使用する方法を説明しています preDispatch()
フォームをインスタンス化および処理する方法。非常に素晴らしい。
どのようにリダイレクトしますか?フォームページをもう一度表示するだけで問題はありません。 zend_form :: populate()を使用して、フォームを作成できます。
まあ、私は両方のフォームを同じページに提出し続けます。
なぜあなたのコードが読みやすくなるのかわかりません。アクションヘルパーの使用方法を学ぶと、コントローラーが突然非常にシンプルで読みやすく見えます。
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());
}
}
各フォームの処理には、独自のアクションヘルパーがあります。