スタッフブログ
ユーザがサマータイムかどうか、そしてサマータイムのオフセットをいくつか、といったデータはユーザがどこに住んでいるか分かっている必要があります。PHP5.2では、タイムゾーンとサマータイムを考慮した、タイムゾーン識別子をいくつも用意してくれています。識別子一覧の取得方法は前回のブログで書きました。識別子の大部分は、地域/都市名という書式になっています。
サマータイムを反映するには、内部的にユーザデータとタイムゾーン識別子を紐付けておく必要があるでしょう。そのため、こうしたシステムでユーザに識別子を選んでもらうインターフェイスが必要になります。今回は、タイムゾーン識別子一覧からセレクトボックスを作る方法を説明しようと思います。
前回の記事に引き続き、PHPのDateTimeZoneクラスを継承したRyus_DateTimeZoneクラスを使って、実装してみようと思います。今回、新しく、Ryus_DateTimeZoneに以下のメソッドを追加しました。識別子は、地域・国都市の順にスラッシュで区切られています。このメソッドは、地域と国都市に分解して、多次元配列にして返すものです。PHP5で非推奨になった修飾子とUTCは除外されます。
public static function getIdentifiersAsArray() { $identifiers = self::listIdentifiers(); $result = array(); foreach ( $identifiers as $identifier ) { if ( $identifier === 'UTC' ) { continue; } $parts = explode('/', $identifier); $area = $parts[0]; $city1 = $parts[1]; if ( isset($parts[2]) ) { $city2 = $parts[2]; $result[$area][$city1.' > '.$city2] = $identifier; } else { $result[$area][$city1] = $identifier; } } return $result; }
そして、下が上のメソッドを使ったセレクトボックスの生成方法です。地域ごとにoptgroupタグでくくったものが生成されます。
<?php require 'Ryus_DateTimeZone.php'; $ret = Ryus_DateTimeZone::getIdentifiersAsArray(); ?> <select name="timezone"> <option value="">--------</option> <? foreach ( $ret as $area => $cities ) :?> <optgroup label="<? echo $area ?>"> <? foreach ( $cities as $city => $identifier ) : ?> <option value="<? echo $identifier ?>"><? echo $city ?></option> <? endforeach ?> </optgroup> <? endforeach ?> </select>
このリストを生成してみるとわかりますが、optgroupで地域別にくくったと言っても選択肢が多すぎて、決してユーザフレンドリーなインターフェイスとは言えないものになります。どのようにしたら、もうすこし使いやすいセレクトになるか考える必要がありそうです。次回につづく...
今回作成したサンプルのダウンロード: