src/Eccube/Controller/Block/CalendarController.php line 42

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Eccube\Controller\Block;
  13. use Carbon\Carbon;
  14. use Eccube\Controller\AbstractController;
  15. use Eccube\Repository\CalendarRepository;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. class CalendarController extends AbstractController
  20. {
  21.     /**
  22.      * @var CalendarRepository
  23.      */
  24.     protected $calendarRepository;
  25.     /**
  26.      * CalendarController constructor.
  27.      */
  28.     public function __construct(CalendarRepository $calendarRepository)
  29.     {
  30.         $this->calendarRepository $calendarRepository;
  31.     }
  32.     /**
  33.      * @Route("/block/calendar", name="block_calendar", methods={"GET"})
  34.      * @Template("Block/calendar.twig")
  35.      */
  36.     public function index(Request $request)
  37.     {
  38.         $today Carbon::now();
  39.         $firstDateOfThisMonth $today->copy()->startOfMonth();
  40.         $firstDateOfNextMonth $today->copy()->startOfMonth()->addMonth()->startOfMonth();
  41.         $endDateOfNextMonth $today->copy()->startOfMonth()->addMonth()->endOfMonth();
  42.         // 2ヶ月間の定休日を取得
  43.         $HolidaysOfTwoMonths $this->calendarRepository->getHolidayList($firstDateOfThisMonth$endDateOfNextMonth);
  44.         // 今月のカレンダー配列を取得
  45.         $thisMonthCalendar $this->createCalendar($firstDateOfThisMonth);
  46.         // 来月のカレンダー配列を取得
  47.         $nextMonthCalendar $this->createCalendar($firstDateOfNextMonth);
  48.         // 定休日リストを取得
  49.         $holidayListOfTwoMonths = [];
  50.         foreach ($HolidaysOfTwoMonths as $Holiday) {
  51.             $holidayListOfTwoMonths[] = $Holiday->getHoliday();
  52.         }
  53.         // 今月のカレンダー配列に定休日フラグを設定
  54.         $thisMonthCalendar $this->setHolidayAndTodayFlag($thisMonthCalendar$holidayListOfTwoMonths$today->copy());
  55.         // 来月のカレンダー配列に定休日フラグを設定
  56.         $nextMonthCalendar $this->setHolidayAndTodayFlag($nextMonthCalendar$holidayListOfTwoMonths$today->copy()->startOfMonth()->addMonth());
  57.         // 各カレンダータイトルを作成
  58.         $monthFormat $this->translator->trans('front.block.calendar.month_format');
  59.         $thisMonthTitle $firstDateOfThisMonth->format($monthFormat);
  60.         $nextMonthTitle $firstDateOfNextMonth->format($monthFormat);
  61.         return [
  62.             'ThisMonthTitle' => $thisMonthTitle,
  63.             'NextMonthTitle' => $nextMonthTitle,
  64.             'ThisMonthCalendar' => $thisMonthCalendar,
  65.             'NextMonthCalendar' => $nextMonthCalendar,
  66.         ];
  67.     }
  68.     /**
  69.      * カレンダー配列に定休日と今日フラグを設定します
  70.      *
  71.      * @param array $targetMonthCalendar カレンダー配列
  72.      * @param array $holidayListOfTwoMonths 定休日リスト
  73.      * @param Carbon $targetDate ターゲット日
  74.      *
  75.      * @return array カレンダーの配列
  76.      */
  77.     private function setHolidayAndTodayFlag($targetMonthCalendar$holidayListOfTwoMonthsCarbon $targetDate)
  78.     {
  79.         for ($i 0$i count($targetMonthCalendar); $i++) {
  80.             // カレンダー配列の日が空の場合は処理をスキップ
  81.             if ($targetMonthCalendar[$i]['day'] == '') {
  82.                 $targetMonthCalendar[$i]['holiday'] = false;
  83.                 $targetMonthCalendar[$i]['today'] = false;
  84.                 continue;
  85.             }
  86.             $targetYmdDateTime = new \DateTime($targetDate->copy()->format('Y-n').'-'.$targetMonthCalendar[$i]['day']);
  87.             // カレンダーの日付が定休日リストに存在するかを確認
  88.             $result array_search($targetYmdDateTime$holidayListOfTwoMonths);
  89.             // 定休日フラグを設定
  90.             if ($result !== false) {
  91.                 $targetMonthCalendar[$i]['holiday'] = true;
  92.             } else {
  93.                 $targetMonthCalendar[$i]['holiday'] = false;
  94.             }
  95.             // 今日フラグを設定
  96.             if ($targetYmdDateTime == new \DateTime($targetDate->copy()->format('Y-n-j'))) {
  97.                 $targetMonthCalendar[$i]['today'] = true;
  98.             } else {
  99.                 $targetMonthCalendar[$i]['today'] = false;
  100.             }
  101.         }
  102.         return $targetMonthCalendar;
  103.     }
  104.     /**
  105.      * カレンダーの配列を生成します
  106.      *
  107.      * @param Carbon $firstDateOfTargetMonth 月初日
  108.      *
  109.      * @return array カレンダーの配列
  110.      */
  111.     private function createCalendar(Carbon $firstDateOfTargetMonth)
  112.     {
  113.         // 週のうちの何日目か 0 (日曜)から 6 (土曜)を取得
  114.         $firstDayOfWeek $firstDateOfTargetMonth->dayOfWeek;
  115.         $targetMonthCalendar = [];
  116.         // 1日目の曜日の位置手前まで空文字を追加
  117.         for ($i 0$i <= $firstDayOfWeek$i++) {
  118.             $targetMonthCalendar[$i]['day'] = '';
  119.             $targetMonthCalendar[$i]['dayOfWeek'] = '';
  120.         }
  121.         // 1日目の曜日の位置+月の日数
  122.         $loopCount $firstDayOfWeek $firstDateOfTargetMonth->daysInMonth;
  123.         // 月の日数に合わせて日と曜日を追加
  124.         $dayNumber 1;
  125.         $dayOfWeekNumber $firstDayOfWeek;
  126.         for ($i $firstDayOfWeek$i $loopCount$i++) {
  127.             $targetMonthCalendar[$i]['day'] = $dayNumber;
  128.             $targetMonthCalendar[$i]['dayOfWeek'] = $this->getDayOfWeekString($dayOfWeekNumber);
  129.             $dayNumber++;
  130.             $dayOfWeekNumber++;
  131.             // 曜日のおりかえし: 0 (日曜)へ
  132.             if ($dayOfWeekNumber == 7) {
  133.                 $dayOfWeekNumber 0;
  134.             }
  135.         }
  136.         // 1日目の曜日の位置+月の日数に合わせて後に空文字を追加
  137.         // 7日*4週=28日(日曜始まりでうるう年じゃない2月)
  138.         if ($loopCount === 28) {
  139.             // 後に空文字追加はスキップ
  140.             return $targetMonthCalendar;
  141.         }
  142.         // 7日*6週=42日、7日*5週=35日
  143.         $paddingLoopCount 35;
  144.         if ($loopCount 35) {
  145.             $paddingLoopCount 42;
  146.         }
  147.         for ($i $loopCount$i $paddingLoopCount$i++) {
  148.             $targetMonthCalendar[$i]['day'] = '';
  149.             $targetMonthCalendar[$i]['dayOfWeek'] = '';
  150.         }
  151.         return $targetMonthCalendar;
  152.     }
  153.     /**
  154.      * 曜日を数値から文字列へ変換します
  155.      *
  156.      * @param int $dayOfWeekNumber 曜日の番号 : 0 (日曜)から 6 (土曜)
  157.      *
  158.      * @return string 曜日の文字 : Sun(日曜)からSat(土曜)
  159.      */
  160.     private function getDayOfWeekString($dayOfWeekNumber)
  161.     {
  162.         $weekday = ['Sun''Mon''Tue''Wed''Thu''Fri''Sat'];
  163.         return $weekday[$dayOfWeekNumber];
  164.     }
  165. }