Jao's Blog

プログラミング備忘録

日記表示機能を作成する #09

 カレンダー上で日付をクリックすると、日記が表示されるようにしましょう。

日記閲覧ページに飛ぶ

f:id:Kyokuya_jao:20200615080519p:plain
 カレンダーの日付に、aタグを追加します。
 そのままでは数字しかクリックに反応しません。マス目全体をクリックできるようにしたいので、aタグをブロック要素に変更し、widthとheightを100%に設定します。
 aタグをブロック要素にすると、text-alignが使えなくなるため、文字が中央配置でなくなります。なので、適切なpaddingとmarginを設定します。
f:id:Kyokuya_jao:20200615090928p:plain
 しっかりとa要素がマス全体に広がっていますね。ちょっとはみ出してしまっているので、親要素であるtd要素に「overflow: hidden;」を設定し、はみ出た部分を非表示とします。
 これにて、マス目をクリックすることで日記閲覧ページに飛ぶことが可能になりました。

URLにパラメータを与える

 例えば、2020年の6月1日のマスをクリックしたら、2020年の6月の1日の日記を表示させないといけません。
 それを実現させるために、URLにパラメータを与えます。

$date = $day->format('Y-m-d-D');
      $body .= sprintf('<td><a href="/myDiary.php?date=%s" class="youbi_%d %s">%d</a></td>', $date, $day->format('w'), $todayClass, $day->format('d'));


 aタグのリンク先に日付のデータを渡します。2020年の6月1日(月)なら、「2020-06-01-Mon」という文字列がURLの最後に渡されるはずです。
 実際に、カレンダーで6月1日をクリックしてみましょう。

f:id:Kyokuya_jao:20200615091933p:plain
 いい感じです。日付表記はダミーの6月10日で固定されていますが、URLを見ると、しっかりとパラメータが渡っているのがわかります。

日付を正しく表示する

 URLのパラメーターを、年月日にバラしていきましょう。
 「2020-06-01-Mon」というパラメータがあったとしたら、「2020」と「06」と「01」と「Mon」に分けます。

$year = substr($_GET['date'], 0, 4);
$month = substr($_GET['date'], 5, 2);
$day = substr($_GET['date'], 8, 2);
$youbi = substr($_GET['date'], 11);

var_dump($year);
var_dump($month);
var_dump($day);
var_dump($youbi);


 substrを使えば、適切に切り出すことが可能ですね。

f:id:Kyokuya_jao:20200615224626p:plain
 「06」や「01」がそのまま表示されると見栄えが悪いので、アタマに0がついていた場合はそれを取り除きます。また「Mon」なら「月」、「Tue」なら「火」と、日本語に変換するためのswitch文も追加しましょう。
 ……スクリーンショットの撮影を忘れてしまいましたが、ともあれ、それらのデータをhtml部分に出力すれば、日付表記は完成です。

左右の矢印で日付を切り替えられるようにする

 カレンダーと同様に、左右の矢印で、前日や次の日の日記を表示できるようにします。
 カレンダーでは、URLから取り出したパラメータ(2020-06など)で月単位のDateTimeオブジェクトを作成し、それに-1したものを前の月のリンク、+1したものを次の月のリンクとしていました。
 日記では月単位でなく、日単位のDateTimeオブジェクトを作成し、同じ処理でリンクを作成すればOKです。
 ただし、日記のパラメータには「Mon」といった余計な曜日表記が存在するので、substrでそれらを切り抜く必要があります。また、前や次のリンクを作成する際に、URLに曜日表記を再び連結する処理も忘れてはいけません。

f:id:Kyokuya_jao:20200615230013g:plain
 このように、日記の表示を切り替えられるようになりました!

 次回は、いよいよ日記を書く処理を作っていきましょう。それでは、今回はこのあたりで。