Open takuya-lucky opened 4 years ago
ファイルの編集部分を上記に加えて追加します。 history.php
$start_select = (($now - 1) * 8) + 1;→現在のページの表示の最初を出力
$end_select = $start_select + 7; if ($end_select >= $sum_histories) { $end_select = $sum_histories; } → 現在のページの表示の最後を出力
view history_view.php
ありがとうございます!こちら、本来は商品一覧ページのページネーションが要件ですが、履歴の一覧でよろしかったでしょうか? 本来の選択課題とは異なりますが、難易度的には同等ですので、もしこちらにチャレンジなさるのであれば、こちらで選択課題クリアと見做すことも可能ですので、改めてどちらにチャレンジするか考えてみてくださいね!
大変、失礼いたしました。 せっかくですので、両方のページでページネーションの実装を行いたいと思いますので、改めて、商品一覧ページのページネーションの実装のissueを送りたいと思います。
商品一覧ページでのページネーションの実装を行い、商品の閲覧を快適にします。 商品は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 →新規実装。ページのリンクと次へ・前へのリンクの実装 以上のファイルを変更・新規実装を行います。お手数ですが、確認をお願いいたします。
全件取得してから、表示数を調整するよりも、必要な件数だけ取得した方が良さそうですね!一度教科書のヒントをよく確認してみましょう!
ご指摘いただきありがとうございます。 指摘していたポイントで確認しておきたいことがございますので、再度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;
}
以上が今回のファイルで変更・追加した主な部分になります。 それを踏まえて、全件の取得とは商品一覧のことで、よろしいでしょうか?
ご確認ありがとうございます!今回最も大事なことは、ページネーションの意義、なぜページネーション処理を行うかということですね! 商品をページごとに分けるのは、全ての商品をまとめてDBから読み込んでしまうと、DBの件数が多い場合に非常に大きなデータがサーバのメモリに読み込まれてしまい、動作が遅くなってしまう、あるいはメモリ不足に陥ってしまうということにあります。 そのため、DBから読み込む件数を制限し、必要な件数だけ取得する処理が必要になりますね!そこで用いられるのが最初のヒントにあるLIMIT句になります。
ページネーションを実装し、購入履歴の閲覧を見やすくします。 購入履歴は8回分ごとに表示し、購入履歴の総数から、現在が何件分の表示をしているかも画面に出力します。また、ページ番号をクリックすることで、その履歴を表示しているページにアクセスします。現在のページにはリンクは貼りません。また、次へ・前へのボタンも設置し、現在表示しているページから一つ前・後に移動できるようにします。 その為に、以下のファイルに変更を加えます。 conf const.php
html history.php
model
view history_view.php →8回分の購入履歴の表示とページのリンクを実装 以上の処理を行えるようにします。