OSDN Git Service

[add]新着スコアフィードの購読リンク
[hengband/web.git] / score_ranking.php
1 <?php
2 //ini_set('display_errors', 'On');
3
4 ini_set('log_errors', 'On');
5 ini_set('error_log', 'errors/'.pathinfo(__FILE__, PATHINFO_FILENAME).'.log');
6
7 require_once "db_common.inc";
8 require_once "dump_file.inc";
9
10 ini_set('zlib.output_compression', 'On');
11
12
13 /**
14  * ページ情報を計算する
15  *
16  * @param integer $total_data_count 全データ件数
17  * @param integer $start_num GETパラメータで渡された開始データ番号
18  * @param integer $data_count_per_page 1ページあたりのデータ件数
19  *
20  * @return array 計算したページ情報を保持する連想配列
21  */
22 function calc_page_info($total_data_count, $start_num, $data_count_per_page)
23 {
24     $current_page = intval($start_num / $data_count_per_page);
25     $last_page = intval(($total_data_count - 1) / $data_count_per_page);
26     $navi_page_range_start = ($current_page - 5) > 0 ? $current_page - 5: 0;
27     $navi_page_range_count = max(0, min(9, $last_page - $navi_page_range_start));
28     $navi_page_list = range($navi_page_range_start, $navi_page_range_start + $navi_page_range_count);
29
30     $pageinfo['current'] = $current_page;
31     $pageinfo['last'] = $last_page;
32     $pageinfo['navi_list'] = $navi_page_list;
33
34     $pageinfo['total_data_count'] = $total_data_count;
35     $pageinfo['data_count_per_page'] = $data_count_per_page;
36
37     return $pageinfo;
38 }
39
40
41 /**
42  * ページナビゲーションテーブルを表示する
43  *
44  * @param array $pageinfo calc_page_info()関数で取得したページ情報を保持する連想配列
45  */
46 function print_navi_page_table($pageinfo)
47 {
48     if (count($pageinfo['navi_list']) <= 1) return;
49
50     $href_base = preg_replace('/(&?start=\w+)/', '', filter_input(INPUT_SERVER, 'SCRIPT_NAME'));
51     if (strpos($href_base, "?") === FALSE) {
52         $href_base .= "?";
53     }
54
55     echo "<table align='center'>\n"
56         ."<tr>";
57
58     if ($pageinfo['current'] > 0) {
59         $href = $href_base . "&start=". ($pageinfo['current'] - 1) * $pageinfo['data_count_per_page'];
60         echo "<td><a href={$href}>&lt; 前へ</a></td>";
61     }
62
63     foreach ($pageinfo['navi_list'] as $page) {
64         $page_num = $page + 1;
65         $href = $href_base . "&start=". $page * $pageinfo['data_count_per_page'];
66         if ($page === $pageinfo['current']) {
67             echo "<td>$page_num</td>";
68         } else {
69             echo "<td><a href={$href}>$page_num</a></td>";
70         }
71     }
72
73     if ($pageinfo['current'] < $pageinfo['last']) {
74         $href = $href_base . "&start=". ($pageinfo['current'] + 1) * $pageinfo['data_count_per_page'];
75         echo "<td><a href={$href}>次へ &gt;</a></td>";
76     }
77
78     echo "</tr>\n"
79         ."</table>\n";
80 }
81
82
83 /**
84  * スコアランキングテーブルを表示する
85  *
86  * @param array $scores スコア
87  * @param integer $rank_start 順位の開始番号(0オリジン)
88  */
89 function print_score_table($scores, $rank_start)
90 {
91     echo <<<EOM
92 <table align='center' border=1>
93 <tr>
94 <th>順位</th>
95 <th>スコア</th>
96 <th>日付</th>
97 <th>名前</th>
98 <th>種族</th>
99 <th>職業</th>
100 <th>性別</th>
101 <th>死因</th>
102 </tr>
103
104 EOM;
105
106     foreach($scores as $idx => $score) {
107         $rank = $rank_start + $idx + 1;
108         $date = substr($score['date'], 0, 10); // 日時から日付部分を取り出す
109         $sex_str = $score['sex'] ? "男" : "女";
110         $depth = !$score['winner'] ? $score['depth']."階, " : "";
111         $realms = isset($score['realms_name']) ? "(".$score['realms_name'].")" : "";
112         $dumpfile = new DumpFile($score['score_id']);
113
114         echo "<tr>\n";
115         if ($dumpfile->exists('dumps', 'txt')) {
116             $name = "<a href=\"show_dump.php?score_id={$score['score_id']}\">{$score['personality_name']}{$score['name']}</a>\n";
117         } else {
118             $name = "{$score['personality_name']}{$score['name']}";
119         }
120         echo <<<EOM
121 <td>$rank</td>
122 <td align="right">{$score['score']}</td>
123 <td><nobr>$date</nobr></td>
124 <td>$name</td>
125 <td>{$score['race_name']}</td>
126 <td>{$score['class_name']}$realms</td>
127 <td>$sex_str</td>
128
129 EOM;
130         if ($dumpfile->exists('screens', 'html')) {
131             echo "<td><a href=\"show_screen.php?score_id={$score['score_id']}\">{$score['death_reason']}</a>";
132         } else {
133             echo "<td>{$death_reason}";
134         }
135         echo "<br>({$depth}{$score['version']})</td>\n";
136         echo "</tr>\n";
137     }
138     echo "</table>\n";
139 }
140
141 $db = new ScoreDB();
142
143 $start_num = filter_input(INPUT_GET, 'start', FILTER_VALIDATE_INT) ?: 0;
144 $search_result = $db->search_score($start_num, 50);
145
146 $pageinfo = calc_page_info($search_result['total_data_count'], $start_num, 50);
147 ?>
148
149 <!DOCTYPE html>
150
151 <html>
152 <head>
153 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
154 <meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />
155 <title>変愚蛮怒 スコア ランキング</title>
156 <link rel="alternate" title="変愚蛮怒 新着スコア" href="feed/newcome-atom.xml" type="application/atom+xml" />
157 </head>
158
159 <body>
160 <h1>変愚蛮怒 歴代スコア (<?php echo $db->get_sort_mode_name(); ?>)</h1>
161 <!--3日以内のスコアは<font color=red>赤</font>、10日以内のスコアは<font color=blue>青</font>で表示されます。<br>-->
162 <!--10日以内のスコアは<strong>強調表示</strong>されます。-->
163 <div align="right">
164 <a href ="feed/newcome-atom.xml"><img src="feed/feed-icon-14x14.png">新着スコア購読</a>
165 <!--<small>…スコア受信時に自動生成します。URLをRSSリーダー等に登録すると新着スコアをチェックできます。</small>-->
166 </div>
167
168 <hr>
169 <small>
170 <?php
171 echo sprintf("件数 %d 件 (%.2f 秒)", $search_result['total_data_count'], $search_result['elapsed_time']);
172 ?>
173 </small>
174
175 <?php
176 print_navi_page_table($pageinfo);
177 print_score_table($search_result['scores'], $pageinfo['current'] * $pageinfo['data_count_per_page']);
178 print_navi_page_table($pageinfo);
179 ?>