====== PHPでの選択リスト作成ヘルパー - SelectionBuilder ====== 更新履歴とコメントは[[http://0-oo.net/log/category/php-tool-box/selection-builder/|ゼロと無限の間のログ » SelectionBuilder.php]]へどうぞ。 選択リスト、セレクトボックス、ドロップダウンリスト。呼び名は様々だが、要はselect要素とoption要素で作るWebフォームで選択肢を提供するアレだ。\\ 何回も作っているとだんだん面倒になり、ついつい部品化してしまう。フレームワークでこれを作れる機能があれば良いが、フレームワークを使うほどでもないような場合にはやはり手作り。毎回部品化するのも効率が悪いので、MITライセンスにして再利用しよう。 今回やりたかったのは、 * 数字の連番の選択リストを簡単に作れる * 年月日の選択リストを簡単に作れる * 年月日の選択リストは[[javascript/Yahho Calendar|Yahho Calendar]]と連携させる * 同じ名前でPOSTされた値を再表示する といったところ。今後必要に応じて改良するかも。 ===== ソースコード ===== ラベル) * @param string $default (省略可)初期表示で選択状態にする値 * @param array $attr (省略可)その他の属性(属性名 => 属性値) * @return string 選択リストのhtml */ public static function text($name, array $options, $default = '', array $attr = array()) { $h = SelectionBuilder::_getStartTag($name, $attr); foreach($options as $value => $text) { $h .= ''; $h .= SelectionBuilder::_h($text) . "\n"; } return $h . ''; } /** * 連番数字の選択リストを作る * @param string $name 項目名 * @param integer $start 最初の数字 * @param integer $end 最後の数字 * @param integer $default (省略可)初期表示で選択状態にする値 * @param array $attr (省略可)その他の属性(属性名 => 属性値) * @return string 選択リストのhtml */ public static function num($name, $start, $end, $default = '', array $attr = array()) { $h = SelectionBuilder::_getStartTag($name, $attr); if (SelectionBuilder::$blankFlg) { $h .= "\n"; } for ($i = $start; $i <= $end; $i++) { $h .= '$i\n"; } return $h . ''; } /** * 年月日の選択リストを作る(Yahho Calendar付き) * @param string $prefix 項目名の先頭部分 * @param string $default (省略可)初期表示する日付(strToTime()できる形式で) * @param integer $yearBefore (省略可)今年より何年前まで選択可能にするか * @param integer $yearAfter (省略可)今年より何年後まで選択可能にするか * @return string 日付選択リストのhtml */ public static function date($prefix, $default = 'today', $yBefore = 0, $yAfter = 1) { $idY = $prefix . '_y'; $idM = $prefix . '_m'; $idD = $prefix . '_d'; $ymd = strToTime($default); $y = date('Y', $ymd); $m = date('m', $ymd); $d = date('d', $ymd); $thisYear = date('Y'); $yStart = $thisYear - $yBefore; $yEnd = $thisYear + $yAfter; $onclick = "YahhoCal.render('" . $idY . "', '" . $idM . "', '" . $idD . "');return false;"; $h = ''; $h .= SelectionBuilder::num($idY, $yStart, $yEnd, $y, array('id' => $idY)) . "年 \n"; $h .= SelectionBuilder::num($idM, 1, 12, $m, array('id' => $idM)) . "月 \n"; $h .= SelectionBuilder::num($idD, 1, 31, $d, array('id' => $idD)) . "日"; if (SelectionBuilder::$pathToCalIcon) { //画像へのパスが設定されてれば画像ボタンを表示 $h .= ''; } else { //画像へのパスが設定されていなければ普通のボタンを表示 $h .= ''; } return $h; } /** * select要素の開始タグを取得する * @param string $name 項目名 * @param array $attr 属性(属性名 => 属性値) * @return string 属性のhtml */ private static function _getStartTag($name, array $attr) { $attr['name'] = $name; $h = ' $value) { $h .= ' ' . $key . '="' . $value . '"'; } return $h . ">\n"; } /** * オプション要素のselected属性を取得する * @param string $name 項目名 * @param string $default 初期表示で選択状態にする値 * @param string $value オプション要素の値 * @return string 属性のhtml */ private static function _getOptionAttr($name, $default, $value) { $selected = $_REQUEST[$name]; if ($selected == '') { $selected = $default; } return ($value == $selected) ? ' selected="selected"' : ''; } /** * htmlエスケープ * @param string $value * @return string エスケープした文字列 */ private static function _h($value) { return htmlSpecialChars($value, ENT_QUOTES); } }