PHP + Smartyで超簡単なページング処理とサンプルコード

2019-01-26
%E6%9C%AA%E5%88%86%E9%A1%9Ephpsmarty%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0
    

目次

概要

PHPで簡単なページング処理を書いてみました。

環境

  • PHP 7.1.19
  • Smarty 3.1.33

Smartyのセットアップ

GitHubから適当なバージョンの物を落としてきます。 PHPのインクルードディレクトリに配置すれば完了。

https://github.com/smarty-php/smarty/releases

Smartyの使い方は公式を参照してください。

https://www.smarty.net/

作るもの

簡単なページング処理を作ります。 具体的には、ある取得したデータ(サンプルソースでは51件)に対し1ページに10件まで表示する機能を想定します。

ここで、ページの現在のステータスと、次もしくは前のページのリンクを表示する機能を実装します。

例えば 51件のアイテムを6ページにわけて10個づつ表示したい時、

最初の1ページ目は

1 / 6 ページ 次へ

2ページ目は

戻る 2 / 6 ページ 次へ

3ページ目は

戻る 3 / 6 ページ 次へ

最後のページは

戻る 6 / 6 ページ

という機能になります。

ソース

以下がソースコードです。

index.php

include_once("smarty/libs/Smarty.class.php");

main();

exit(0);

/**
 * main
 */
function main()
{
    $smarty = new Smarty();
    $smarty->template_dir = '/path/to/templates/';
    $smarty->compile_dir  = '/path/to/cache/';

    $p = (int) $_GET["p"]; //現在のページ番号
    $items_count = 51; // 表示したいアイテム数
    $items_limit = 10; // 1ページの上限

    // 最初のページ番号
    $min = 1;
    // 最後のページ番号
    $max = (int) ceil($items_count / $items_limit);

    $page = pagenation($p, $min, $max);

    smartyBindValue(
        $smarty,
        [
            "last" => $page["last"],
            "next" => $page["next"],
            "status" => sprintf("%s/%s ページ", $p, $max),
        ]
    );

    $smarty->display('index.tpl');
}

/**
 * アイテムセット
 * 
 * @param object &$smarty smartyオブジェクト
 * @param array $items アイテム配列
 * @return void
 */
function smartyBindValue(&$smarty, $items)
{
    foreach ($items as $key => $value) {
        $smarty->assign($key, $value);
    }
}

/**
 * ページ数計算
 * 
 * @param int $p 現在のページ番号
 * @param int $min 最初のページ番号 
 * @param int $max 最後のページ番号
 */
function pagenation($p, $min, $max)
{
    $last = null;
    $next = null;

    // 範囲外か
    if (!($min <= $p && $p <= $max)) {
        $p = 1; //強制的に1ページ目へ
    }

    // 最初のページか ?
    if ($p === $min) {
        return [
            "next" => $min + 1,
            "last" => null,
        ];
    }

    // 最後のページか ?
    if ($p === $max) {
        return [
            "next" => null,
            "last" => $max - 1,
        ];
    }

    return [
        "next" => $p + 1,
        "last" => $p - 1,
    ];
}

ポイントとなるのがページ数の計算です。 ページ数は以下の式で算出できます。

// $items_count 全件アイテム数
// $items_limit 1ページの上限
$max = (int) ceil($items_count / $items_limit); // 最後のページ番号

ceil関数は少数を切り上げするため、ceil(51 / 10)の時は $max = 6となります。 またこの時、$maxはfloat型であり、PHPではゆるい比較もできるため、念の為 int にキャストします。

テンプレート

テンプレートはメインの内容が記述されている、index.tpl と ページネーションのみを描画する page.tpl に切り分けます。

index.tpl

<!DOCTYPE>
<html>
<head>
</head>
<body>
{include file="page.tpl"}
</body>
</html>

page.tpl

{if $last != null}
<a href="/?p={$last}">戻る</a>
{/if}
<span>{$status}</span>
{if $next != null}
<a href="/?p={$next}">次へ</a>
{/if}
    
s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV

関連記事

WordPressのDBから記事データを抽出する
WordPressのDB関連図 公開記事一覧の取得 タグ・カテゴリの取得 サムネイルの取得 おまけ: PHPスクリプト化しました 参考にしたところ WordPressにため込んだデータMarkdown化しGatsby…

PHPerkaigi 2020 資料まとめ
資料 もっと気軽にOSSに Pull Requestを出そう!/ Let's make a PR to OSS more easily PHP で JVM を実装して、 HelloWorld を出力してみる Deep Module in PHP 磯野ー、MySQL…

Ubuntu18.04にApache MariaDB PHP7.2 をセットアップ
環境情報 モジュール類の更新 Apacheのインストール PHP7.2のインストール インストール 動作確認 MariaDBのセットアップ MariaDBのインストール データベースと作業用ユーザの作成 参考 AWS の EC2 の Ubuntu18.0…

