blog.shimix.jp

日々の雑感
<< 西濃運輸(その2) | main | X31 SSD化 >>
php:カレンダー(日付選択)
0
    phpproの掲示板で回答したものを(ちょっと手直しして)転記。カレンダーの日付にチェックボックスを付けて日付を選択するというものなんですが、前月・翌月に移動したときに選択済みの日付を記憶しておくというものです。Cookieを使うのですが、Cookieに「今から表示する年月以外」のデータを記憶させる(当月の選択済みはチェックボックスのcheckeで反映させる)という手法になります。

    #配列を記憶させるので、serialize/unserializeを使ってます。

    <?php
    $array = array();
    if ($_COOKIE['ymd']) {
        $array = unserialize($_COOKIE['ymd']);
    }
    //年月日(初期値)取得
    $yymm = date('Y/m');
    $day = date('d');
    $wdate = strtotime($yymm . '/' . $day);
    if ($_POST) {
        //前のフォームで処理していた年月日
        $yymm = $_POST['yymm'];
        // 今月?
        if ($yymm == date('Y/m')) {
            $day = date('d');
        } else {
            $day = '01';
        }
        $wdate = strtotime($yymm . '/' . $day);
        // 前のフォームの年月のデータ
        for ($i = 1; $i <= date('t', strtotime($yymm . '/01')); $i++){
            $s = sprintf('%02d', $i);
            if ($_POST['day']) {
                if (in_array($s, $_POST['day'])) {
                    $array[] = $yymm . '/' . $s;
                }
            }
        }
        if ($_POST['submit']) {  // 本番では処理ロジックをincludeする
            print '<pre>' . PHP_EOL;
            var_dump($array);
            print '</pre>' . PHP_EOL;
            exit;
        }

        // 今から表示するフォームの年月(前月・翌月のsubmitを反映)
        if ($_POST['prev']) { $wdate = strtotime('first day -1 month', $wdate); }
        if ($_POST['next']) { $wdate = strtotime('first day +1 month', $wdate); }
        $yymm = date('Y/m', $wdate);
    }
    // 今月以外をcookieへ
    $cookie = array();
    foreach ($array as $val) {
        if (substr($val,0,7) == date('Y/m', $wdate)) { continue; }
        $cookie[] = $val;
    }
    setcookie('ymd', serialize($cookie));
    ?>
    <html>
    <body>
    <form action="" method="post">
    <input type="submit" name="prev" value="先月" >
    <caption><?php echo date('Y / m', $wdate); ?></caption>
    <input type="hidden" name="yymm" value="<?php echo date('Y/m', $wdate); ?>">
    <input type="submit" name="next" value="翌月" >
    <?php
    for ($day = 1; $day <= intval(date('t', $wdate)); $day++) {
        if ($day == 1) {
            print '<table border="1">' . PHP_EOL;
            print '<tr><th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th></tr>' . PHP_EOL;
            print '<tr>';
            $cnt = intval(date('w', strtotime('First Day', $wdate)));
            for ($i = 0; $i < $cnt; $i++) {
                print '<td>&nbsp;</td>';
            }
        } elseif ($cnt % 7 == 0) {
            print '</tr>' . PHP_EOL;
            print '<tr>';
        }
        $s = sprintf('%02d',$day);
        if (in_array(date('Y/m/',$wdate) . $s, $array)) {
            print '<td>' . $day . '<input type="checkbox" ';
            print 'name="day[]" value="' . $s . '" checked>';
        } else {
            print '<td>' . $day . '<input type="checkbox" ';
            print 'name="day[]" value="' . $s . '">';
        }
        print "</td>";
        $cnt++;
    }
    while ($cnt % 7 !== 0) {
        print '<td>&nbsp;</td>';
        $cnt++;
    }
    print '</tr>' . PHP_EOL;
    print '</table>';
    ?>
    <br>
    <input type="submit" name="submit" value="確定">
    </form>
    </body>
    </html>


    phpproで回答したものと何が違うかと言えば、カレンダーの作成部分だけなんですけどね。とりあえず自分がいつも書くカレンダーに合わせました。
    | shimix | php&web | 11:00 | comments(0) | trackbacks(0) | -









    http://blog.shimix.jp/trackback/881196
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
    << September 2018 >>

    このページの先頭へ