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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

1702閲覧

laravel、カレンダー月めくりが上手くいかない

yoheiiii

総合スコア87

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/01/24 12:45

編集2021/01/26 03:05

環境:Windows10,XAMPP,HeidiSQL

laravelでカレンダーを作っています。
日めくりが上手くいきません。
http://localhost:8000/calendar2021-01
上記のようにアクセスし問題なく表示されます。
日めくりも1桁まではうまくいきますが、
10月からつまり2桁になると上手く表示されません。
http://localhost:8000/calendar2021-10
とすると$monthの値が【0】
http://localhost:8000/calendar2021-12
とすると$monthの値が【2】
になります。

http://localhost:8000/calendar2021-12
と入れて$monthの値が【12】にすることは出来ないのでしょうか。

ご教授頂けないでしょうか?

【ルート】

Route::get('/calendar{year}{month}','dayController@getCalendarDates');

【コントローラ】

public function getCalendarDates($year,$month) { dd($month); $dateStr = sprintf('%04d-%02d-01', $year,$month); $date = new Carbon($dateStr); $addDay = ($date->copy()->endOfMonth()->isSunday()) ? 7 : 0; // カレンダーを四角形にするため、前月となる左上の隙間用のデータを入れるためずらす $date->subDay($date->dayOfWeek); // 同上。右下の隙間のための計算。 $count = 31 + $addDay + $date->dayOfWeek; $count = ceil($count / 7) * 7; $dates = []; for ($i = 0; $i < $count; $i++, $date->addDay()) { // copyしないと全部同じオブジェクトを入れてしまうことになる $dates[] = $date->copy(); } $a = substr($year,0,4); //1ヶ月前 $sub = Carbon::createFromDate($a,$month); $subMonth = $sub->subMonth(); $subY = $subMonth->year; $subM = $subMonth->month; //1ヶ月後 $add = Carbon::createFromDate($a,$month); $addMonth = $add->addMonth(); $addY = $addMonth->year; $addM = $addMonth->month; $now = Carbon::today(); return view('calendar',compact('dates','a','month','subY','subM','addY','addM','now')); }

【ブレード】

<table class="table table-bordered"> <thead> <tr> @foreach (['日', '月', '火', '水', '木', '金', '土'] as $dayOfWeek) <th>{{ $dayOfWeek }}</th> @endforeach </tr> </thead> <tbody> @if($subM >= 10) <a href="/calendar{{$subY}}-{{$subM}}"><<前月 </a> @else <a href="/calendar{{$subY}}-0{{$subM}}"><<前月 </a> @endif {{$a}}年{{$month}}月 @if($addM >= 10) <a href="/calendar{{$addY}}-{{$addM}}">次月>></a> @else <a href="/calendar{{$addY}}-0{{$addM}}">次月>></a> @endif @foreach ($dates as $date) @if ($date->dayOfWeek == 0) <tr> @endif @if ($date == $now && $date->dayOfWeek == 0 && $date->year == $a) <td style="background-color:#ffff00; color:#990000;">{{ $date->day }}</td> @elseif ($date == $now && $date->dayOfWeek == 6 && $date->year == $a) <td style="background-color:#ffff00; color:##3366CC;">{{ $date->day }}</td> @elseif ($date == $now && $date->year == $a) <td style="background-color:#ffff00;">{{ $date->day }}</td> @elseif ($date->dayOfWeek == 0) <td style="background-color:#f08080; color:#990000;">{{ $date->day }}</td> @elseif ($date->dayOfWeek == 6) <td style="background-color:#66CCFF; color:#3366CC;">{{ $date->day }}</td> @else <td> {{ $date->day }} </td> @endif @if ($date->dayOfWeek == 6) </tr> @endif @endforeach </tbody> </table>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kai0310

2021/01/24 14:24

> と入れて$monthの値が【12】にすることは出来ないのでしょうか。 できるんじゃないですかね。
guest

回答2

0

php

1// routes/web.php 2 3Route::get('/calendar/{year?}/{month?}', 'CalendarController@get')->name('calendar');

php

1 2// app/Http/Controllers/CalendarContoller 3<?php 4 5namespace App\Http\Controllers; 6 7use Carbon\Carbon; 8use Illuminate\View\View; 9 10class CalendarController extends Controller 11{ 12 /** 13 * @param integer|null $year 14 * @param integer|null $month 15 * @return View 16 */ 17 public function get(int $year = null, int $month = null): View 18 { 19 $weeks = ['日', '月', '火', '水', '木', '金', '土']; 20 21 $carbon = new Carbon(); 22 $carbon->locale('ja_JP'); 23 24 if ($year) { 25 $carbon->setYear($year); 26 } 27 if ($month) { 28 $carbon->setMonth($month); 29 } 30 $carbon->setDay(1); 31 $carbon->setTime(0, 0); 32 33 $firstDayOfMonth = $carbon->copy()->firstOfMonth(); 34 $lastOfMonth = $carbon->copy()->lastOfMonth(); 35 36 $firstDayOfCalendar = $firstDayOfMonth->copy()->startOfWeek(); 37 $endDayOfCalendar = $lastOfMonth->copy()->endOfWeek(); 38 39 $dates = []; 40 while ($firstDayOfCalendar < $endDayOfCalendar) { 41 $dates[] = $firstDayOfCalendar->copy(); 42 $firstDayOfCalendar->addDay(); 43 } 44 45 return view('calendar', compact('weeks', 'dates', 'firstDayOfMonth')); 46 } 47}

php

1<!-- resources/views/calendar.blade.php --> 2 3<div class="row"> 4 <div class="col-md-6"> 5 <a href="{{ route('calendar', ['year' => $firstDayOfMonth->copy()->subMonth()->year, 'month' => $firstDayOfMonth->copy()->subMonth()->month]) }}">前月</a> 6 </div> 7 <div class="col-md-6 text-right"> 8 <a href="{{ route('calendar', ['year' => $firstDayOfMonth->copy()->addMonth()->year, 'month' => $firstDayOfMonth->copy()->addMonth()->month]) }}">次月</a> 9 </div> 10</div> 11 12<table class="table table-bordered"> 13 <thead> 14 <tr> 15 @foreach($weeks as $i => $week) 16 <th @if($i===\Carbon\Carbon::SUNDAY) class="text-red" 17 @elseif($i===\Carbon\Carbon::SATURDAY) class="text-blue" @endif> 18 {{ $week }} 19 </th> 20 @endforeach 21 </tr> 22 </thead> 23 <tbody> 24 @foreach($dates as $date) 25 @if($date->isSunday()) 26 <tr> 27 @endif 28 <td>{{ $date->format('n/j') }}</td> 29 @if($date->isSaturday()) 30 </tr> 31 @endif 32 @endforeach 33 </tbody> 34</table>

投稿2021/01/25 02:17

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2021/01/25 04:31

タイトルには「日めくり」ってあるけど、「月めくり」ですよね・・・
phper.k

2021/01/25 14:25

質問者は回答に気付いてない? それとも無視???
yoheiiii

2021/01/26 03:05

失礼致しました。 失念しておりました。 「月めくり」に修正致します。
phper.k

2021/01/26 03:13

回答は難しすぎたんですかね?
yoheiiii

2021/01/26 05:55

少し難しかったです。 ただ現状自分のはブレードに書きすぎているところ もあるのでとても勉強になりました。
phper.k

2021/01/26 08:18

まあ、参考にしているサイトのソースコードの品質が低いですからね。 多分だけど、筆者は Carbon のこと詳しく把握してない https://crieit.net/posts/Laravel-Carbon
guest

0

ベストアンサー

Laravelの各種Routeの第一引数は、最長一致を行います。これを解決する方法はいくつかありますが、以下は一例です。

php

1// web.php 2Route::get('/calendar{year}-{month}','dayController@getCalendarDates');

これで、$yearの値はcalendarから-の最長一致となり、$monthの値は-から最後までの最長一致になります。

蛇足

どう言うのを想定しているのか知りませんが、バリデーションくらいはしようぜ。とは思いました。

投稿2021/01/25 00:44

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問