AWS S3のオブジェクト一覧をPHPで表示させる
S3アカウント サンプル AWS S3のオブジェクト一覧をPHPで表示させるサンプルコードの紹介. S3アカウント S3バケット参照用のユーザの作成方法は以下を参照してください。 https://tech-blog.s-yoshiki.com/2019/0…

PHPで簡単ページング処理を実装する サンプルコード
環境 作るもの ソース PHPで簡単なページング処理を書いてみました。 環境 PHP 7.1.19 Smarty 3.1.33 作るもの 簡単なページング処理を作ります。 具体的には、ある取得したデータ(サンプルソースでは51件)に対し1ページに1…

PHPにSmartyをセットアップ
試した環境 Smartyについて ダウンロード smartyの配置 Smarty呼び出し PHPにSmartyをセットアップをするメモ 試した環境 PHP 7.1.19 Smarty 3.1.33 Smartyについて https://www.smarty…

ファイルベースで動くPHPのCMS「Grav」の紹介とインストールとセットアップまで
Gravについて 他のCMSの比較 環境 インストール Gitでのインストール PHPビルトインサーバで起動する Apache + Linuxで起動する Apache パーミッションの設定 トラブルシューティング Flat-File CMS(RDBMS…

素因数分解を行うプログラム サンプルコード JS/PHP
サンプルコード JavaScript PHP ある任意の正の整数の素因数を配列で返すサンプルコードを紹介します。 サンプルコード JavaScript パターン1 : 純粋な素因数分解 デバッグ パターン2 : 指数部と仮数部に分ける デバッグ PHP

途中return禁止、goto禁止の時のdo~while(0)
はじめに 構造化 参考 goto do~while(0)を使う try ~ catchを使う その他 環境 はじめに 細かいロジックが多い手続き型のプログラムを書こうと思った時のメモ。…

AWS Lightsail + bitnami に自作アプリケーションを作って共存させる + ドメイン振り分け設定
はじめに 環境 アプリケーションの作成 Apache - Virtual Hostの設定 ディレクトリ構成 設定ファイルの説明 certs/server.key & server.crt httpd-app.conf httpd-prefix.conf httpd…

最新の投稿

GitHub Actions で Gatsby をビルドし Amazon S3 にデプロイする
GitHub Actions について あらかじめ準備しておくもの AWS IAM ユーザを環境変数にセットする workflowの記述 ビルド バッジを利用する 終わりに 参考にしたところ Gatsbyで作った静的サイトを、GitHub Actions…

cloudinaryによる画像ファイルの管理 はじめてみる
目的 cloudinary について 他のサービスとの比較 料金プラン アカウントの登録 利用してみる ダッシュボード 画像の編集 APIベースでのアクセス 感想 参考 画像の管理や配信、さらには加工といった事ができるsaas型のcloud…

JavaScriptによる2分探索(バイナリサーチ) のサンプルコード
2分探索について ソース 参考 JavaScriptで2分探索(バイナリサーチ)を実装してみました。…

Vue.jsで作成された、ちょっと面白くて役立ちそうなサービス
UIコンポーネント VueSocial CKEditor 5 Vue.Draggable Vuetable 2 vuejs-datepicker Kalendar Vue Apexcharts Vue.js Google Charts vue-cart WebIDE…

GitHubのリポジトリをGitLabに同期する GitLabのミラーリング機能
GitLabのミラーリングについて GitHubのリポジトリをGitLabに反映する その他 参考 GitLabのミラーリング機能によりGitHubなどの外部のリポジトリとのミラーリングを行うことができます。 これを使ってGitHub…

WordPressやめます Gatsbyに移行しました
これまでのWordPress運用 なぜWordPressを捨てるのか? なぜGatsbyを利用するのか? gatsbyについて WordPressから記事の救出 移行対象記事の抽出 記事の置換 Gatsbyテーマの作成 Gatsby…

WordPressのDBから記事データを抽出する
WordPressのDB関連図 公開記事一覧の取得 タグ・カテゴリの取得 サムネイルの取得 おまけ: PHPスクリプト化しました 参考にしたところ WordPressにため込んだデータMarkdown化しGatsby…

ハイフンとかマイナスとかダッシュとか

Firebase + Nuxt で認証付きページを作るときに参考にしたいところ
Webアプリケーションのセッション管理にJWT導入を検討する際の考え方 Service Worker によるセッション管理 ユーザー セッションの管理 Nuxt.jsとFirebaseでSPA×SSR×PWA×サーバーレスを実現する CookieとセッションとJWT SSR…

GolangをCGIとして実行する
環境 golang パッケージ ソースと実行 ビルドとサーバ実行 標準ライブラリのみ Golang を CGIとして実行する際のメモ 環境 golang パッケージ 以下のモジュールを利用しています。 github.com/gorilla/mux…

Tags

Dates

© 2020   404 motivation not found