blog.shimix.jp

日々の雑感
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>


    続きを読む >>
    | shimix | php&web | 11:00 | comments(0) | trackbacks(0) | -
    php:カレンダー
    0
      使用頻度はそこそこだけど、書くたびに「どう書けばよかったっけ」と余計な時間がかかるものの代表に「カレンダー」がありますね。適当なライブラリでも使えばいいんですけど、ちょこっと書くだけのにライブラリ引っ張ってくるのも面倒で・・。備忘録として「こんな感じで書いてます」ってのを転記。

      <?php
      $ymd = time();
      if ($_GET['ymd']) {
          $ymd = strtotime($_GET['ymd']);
      }

      print date('Y/m', $ymd) . '月のカレンダー' . '<br>' . PHP_EOL;
      for ($day = 1; $day <= intval(date('t', $ymd)); $day++) {
          if ($day == 1) {
              print '<table border="1">' . PHP_EOL;
              print '<tr><th>SUN</th><th>MON</th><th>TUE</th><th>WED</th><th>THU</th><th>FRI</th><th>SAT</th></tr>' . PHP_EOL;
              print '<tr>';
              $cnt = intval(date('w', strtotime('First Day', $ymd)));
              for ($i = 0; $i < $cnt; $i++) {
                  print '<td>&nbsp;</td>';
              }
          } elseif ($cnt % 7 == 0) {
              print '</tr>' . PHP_EOL;
              print '<tr>';
          }
          print '<td>' . $day . '</td>';
          $cnt++;
      }
      while ($cnt % 7 !== 0) {
          print '<td>&nbsp;</td>';
          $cnt++;
      }
      print '</tr>' . PHP_EOL;
      print '</table>';
      ?>


      | shimix | php&web | 10:00 | comments(0) | trackbacks(0) | -
      XHTML 1.0 Transitional
      0
        少々古い話なんですが、先月まで会社のサイトのリニューアル作業をしてました。最初に考えたのは、文字コードをどうするかという点とdoctypeを何にするかということ。今まではあまり気にしてなかったんですけどね。

        で、今回からutf-8&XHTML 1.0 Transitionalということにしました。HTMLとCSSにキチンと分離して、Another HTML-lint gatewayで100点なのを確認して、最後にIEでデザインチェック(作成中はFirefoxで見てるんで)・・。ところがIE6はXML宣言があると後方互換モードになってしまうんですね。

        #今まで意識してなかったので知らなかった(汗

        IE7では修正されているようなんですが、IE6で崩れるのは許容範囲外(社内標準はIE6だし)。あわてて全ファイルの先頭にphpスクリプトを埋め込むことに

        <?php
        if (!strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
         print '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
        }
        ?>

        とりあえずこれでOKだけど、IEでは100点取れないな(苦笑

        (追記)
        IE7では修正済みってことだから、「MSIE 7」が存在したら出力するようにしないといけないか・・。本当に面倒なやつ>IE。
        | shimix | php&web | 10:08 | comments(0) | trackbacks(0) | -
        php
        0

          phpの仕事にも慣れてきて、リファレンス本が手元に必須という状況は何とか脱してます。たまにわからなくなる程度なのでwebのリファレンスでこと足りるレベルになってきました。そもそも全部覚えるつもりもないし(苦笑)。

          よく言われることですが、何千ステップ書いて1回使うか使わないかという関数や構文を覚える暇があったら、とっとと何か作って「よく使う」ものの仕様を確実に覚えてしまう方が早いですね。簡単な構文で考え違いをしてバグを出すようだと効率が極端に落ちますから。

          学校の勉強と違って「試験のための丸暗記」は不要。躓いたときにどこを探せばいいかだけわかっていれば大丈夫ですね。ただ基本的な部分はキチンと押さえておかないとデバッグで泣きます。特殊なものは仕様を確認しながら使いますし、注意してチェックもしますので問題になることは少ないです。

          未だに「難しい関数を覚えていない」言い訳といえば言い訳ですが(汗)。

          | shimix | php&web | 18:56 | comments(0) | trackbacks(0) | -
           123456
          78910111213
          14151617181920
          21222324252627
          28293031   
          << May 2017 >>

          このページの先頭へ