質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

8772閲覧

詳細画面から検索結果画面に戻った際同じページ(同じ検索済かつ同じページ数)に戻りたい

gobindar

総合スコア51

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/03/27 09:44

編集2019/03/29 06:21

お世話になっております。
当方Laravel5.5にてWebSiteを構築しております、
環境はmac OS Mojave10.14.2
ブラウザはGoogle Chrome バージョン: 71.0.3578.98になります。

前提

データの検索結果画面(データがExcelの表のように一覧で見れる)
を実装しました。(Laravel5.5でpaginationもLengthAwarePaginatorにて実装済)
一覧上の各レコードには「詳細」リンクがあり、
詳細画面に移ることができます。

やりたいこと

下記⑧の通り、
詳細から一覧に戻る際、
元いた画面(検索済で、かつ、同じページ)に戻りたいです。

①検索をかける(キーワード:teratail)
②キーワードteratailを持つデータがヒットし一覧表示される
③一覧の2ページ目に移る
④2ページ目が表示される
⑤どのレコードかの詳細ボタンをクリックする
⑥詳細画面に移る
⑦戻るボタンをクリックする
⑧元いた④の画面に移る

考えたこと

詳細画面にキーワードと現在ページを渡し、戻ってくる時に
渡したキーワードを使用して再度検索、
元いたページ数をルーティングの機能の内のどこかに入れれば
できるのでは?と考えました。
しかし、元いたページ数を渡した後、どのように
そのページを指定して(どこに渡せば)
同じページに戻れるのかわからず困っています。
(元いた一覧ページは
http://localhost:XXXX/show_data?keyword=teratail&page=2
のようになっていますが、文字列結合でpage=2をurl指定して
遷移させるなど乱暴なことをしてはいけない気がしていて、(感覚ですが…)
踏み込めずにいます)

一覧画面のview(詳細リンク部分)
$data->currentPage()がページネーションの現在ページになります

php

1 <td style="width:80px; text-align:center;"><a href="{{ route('show_data_detail', ['keyword'=> $keyword,'previouspage'=>$data->currentPage()]) }}">詳細</a></td>

この後は、Controllerでリクエストから変数(keywordとpreviouspage)を取ってそのまま詳細画面に渡しています。

詳細画面のview(戻るボタン)

php

1 <form action="{{ route('show_data') }}" method="post"> 2 {{ csrf_field() }} 3 <input type="hidden" name="keyword" value='{{$keyword}}'> 4 <input type="hidden" name="previouspage" value='{{$previouspage}}'> 5 <button type="submit" class="btn-outline-success btn btn_flat"> 6 戻る 7 </button>

この後、一覧画面のコントローラーでは、keywordからデータベースの検索をして、
一覧を表示するようにしているので、
現在渡ってきたpreviouspageは使えていません。

ルーティング

php

1Route::get('/show_data', 'ShowdataController@show_data_searched')->name('show_data')->middleware('auth'); 2Route::post('/show_data', 'ShowcaseController@show_data_searched')->name('show_data')->middleware('auth'); 3Route::get('/show_data_detail', 'ShowdataController@show_data_detail')->name('show_data_detail')->middleware('auth'); 4

気になっていること

対象のページを初めて見た時や、
新しいページ、新しいタブで開いた時などは
直前に見たページを取得できないことが理由で、
url()->previous()を他のページ(データのアップロード画面など)で
使っていなかったため、今回も使用していません。

