takuya-lucky / lamp_practice

課題開発用のリポジトリです。
0 stars 0 forks source link

ページネーションの実装 #14

Open takuya-lucky opened 4 years ago

takuya-lucky commented 4 years ago

 ページネーションを実装し、購入履歴の閲覧を見やすくします。  購入履歴は8回分ごとに表示し、購入履歴の総数から、現在が何件分の表示をしているかも画面に出力します。また、ページ番号をクリックすることで、その履歴を表示しているページにアクセスします。現在のページにはリンクは貼りません。また、次へ・前へのボタンも設置し、現在表示しているページから一つ前・後に移動できるようにします。  その為に、以下のファイルに変更を加えます。 conf const.php

html history.php

model

view history_view.php →8回分の購入履歴の表示とページのリンクを実装 以上の処理を行えるようにします。

takuya-lucky commented 4 years ago

ファイルの編集部分を上記に加えて追加します。 history.php

view history_view.php

thisprodigiousgeek commented 4 years ago

ありがとうございます!こちら、本来は商品一覧ページのページネーションが要件ですが、履歴の一覧でよろしかったでしょうか? 本来の選択課題とは異なりますが、難易度的には同等ですので、もしこちらにチャレンジなさるのであれば、こちらで選択課題クリアと見做すことも可能ですので、改めてどちらにチャレンジするか考えてみてくださいね!

takuya-lucky commented 4 years ago

大変、失礼いたしました。 せっかくですので、両方のページでページネーションの実装を行いたいと思いますので、改めて、商品一覧ページのページネーションの実装のissueを送りたいと思います。

takuya-lucky commented 4 years ago

 商品一覧ページでのページネーションの実装を行い、商品の閲覧を快適にします。  商品は8個ごとに表示し、商品の総数から、現在が何個分の表示をしているのか画面に出力します。また、ページ番号をクリックすることで、その商品群を表示しているページにアクセスします。現在のページにはリンクはありません。また、次へ・前へのボタンも設置し、現在表示しているページから一つ前・後に移動できるようにします。  以下のファイルに変更及び新規実装を行います。 html index.php $now = get_now_page(); →新規実装。現在のページ数の取得

$num_items = get_count_items($db); →新規実装。商品の取得

$sum_items = count($num_items); →新規実装。商品の数の取得

$need_view_items = ceil($sum_items / PAGE_VIEW_MAX); →新規実装。全てのデータを表示するのに必要なページ数(商品数/ページに表示できる商品数)を求める

$front_select = get_front_select(); →新規実装。 現在のページの表示範囲の最初を出力

$behind_select = get_behind_select(); →新規実装。現在のページの表示範囲の最後を出力

model item.php function get_items($db, $is_open = false) →変更。LIMITの追加とそれに伴うプレースホルダーの追加

function get_count_items($db) →新規実装。公開されている商品の総数を得る。

functions.php function get_now_page() →新規実装。 ページ数の取得

function get_front_select() →新規実装。現在のページの最初の番号を出す

function get_behind_select() →新規実装。 現在のページの最後の番号を出す

view index_view.php →新規実装。ページのリンクと次へ・前へのリンクの実装  以上のファイルを変更・新規実装を行います。お手数ですが、確認をお願いいたします。

thisprodigiousgeek commented 4 years ago

全件取得してから、表示数を調整するよりも、必要な件数だけ取得した方が良さそうですね!一度教科書のヒントをよく確認してみましょう!

takuya-lucky commented 4 years ago

ご指摘いただきありがとうございます。 指摘していたポイントで確認しておきたいことがございますので、再度issueを送らせていただきます。 まず、全件取得してからの表示ということですが、コード上公開商品のみを商品一覧に表示して、読み取る設定にはなっております。 また、上記の内容で、文字だけでは説明が不足している部分がありましたので、コードも一緒に乗せておきます。 // 現在のページ数の取得 $now = get_now_page(); // ページ数の取得

function get_now_page() {
  if(get_get('page') === '') {
    return $now = 1;
    }
    return $now = get_get('page');
}

// 商品の取得 $num_items = get_count_items($db); // 全ての商品の取得

function get_count_items($db){
  $sql = '
    SELECT
      item_id, 
      status
    FROM
      items
    WHERE 
      status = :status
  ';
  $params = array(':status' => '1');
  return fetch_all_query($db, $sql, $params);
}

$front_select = get_front_select(); →新規実装。 現在のページの表示範囲の最初を出力 // 現在のページの最初の番号を出す

function get_front_select() {
  $now = get_now_page();
  return $num = (($now - 1) * 8) + 1;
}

// 現在のページの表示の最初を出力

$front_select = get_front_select();
if ($front_select > $sum_items) {
  $front_select = $sum_items;
}

$behind_select = get_behind_select(); →新規実装。現在のページの表示範囲の最後を出力 // 現在のページの最後の番号を出す

function get_behind_select() {
  return $behind_select = get_front_select() + 7;
}

// 現在のページの表示の最後を出力

$behind_select = get_behind_select();
if ($behind_select >= $sum_items) {
  $behind_select = $sum_items;
} 

以上が今回のファイルで変更・追加した主な部分になります。 それを踏まえて、全件の取得とは商品一覧のことで、よろしいでしょうか?

thisprodigiousgeek commented 4 years ago

ご確認ありがとうございます!今回最も大事なことは、ページネーションの意義、なぜページネーション処理を行うかということですね! 商品をページごとに分けるのは、全ての商品をまとめてDBから読み込んでしまうと、DBの件数が多い場合に非常に大きなデータがサーバのメモリに読み込まれてしまい、動作が遅くなってしまう、あるいはメモリ不足に陥ってしまうということにあります。 そのため、DBから読み込む件数を制限し、必要な件数だけ取得する処理が必要になりますね!そこで用いられるのが最初のヒントにあるLIMIT句になります。