cakePHP3を用いて、検索画面を作成しております。
検索画面で入力されたフォームの値をチェックし、
チェックが通れば、別ウィンドウで検索結果を表示という処理を実装したいです。
構成
- コントローラ
SearchController.php
(検索画面用)
- アクション
index
search
ResultController.php
(検索結果画面用)
- アクション
index
- ビュー
/Search/index.ctp
(検索画面)
/Result/index.ctp
(検索結果画面)
処理概要
- 別ページから
SearchController.php
のindex
アクション呼び出し。 index
アクション内で初期処理を行い、/Search/index.ctp
呼び出し。/Search/index.ctp
画面のフォームを入力し、検索ボタンを押下⇒search
アクション呼び出し。- 入力内容をチェックし、問題なければ、別ウィンドウで
ResultController.php
のindex
アクション呼び出し。元ページは、URL含め3の処理時と同じ状態。
※4の部分の実装方法で困っています。
要件・課題まとめ
- 処理概要4
/Result/index.ctp
は別ウィンドウで表示。 - 処理概要4 元ページは、URLを含め、「検索」ボタン押下前と同じ状態。(フォームの値保持は実装済みです)
URL設定
config/routes.php
で、下記のように設定しております。
php
1 $routes->connect('/Hoge/search/*', ['controller' => 'search', 'action' => 'index']); 2 $routes->connect('/Hoge/search/result/*', ['controller' => 'result', 'action' => 'index']);
コントローラ処理(現状)
SearchController.php
(検索画面用)
下記コードだと、新規タブで/Result/index.ctp
が呼ばれ、元ページで/Search/index.ctp
が呼ばれます(想定通りの動作)が、
URLが/Hoge/search/search
となってしまいます。(想定は/Hoge/search/
)
php
1public function search(){ 2 $this->Session->write ('search_post',$this->request->data); 3 /*入力チェック割愛します。*/ 4 echo "<script language=javascript>window.open('../CampaignKnowledge/search/result/','result');</script>"; 5 $this->setAction('index'); 6}
$this->setAction('index');を$this->redirect(['controller' => 'Search', 'action' => 'index']);に設定すると、
元ページはURL含め、処理概要3と同様の状態となりますが、検索結果画面が表示されません。(別ウィンドウは表示されず、元画面がリダイレクトするだけ)
どのような修正が必要でしょうか。
※情報が不足している場合は、補足致しますので、
至らない点が多いとは思いますが、よろしくお願いいたします。
補足
submitされた際、onclickでjsの関数に飛び、その中で、下記2つの処理をするのはアリかなと思っております。
javascript
1 document.Search.submit(); 2 window.open('../search/result/','result');
ただ、submit()の後の処理は実行されず、window.open()で開かれるコントローラ処理は、submit()より後に行いたいです。
window.open()を先に実行し、window.open()の遷移先でsleep(1)させると想定通りの挙動にはなりますが、あまりスマートでないかなと。。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。