jQueryとPHPで大きなページナビを作る-公開スクリプト
2011/08/06
index.php(1)
<?php /* PEARライブラリのPagerクラスが必要 */ require_once "Pager/Pager.php"; /* キャラクターデータの配列 */ $char_data = array( array( 'id' => 'ryu', 'name' => 'リュウ', 'age' => '30', 'special' => '波動拳' ), array( 'id' => 'ken', 'name' => 'ケン', 'age' => '30', 'special' => '昇龍拳' ), array( 'id' => 'guile', 'name' => 'ガイル', 'age' => '35', 'special' => 'サマーソルトキック' ), array( 'id' => 'zangief', 'name' => 'ザンギエフ', 'age' => '35', 'special' => 'スクリュードライバー' ), array( 'id' => 'ehonda', 'name' => 'E.ホンダ', 'age' => '35', 'special' => '百裂張り手' ), array( 'id' => 'chunli', 'name' => '春麗', 'age' => '25', 'special' => 'スピニングバードキック' ), array( 'id' => 'blanka', 'name' => 'ブランカ', 'age' => '30', 'special' => 'エレクトリックサンダー' ), array( 'id' => 'dhalsim', 'name' => 'ダルシム', 'age' => '40', 'special' => 'ヨガフレイム' ), array( 'id' => 'vega', 'name' => 'ベガ', 'age' => '45', 'special' => 'サイコクラッシャーアタック' ), array( 'id' => 'gouki', 'name' => '豪鬼', 'age' => '45', 'special' => '瞬獄殺' ) );まず始めにPEARのページング機能を使うためにPagerファイルを読み込みます。次に表示するデータを配列にして変数$char_dataに入れます。ここでは配列にデータを入れてしまっていますが、通常はデータベースなどからデータを取得すると思います。ただ、簡略化するためここでは配列にしているのです。
index.php(2)
/* ページング初期化のパラメーター */ $params = array( 'itemData' => $char_data, 'perPage' => 3, 'delta' => 1, 'mode' => 'Sliding', 'urlVar' => 'page', 'separator' => '|', 'prevImg' => '<< 前へ', 'nextImg' => '次へ >>', 'spacesBeforeSeparator' => 1, 'spacesAfterSeparator' => 1, 'clearIfVoid' => false, 'firstPagePre' => '', 'firstPageText' => '先頭へ', 'firstPagePost' => '', 'lastPagePre' => '', 'lastPageText' => '最後へ', 'lastPagePost' => '' ); /* Pagerクラス呼び出し */ $pager =& Pager::factory($params); $page_data = $pager->getPageData(); $links = $pager->getLinks(); $page_range = $pager->getPageRangeByPageId(); ?>Pagerクラスのオブジェクトを作成するときに必要な引数を、配列$paramsにあらかじめ指定しておきます。特に重要な項目はデータ元を指定するitemDataと、一ページあたりのアイテム表示数を指定するperPage、ページナビ部分に表示するページ番号の数を指定するdeltaです。Pager機能の詳細についてはPHP Bookというサイトに載っています。 Pagerクラスで作成したオブジェクトは、変数$pagerに入れます。この$pagerからさらにリンク情報やページ番号の範囲などを取得して別の変数に入れておきます。以降はHTML部分です。
index.php(3)
<!-- HTML部分 --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang="ja" xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>jQueryとPHPで見やすいページネーションを作成 - ウィザード・コード | WIZARD-CODE</title> <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/start/jquery-ui.css" type="text/css" media="screen" /> <style type="text/css"> @import url("../../css/reset.css"); @import url("css/jquery.php-pagination.css"); </style> </head> <body> <div id="wrapper"> <div id="container"> <ul id="data_list"> <?php foreach ($page_data as $key=>$character) { ?> <li> <span class="data_name">Name: <?= $character['name'] ?></span> <span class="data_id">ID: <?= $character['id'] ?></span> <span class="data_age">Age: <?= $character['age'] ?>歳</span> <div class="data_special">必殺技: <?= $character['special'] ?></div> </li> <?php } ?> </ul> <div id="page_links" curpage="<?= $pager->getCurrentPageID() ?>" pagerange="<?= $page_range[0].','.$page_range[1] ?>" numpages="<?= $pager->numPages() ?>"><?= $links['all'] ?></div> </div> </div> <div id="page_navi"></div> <script src="https://www.google.com/jsapi"></script> <script type="text/javascript"> // <![CDATA[ google.load('jquery', '1.5'); google.load('jqueryui', '1.8'); google.setOnLoadCallback(function () { jQuery('#page_navi').phpPagination('#page_links', { //オプションがあればここに }); }); // ]]> </script> <script type="text/javascript" src="js/jquery.php-pagination.v1.0.js"></script> </body> </html>個々のページのデータは、ID属性がdata_listのリストに表示するようにしています。そして、通常のページナビを実装する要素をID属性がpage_linksのDIV要素とし、それとは別にビッグサイズのページナビ用にID属性がpage_naviのDIV要素を用意しておきます。ここで、PHPの変数データをjQueryで処理できるように渡すため、PHPサイドでページナビ要素の属性に埋め込むようにしています。ソースを見ていただくとページナビ要素にcurpage、pagerange、numpagesというカスタム属性が指定されているのが分かると思います。 それでは続いてCSSファイルとJSファイルを見ていきたいと思います。
jquery.php-pagination.css(8/4修正)
@charset "UTF-8"; /* (注意)ウェブページのコンテンツ全体をラップする要素に適用します(デフォルトでは#wrapperとなっています) */ div#wrapper { color: #333; font-size: 100%; font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", /*"メイリオ", Meiryo, */Osaka, "MS Pゴシック", "MS PGothic", Verdana, arial, sans-serif; } /* ここからIE6対策用ハック */ * html, * html body { height: 100%; overflow-y: hidden; overflow-x: auto; } * html #wrapper { overflow: auto; position: relative; width: 100%; height: 100%; } /* ここまでIE6対策用ハック */ #page_links { color: #333; } #page_links a:link { color: #0033CC; } #page_links a:visited { color: #9933CC; } #page_links a:hover { color: #0099CC; } #data_list { margin: 0px; padding: 15px 0px; text-align: left; list-style: none; } #data_list li { margin-bottom: 5px; padding: 5px 10px; height: 200px; line-height: 140%; background-color: #ADD8E6; } #page_links { margin-bottom: 80px; } #page_navi { padding: 15px; width: 100%; font-size: 120%; text-align: center; position: fixed !important; position: absolute; bottom: 0px; right: 0px; } #control span#cur_page { margin: 0px 20px; font-size: 120%; font-weight: bold; } #page_navi span#toggle { width: 16px; height: 16px; position: absolute; right: 5px; top: 5px; } #page_navi span#toggle span { left: 0px; } #control a#prev_page, #page_navi a#first_page { margin-right: 15px; font-size: 70%; } #control a#next_page, #page_navi a#last_page { margin-left: 15px; font-size: 70%; } #control a.pages { margin: 0px 5px; }IE6対策のため、コンテンツ部分をラップする要素を用意する必要があります。ここでは#wrapperとなっていますが、ID名は任意です。また、このファイルはリセットCSSと併用しているので、CSSがリセットされていない場合、若干レイアウトに違いが出るかもしれません。
jquery.php-pagination.js(8/6修正)
ソースコードのハイライターがうまく動作せず、空白やクオテーションマークがエンコードされてしまっている箇所があります。JSファイルのリンクがありますので、正確なコードはこちらを参照してください。
(function(jQuery) { var links, settings, url, curPage, pageRange, numPages; jQuery.fn.phpPagination = function(links, options) { links = jQuery(links); settings = jQuery.extend({}, jQuery.fn.phpPagination.defaultOptions, options); url = location.href.match(/.*\?/) !== null ? location.href.match(/.*\?/)[0] : location.href + '?'; curPage = links.attr('curpage') - 0; pageRange = links.attr('pagerange').split(','); pageRange[0] = pageRange[0] - 0; pageRange[1] = pageRange[1] - 0; numPages = links.attr('numpages') - 0; return this.each(function(index) { var element = jQuery(this), control, i, html; control = jQuery('', { id: 'control' }).appendTo(element); element.addClass('ui-widget-header').css('opacity', 0.9).hide(); html = ''; if (curPage > 2) { html += '' + '先頭へ' + ''; } if (curPage !== 1) { html += '' + '前へ' + ''; } for (i = 1; i <= numPages; i++) { if (i === curPage) { html += '' + i + ''; } else if (i >= pageRange[0] && i <= pageRange[1]) { html += '' + i + ''; } if (settings.separator && i >= pageRange[0] && i < pageRange[1]) { html += ' ' + settings.separator + ' '; } } if (curPage !== numPages) { html += '' + '次へ' + ''; } if (curPage < numPages - 1) { html += '' + '最後へ' + ''; } control.html(html); control.children('a').button(); element.append(jQuery('', { 'id': 'toggle' })); element.children('span#toggle').button({ icons: { primary: 'ui-icon-arrowthickstop-1-s' } }).click(function () { control.toggle(); if (control.get(0).style.display != 'none') { jQuery(this).button('option', 'icons', { primary: 'ui-icon-arrowthickstop-1-s' }); } else { jQuery(this).button('option', 'icons', { primary: 'ui-icon-arrowthickstop-1-n' }); } }); if (settings.disabled) { element.children('span#toggle').button('option', 'icons', { primary: 'ui-icon-arrowthickstop-1-n' }); control.hide(); } element.fadeIn('fast'); }); }; jQuery.fn.phpPagination.defaultOptions = { prefix: 'page', separator: '', disabled: false }; }(jQuery))プラグインの呼び出し方は次のようにします。
jQuery('#page_navi').phpPagination('#page_links', { //オプションがあればここに });オプションにはprefix、separator、disabledの指定が可能で、ハッシュ形式で設定します。prefixは、URLの?以下に付くページ番号の接頭語(たいていはpageになることが多い。PHP側の設定と合わせる必要がある)を指定します(デフォルトはpageです)。separatorはページナビのページ番号を区切るセパレーターを指定します。disabledのデフォルトはfalseで、ロード後にページナビをすぐ表示したくないときtrueを指定します。