OSDN Git Service

[modify]死亡場所の詳細な表示をするようにしたので既存の階数を削除
[hengband/web.git] / score / 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 "common.inc";
8 require_once "db_common.inc";
9 require_once "dump_file.inc";
10 require_once "web_template.inc";
11
12 ini_set('zlib.output_compression', 'On');
13
14
15 /**
16  * ページ情報を計算する
17  *
18  * @param integer $total_data_count 全データ件数
19  * @param integer $start_num GETパラメータで渡された開始データ番号
20  * @param integer $data_count_per_page 1ページあたりのデータ件数
21  *
22  * @return array 計算したページ情報を保持する連想配列
23  */
24 function calc_page_info($total_data_count, $start_num, $data_count_per_page)
25 {
26     $current_page = intval($start_num / $data_count_per_page);
27     $last_page = intval(($total_data_count - 1) / $data_count_per_page);
28     $navi_page_range_start = ($current_page - 5) > 0 ? $current_page - 5: 0;
29     $navi_page_range_count = max(0, min(9, $last_page - $navi_page_range_start));
30     $navi_page_list = range($navi_page_range_start, $navi_page_range_start + $navi_page_range_count);
31
32     $pageinfo['current'] = $current_page;
33     $pageinfo['last'] = $last_page;
34     $pageinfo['navi_list'] = $navi_page_list;
35
36     $pageinfo['total_data_count'] = $total_data_count;
37     $pageinfo['data_count_per_page'] = $data_count_per_page;
38
39     return $pageinfo;
40 }
41
42
43 /**
44  * ページナビゲーションテーブルを出力する
45  *
46  * @param resource $fp 出力先リソースへのハンドル
47  * @param array $pageinfo calc_page_info()関数で取得したページ情報を保持する連想配列
48  */
49 function print_navi_page_table($fp, $pageinfo)
50 {
51     if (count($pageinfo['navi_list']) <= 1) {
52         return;
53     }
54
55     $href_base = filter_input(INPUT_SERVER, 'SCRIPT_NAME')."?"
56                .preg_replace('/(&?start=\w+)/', '', filter_input(INPUT_SERVER, 'QUERY_STRING'));
57     if (strpos($href_base, "?") === false) {
58         $href_base .= "?";
59     }
60
61     fwrite($fp, "<table align='center'>\n"
62            ."<tr>\n");
63
64     if ($pageinfo['current'] > 0) {
65         $href = $href_base . "&start=". ($pageinfo['current'] - 1) * $pageinfo['data_count_per_page'];
66         fwrite($fp, "<td><a href={$href}>&lt; 前へ</a></td>\n");
67     }
68
69     foreach ($pageinfo['navi_list'] as $page) {
70         $page_num = $page + 1;
71         $href = $href_base . "&start=". $page * $pageinfo['data_count_per_page'];
72         if ($page === $pageinfo['current']) {
73             fwrite($fp, "<td>$page_num</td>\n");
74         } else {
75             fwrite($fp, "<td><a href={$href}>$page_num</a></td>\n");
76         }
77     }
78
79     if ($pageinfo['current'] < $pageinfo['last']) {
80         $href = $href_base . "&start=". ($pageinfo['current'] + 1) * $pageinfo['data_count_per_page'];
81         fwrite($fp, "<td><a href={$href}>次へ &gt;</a></td>\n");
82     }
83
84     fwrite($fp, "</tr>\n"
85            ."</table>\n");
86 }
87
88
89 /**
90  * スコアランキングテーブルを出力する
91  *
92  * @param resource $fp 出力先リソースへのハンドル
93  * @param array $scores スコア
94  * @param integer $rank_start 順位の開始番号(0オリジン)
95  */
96 function print_score_table($fp, $scores, $rank_start)
97 {
98     fwrite(
99         $fp,
100         <<<EOM
101 <table class="score">
102 <thead>
103 <tr>
104 <th>順位</th>
105 <th>スコア</th>
106 <th>日付</th>
107 <th>名前</th>
108 <th>種族</th>
109 <th>職業</th>
110 <th>性別</th>
111 <th>死因</th>
112 </tr>
113 </thead>
114
115 EOM
116     );
117
118     fwrite($fp, "<tbody>\n");
119     foreach ($scores as $idx => $score) {
120         $rank = $rank_start + $idx + 1;
121         $date = substr($score['date'], 0, 10); // 日時から日付部分を取り出す
122         $sex_str = $score['sex'] ? "男" : "女";
123         $realms = isset($score['realms_name']) ? "(".$score['realms_name'].")" : "";
124         $dumpfile = new DumpFile($score['score_id']);
125
126         $name = h("{$score['personality_name']}{$score['name']}");
127         if ($dumpfile->exists('dumps', 'txt')) {
128             $name = "<a href=\"show_dump.php?score_id={$score['score_id']}\">{$name}</a>";
129         }
130         fwrite(
131             $fp,
132             <<<EOM
133 <tr>
134 <td>$rank</td>
135 <td class="number">{$score['score']}</td>
136 <td><nobr>$date</nobr></td>
137 <td>$name</td>
138 <td>{$score['race_name']}</td>
139 <td>{$score['class_name']}$realms</td>
140 <td>$sex_str</td>
141
142 EOM
143         );
144         $death_reason = h($score['death_reason']);
145         if ($dumpfile->exists('screens', 'html')) {
146             fwrite($fp, "<td><a href=\"show_screen.php?score_id={$score['score_id']}\">{$death_reason}</a>");
147         } else {
148             fwrite($fp, "<td>{$death_reason}");
149         }
150         fwrite($fp, "<br>(".h($score['version']).")</td>\n".
151                "</tr>\n");
152     }
153     fwrite($fp, "</tbody>\n");
154     fwrite($fp, "</table>\n");
155 }
156
157 $db = new ScoreDB();
158
159 $start_num = filter_input(INPUT_GET, 'start', FILTER_VALIDATE_INT) ?: 0;
160 $search_result = $db->search_score($start_num, 50);
161
162 $pageinfo = calc_page_info($search_result['total_data_count'], $start_num, 50);
163
164
165 $wt = new WebTemplate();
166 $wt->set_title("変愚蛮怒 スコアランキング");
167 $wt->add_head_contents('<meta name="robots" content="none" />');
168 $wt->add_head_contents('<link rel="stylesheet" type="text/css" href="css/score-table.css">');
169 $fp = $wt->main_contents_fp();
170 fprintf($fp, "<h2>変愚蛮怒 歴代スコア (%s)</h2>\n", $db->get_sort_mode_name());
171 fprintf(
172     $fp,
173     <<<EOM
174 <div align="right">
175 <small>
176 件数 %d 件 (%.2f 秒)
177 </small>
178 </div>
179
180 EOM
181     ,
182     $search_result['total_data_count'],
183     $search_result['elapsed_time']
184 );
185
186 print_navi_page_table($fp, $pageinfo);
187 print_score_table($fp, $search_result['scores'], $pageinfo['current'] * $pageinfo['data_count_per_page']);
188 print_navi_page_table($fp, $pageinfo);
189
190 $wt->print_page();