しかし、
そもそもurl()->previous()にエラーページを設定すれば問題ないので、
(参考:https://www.nyamucoro.com/entry/2018/05/09/200600)
前ページへの移動は上記の「考えたこと」の様に再検索など行わないのが普通、
であればご指摘頂けますとありがたいです。

追記(3/29 15:07)

paging後のデータのcurrentPageを
上書きしてviewに渡せればよいかと考え、
方法を検索しましたが、
LengthAwarePaginatorにて
(記載が漏れていたため前提項にも追記しました)
setcurrentPage()といったメソッドはない(※)ようで、
"overwrite current page laravel pagination"
"overwrite current page LengthAwarePaginator"
"LengthAwarePaginator method"
といったキーワードで検索するもなかなか方法がみつかりません。

※参考:https://laravel.com/api/5.0/Illuminate/Pagination/LengthAwarePaginator.html

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ルーティング・URLに持って回るのは賢明とは言えません。
原則として現在の画面に表示されている以外の情報を持ってはいけません。
REQUESTを取得する際にキーが被ってしまうこともあるからです。

セッションに持っておいて適宜引き出すと良いです。

投稿2019/03/27 13:29

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gobindar

2019/03/27 13:53

mts10806様 ご回答ありがとうございます。 ご指摘の通りキーワードはセッションに持つ方針と致します。 URLに持たないとなると、 ページ番号をURLに入れて遷移させる方法は取れなさそうですが、 url()->previous()が適切でしょうか?
m.ts10806

2019/03/27 21:31

ページ番号もDBからしたら検索条件の1つですよね
gobindar

2019/03/29 05:28

詳細ページから一覧ページに戻る際、 つまりデータベースからpaginateして値を取得する際、 CurrentPageを上書きして、1ではなくセッションに保持していた以前のページ としてviewに渡すという意味であっていますでしょうか?
m.ts10806

2019/03/29 05:58

まずそのあたりは百聞は一見にしかず、で、やってみてください。
gobindar

2019/03/29 06:23

質問文に追記いたしましたのでご確認頂けますと幸甚です。 頼りっきりで大変申し訳ないのですがなかなかやり方が見つからないんです… やれることがあれば全て試したいのですが… この箇所だけに半日以上費やしております…
m.ts10806

2019/03/29 07:18

フレームワーク介するのでそう簡単ではないとは思います。 数日程度ならまだマシな方です。 ちょっと確認したいのですが、ページネーション導入されてますよね? ページネーションでのページ遷移ではちゃんと検索条件維持できてますか? 理屈としては同じ+ページ番号 と思って良いです。 検索自体はpostですが、ページネーションによるページ遷移はgetなので。
gobindar

2019/03/30 09:26 編集

ページ遷移では検索条件維持できています。 ただ、検索条件に関してページネーション以外に 私の手は入れてないです。 (データベースから値を取るときにpaginateして、 その時にページの割り振りがされているので、 その固まった値から動く、つまり取ったデータが再度検索 されることは無いようです。) ちなみに、詳細から戻るときは、 検索条件はurlで持ち回りして、 (これはご指摘の通りセッションでの持ち回りに 修正予定です) 戻る時は再度コントローラに値を 渡して検索してしまっているので、 残念ながら同じやり方ではページ番号でできないです…
m.ts10806

2019/04/02 12:57

すみません。コメント気づきませんでした。 https://readouble.com/laravel/5.8/ja/pagination.html#converting-results-to-json 見た感じ、current_pageとか持ってるのでページ番号も指定できそうに思います。 さいあく、同ページにある「独自ペジネータ作成」でがんばるしかないかもしれませんね。 いずれにしても検索祭実行の際はPOSTかセッションかは選ぶ必要がありますが。 ※ページネーションは基本はGETなので何かしら検索条件を維持しているはず。ということは別画面から戻ってきても同じ仕組みを呼び出せばできるはず、という推測です。
gobindar

2019/07/16 06:29

mts10806様 ご返答に気づかず、大変遅くなり申し訳ありません。 おっしゃる通り、current_pageをページネーションに横入りさせることで解決致しました。 参考までに、横入りのコーディングは、下記の通りです if(null !== session('previouspage')){ $currentPage = session('previouspage'); LengthAwarePaginator::currentPageResolver(function () use ($currentPage) { return $currentPage; });
m.ts10806

2019/07/16 06:37

解決されたようで何よりです
guest

0

もうクリックされたらiframe+モーダルにしよう

投稿2019/04/08 20:48

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問