• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPページャーの実装方法)

PHPページャーの実装方法

このQ&Aのポイント
  • PHPページャーを実装する方法について説明します。
  • 管理画面から生年月日や時間を入力することで、個人のプロフィールを表示するPHPページです。
  • 管理画面で入力したデータをページャーで表示する方法を解説します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ページャーの実装方法はいろいろありますが、一番簡単なものを実装してみました。 実装するに当たり、大分スクリプトを書き換えてしまいましたが、ご勘弁を。 18行目あたりの記述と、53行目あたりの記述、また、create_pager関数のあたりがページャーの実装というところです。 <?php define('FC', 16); define('DATA_LIMIT', 10); define('LOG_FILE_PATH', '../1.txt'); mb_http_output('SJIS'); mb_internal_encoding('UTF-8'); require_once '../Smarty.class.php'; $DATA_KEYS = array( 'rank', 's_name', 'old_years', 'body_style', 'work_time', 'time_wait', 'comment', 'pic_path', 'img_href', 'name_href', 'i_href' ); $page = 1; if(isset($_GET['page'])){ $page = (int) $_GET['page']; if($page == 0) $page = 1; } ob_start('mb_output_handler'); $smarty = new Smarty(); $smarty->template_dir = '../templates/'; $smarty->compile_dir = '../templates_c/'; $smarty->config_dir = '../configs/'; $smarty->display('i_header1.tpl'); if (file_exists(LOG_FILE_PATH) && is_readable(LOG_FILE_PATH)){ $wait_data = array(); $fp = fopen(LOG_FILE_PATH, 'r'); while(!feof($fp)){ $buff = array(); for($j=0; $j<FC; $j++){ $buff[] = rtrim(fgets($fp, 4096)); } if(isset($buff[FC-1]) && $buff[FC-1] == "1"){ $wait_data[] = format_array($buff); } } if(!empty($wait_data)){ usort($wait_data, "cmp"); $start = ($page - 1) * DATA_LIMIT; $end = ($page * DATA_LIMIT); $data_count = count($wait_data); if($data_count <= $end){ $end = $data_count; } for($i=$start; $i<$end; $i++){ foreach($DATA_KEYS as $key){ $smarty->assign($key, $wait_data[$i][$key]); } $smarty->display('i_wait2.tpl'); } $smarty->assign('pager', create_pager($data_count, $page)); $smarty->display('i_footer1.tpl'); }else{ exit('logがありません'); } }else{ exit('logファイルが開けません'); } function create_pager($data_count, $this_page){ $script = $_SERVER['PHP_SELF']; $pages = ceil($data_count / DATA_LIMIT); $ret = array(); for($i=1; $i<$pages+1;$i++){ if($i == $this_page){ $ret[] = $i; }else{ $ret[] = '<a href="'.$script.'?page='.$i.'">'.$i.'</a>'; } } return implode(' | ', $ret); } function format_array($data){ global $DATA_KEYS; $ret = array(); foreach($DATA_KEYS as $num => $name){ $ret[$name] = $data[$num]; } $wait_time_str = get_wtime_str($data[$num+1]); if($wait_time_str !== false){ $ret['time_wait'] = $wait_time_str; } return $ret; } function get_wtime_str($diff){ $time = time(); if($diff <= $time) return false; $diff = ceil($diff - $time); $m = ceil($diff / 60); $h = ceil($diff / (60*60)); $d = ceil($diff / (60*60*24)); if($m <= 60){ $num = 60; for($i=5; $i<60; $i+=5){ if($m <= $i){ $num = $i; break; } } return "{$num}分待ち"; }elseif($h <= 24){ return "{$h}時間待ち"; } return false; } function cmp($a, $b){ return strcmp($a['rank'], $b['rank']); } ?>

suguru_h
質問者

お礼

hogehoge78様 回答ありがとうございました。 たいへん助かりました。 早速試してみたところ、うまく動作しました。 ところでhogehoge78様が作られたものではフッターのテンプレートにpagerを挿入することで表示することは出来たのですが、ヘッダーのテンプレートに挿入した時は、表示が出来ませんでした・・。 仮にヘッダーのテンプレートにも表示させたい場合は、なにか付け加える必要があるのでしょうか? また質問と少し離れるかも知れませんが、最初に当方で掲載したスクリプトを書き換えられた理由を教えていただけますでしょうか? 恥ずかしながらどうして書き換える必要があったのかすら、分からないのです・・。 お手隙な折にご回答くださいませ。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

■ヘッダにもページャを表示するために >$smarty->display('i_header1.tpl'); の記述を、 $data_count = count($wait_data); の後ろに持ってきて、 $smarty->assign('pager', create_pager($data_count, $page)); の記述を、$smarty->display('i_header1.tpl'); の上に持ってくれば恐らくいけます。 ■なぜ書き換えたのかについて ページャの実装は、ソース見ていただくと分かるとおり、 取得したデータの件数をカウントする必要があります。 また、適当なことを書いて実際に上手く動かないといった場合 何度も修正コードを投稿せねばならない可能性があります。 その為、今回質問者さんの投稿されたソースを理解する必要があり、 かつ、どこに挿入すれば上手く動くかを検討するために 一度テスト環境に同様なディレクトリ構成(require_onceや、file関数で取得しているパスとか)をつくって、実際に実行して試してます。 しかしながら、okwaveの投稿は、ソースのインデントが表示されないのと、今回のソースの内容が煩雑で分かりづらかった為、 理解した順番にソースを記述していきました。 その際、効率の悪い記述(関数にまとめたら楽そうな部分とか)や、 適していない関数(正規表現を使わない置換でereg_replaceを使うよりかは、str_replaceのほうが良い)などを適当に切り分けて まとめてしまいました。 ついでに、PHPはまだ初心者と仰られていましたので、「こういう書き方も出来る」というのをお伝えしたかったというのもまた一つの理由です。 もし、問題があるのであれば、必要箇所(ページャの考え方)だけ抽出して、元のコードに当てはめて頂ければと思います。

suguru_h
質問者

お礼

回答ありがとうございました。 hogehoge78様の方法にてヘッダーにも表示することが可能になりました。 書き換えのことに関しては全く問題はないのですが、不思議に思った為伺いました。 PHPに関してはまだまだお伺いしたいことがございますが、色々試して挑戦し、壁にぶつかった際、あらためて質問をたてます。 この度は貴重なお時間を割いて頂き、ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A