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

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

ただいまの
回答率

88.93%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,581

gobindar

score 47

お世話になっております。
当方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()がページネーションの現在ページになります

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


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

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

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


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

ルーティング

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

気になっていること

対象のページを初めて見た時や、
新しいページ、新しいタブで開いた時などは
直前に見たページを取得できないことが理由で、
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

宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/02 21:57

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

    ※ページネーションは基本はGETなので何かしら検索条件を維持しているはず。ということは別画面から戻ってきても同じ仕組みを呼び出せばできるはず、という推測です。

    キャンセル

  • 2019/07/16 15:29

    mts10806様

    ご返答に気づかず、大変遅くなり申し訳ありません。
    おっしゃる通り、current_pageをページネーションに横入りさせることで解決致しました。

    参考までに、横入りのコーディングは、下記の通りです
    if(null !== session('previouspage')){
    $currentPage = session('previouspage');
    LengthAwarePaginator::currentPageResolver(function () use ($currentPage) {
    return $currentPage;
    });

    キャンセル

  • 2019/07/16 15:37

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • 詳細画面から検索結果画面に戻った際同じページ(同じ検索済かつ同じページ数)に戻りたい