質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

カレンダーの前月、次月ボタンを作成したいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,987

score 131

PHPでカレンダーの作成をしております。
その中で次月、前月のようなボタンを押すとそのカレンダーの情報に移るようプログラムを組みたいです。
ループ処理により年間分のカレンダー情報を表示と考えているのですが、そのような仕組みを作った機械がなく、
調べては見たのですが、なかなか機能しないため、お力をお借りしたく質問させて頂いてます。

<!DOCTYPE html>
<html>
    <head>
        <title>Kento Calendar</title>
    </head>

    <body>

<?php
$now_year = date("Y"); 
$now_month = date("m"); 
$now_day = date("j"); 
$weekday = array( "Sunday", "Monday", "Thuseday", "Wednesday", "Thursday", "Friday", "Saturday" );

$fir_weekday = date( "w", mktime( 0, 0, 0, $now_month, 1 , $now_year ) );
///////////////////////////////////setting valuable 
echo '<table border="1" cellspacing="0" cellpadding="0" style="text-align:center;">';
// 見出し部分<caption>タグ出力
echo "<caption style=\"color:black; font-size:14px; padding:0px;\">"
.$now_month."/".$now_year."
 </caption>\n";////////////////////////caption 

echo "<tr>\n";    

$i = 0; // カウント値リセット
while( $i <= 6 ){ // 曜日分ループ

/////////////////////////////////////style sheet
    if( $i == 0 ){ // 日曜日の文字色
        $style = "#C30";
    }
    else if( $i == 6 ){ // 土曜日の文字色
        $style = "#03C";
    }
    else{ // 月曜~金曜日の文字色
        $style = "black";
    }
    echo "\t<th style=\"color:".$style."\">".$weekday[$i]."</th>\n";
    $i ++; //カウント値+1
}
/////////////////////////////////////end of style sheet 
// 行の変更
echo "</tr>\n";
echo "<tr>\n";

$i = 0;
while( $i != $fir_weekday ){
    echo "\t<td>&nbsp;</td>\n";
    $i ++;
}

// 今月の日付が存在している間ループする
for( $day=1; checkdate( $now_month, $day, $now_year ); $day++ ){

    //曜日の最後まできたらカウント値(曜日カウンター)を戻して行を変える
    if( $i > 6 ){
        $i = 0;
        echo "</tr>\n";
        echo "<tr>\n";
    }

///////////////////////////////////////style sheet
    if( $i == 0 ){///the color of sunday
        $style = "#C30";

} else if( $i == 6 ){ //the color of saturday
        $style = "#03C";

} else { //the color of monday to friday
        $style = "black";
    }

    // if it is today , it gets color 
    if( $day == $now_day ){
        $style = $style."; background:silver";
    }
//////////////////////////////////////end of style sheet

    // 日付セル作成とスタイルシートの挿入
    echo "\t<td style=\"color:".$style.";\">".$day."</td>\n";

    $i++; //カウント値(曜日カウンター)+1
}

while( $i < 7 ){ //残りの曜日分空白(&nbsp;)で埋める
    echo "\t<td>&nbsp;</td>\n";
    $i++;
}
echo "</tr>\n";
echo "</table>\n";  

///////////////////////////////////////////////////////previous and next month 
?> 

<?php
    $ym = (isset($_GET["ym"]))? $_GET["ym"] : date("Ym");

    $lastmonth = date("Ym",strtotime($ym."01"." -1 month "));
    $nextmonth = date("Ym",strtotime($ym."01"." +1 month "));

    echo '<a href="ex5-2.php?ym='.$lastmonth.'">Last month</a>';
    echo "<br>";
    echo '<a href="ex5-2.php?ym='.$nextmonth.'">Next month</a>';

    $this_month_days = date("t",strtotime($ym."01"));//当月の日数を取得。
    ?>

</body>
</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/05/11 09:48

    ちょっと細かくて申し訳ないですが「コード」 という文字は実際のコードにはないでしょうしDOCTYPE宣言の冒頭の<が切れてますね…

    キャンセル

  • amaturePy

    2019/05/11 09:55

    大変失礼いたしました。ただいま修正いたしました!
    また、ご回答ありがとうございます!
    とても参考になります。
    そこで試したところ、月変更ボタンを押すと別ファイルに移動するような作りかと認識しているのですが、
    年間分プログラムでカレンダーを表示したいです。
    私の認識違いでしたらご指摘頂けると幸いです。
    元々の私の質問内容に詳細がかけており大変申し訳ありません。

    キャンセル

  • m.ts10806

    2019/05/11 09:56

    回答の方にコメントつけていただければと。

    キャンセル

回答 1

checkベストアンサー

+1

GETでyear,month渡して、渡されてなかったら当月、渡されてたらその月、、、という風にして
あとはそのyear,monthの前月次月をdate()の第2引数で計算すれば良いです。

<?php
$ym = (isset($_GET["ym"]))? $_GET["ym"] : date("Ym");

$lastmonth = date("Ym",strtotime($ym."01"." -1 month "));
$nextmonth = date("Ym",strtotime($ym."01"." +1 month "));

echo '<a href="index.php?ym='.$lastmonth.'">前月</a>';
echo '<a href="index.php?ym='.$nextmonth.'">次月</a>';

$this_month_days = date("t",strtotime($ym."01"));//当月の日数を取得。


※私はmktimeよりstrtotimeをよく採用しているのでこの書き方です。

そこで試したところ、月変更ボタンを押すと別ファイルに移動するような作りかと認識しているのですが、

説明省いてしまっていましたがindex.phpとしたのは仮で、実際はカレンダーを表示させているプログラムと同じファイル名・URLを指定してください。大事なのはGETで年月のパラメータを渡すことなので。

年間分プログラムでカレンダーを表示したいです。

「1ページに指定の年の全ての月のカレンダーを表示したい」ということでしたら考え方は同じです。
パラメータが年月になるかになるかの違いです。
それぞれの年月によって日数は異なりますが、何年であっても月は1から12までしかないので、
forで1~12を回してパラメータのyと結合して年月としたらあとは同じです。
多少レイアウトにはよりますが、1~12まで加算していくforループの中に1~その年月の日数分まで加算していくforループが入る形です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/11 10:23

    いや、そういうことではないですよ。
    ちなみに
    「次月、前月のようなボタンを押すとそのカレンダーの情報に移るようプログラム」と
    「ループ処理により年間分のカレンダー情報を表示」は考え方が全く別です。
    私の最初の回答は「月のカレンダーを表示したうえで次月前月対応」で
    後半の回答は「年間カレンダー」です。

    もし「年間カレンダーを1ページに表示して次月前月ボタンを押すと」となるとゴチャゴチャになります。それなら1ページに表示されるのは月のカレンダーだけのほうが良いです。
    まあ、Ajaxでも使えば画面遷移なしに「月のカレンダーだけ切り替える」のは可能ですが。
    もう少し図などで要件をまとめられたほうが良いかと思います。
    文章とコードだけでは限界があるので。

    キャンセル

  • 2019/05/11 11:14

    ありがとうございます。
    私の理想としては最初にあげて頂いた回答の方になります。
    ボタンを押すと順々に前月または次月を閲覧できるようにするものです。

    キャンセル

  • 2019/05/11 11:33

    では月の日数取得は書いたので、あとはforで日数分回すだけですね。
    (たぶん元のロジックに私のコードを入れ込もうと思うとごちゃごちゃになるので作り直したほうが良いです)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る