app/Customize/Controller/Block/FooterInspController.php line 37

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