app/Plugin/EventCalendar42/Controller/EventCalendarController.php line 57

Open in your IDE?
  1. <?php
  2. namespace Plugin\EventCalendar42\Controller;
  3. use Carbon\Carbon;
  4. use Eccube\Controller\AbstractController;
  5. use Eccube\Repository\CalendarRepository;
  6. use Eccube\Repository\BaseInfoRepository;
  7. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  8. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  13. use Symfony\Component\Filesystem\Filesystem;
  14. use Symfony\Component\HttpFoundation\File\File;
  15. use Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException;
  16. use Plugin\EventCalendar42\Entity\EventCalendar;
  17. use Plugin\EventCalendar42\Repository\EventCalendarRepository;
  18. use Plugin\EventCalendar42\Form\Type\Admin\EventCalendarType;
  19. class EventCalendarController extends AbstractController
  20. {
  21.     /**
  22.      * @var CalendarRepository
  23.      */
  24.     protected $calendarRepository;
  25.     /**
  26.      * @var EventCalendarRepository
  27.      */
  28.     protected $eventCalendarRepository;
  29.     /**
  30.      * @var BaseInfoRepository
  31.      */
  32.     protected $baseInfoRepository;
  33.     /**
  34.      * PageController constructor.
  35.      *
  36.      * @param CalendarRepository $calendarRepository
  37.      * @param EventCalendarRepository $eventCalendarRepository
  38.      * @param BaseInfoRepository $baseInfoRepository
  39.      */
  40.     public function __construct(
  41.         CalendarRepository $calendarRepository,
  42.         EventCalendarRepository $eventCalendarRepository,
  43.         BaseInfoRepository $baseInfoRepository
  44.     ) {
  45.         $this->calendarRepository $calendarRepository;
  46.         $this->eventCalendarRepository $eventCalendarRepository;
  47.         $this->baseInfoRepository $baseInfoRepository;
  48.     }
  49.     /**
  50.      * @Route("/block/event_calendar", name="block_event_calendar", methods={"GET"})
  51.      * @Template("Block/event_calendar.twig")
  52.      */
  53.     public function block(Request $request)
  54.     {
  55.         $today Carbon::now();
  56.         $year $today -> year;
  57.         $month $today -> month;
  58.         // $basedate = Carbon::createFromDate($year, $month, 1);
  59.         $firstDateOfThisMonth $today->copy()->startOfMonth();
  60.         $endDateOfThisMonth $today->copy()->endOfMonth();
  61.         // 今月のカレンダー配列を取得
  62.         $thisMonthCalendar $this->createCalendar($firstDateOfThisMonth);
  63.         // 【定休日カレンダー設定】今月の定休日を取得
  64.         $HolidaysOfThisMonth $this->calendarRepository->getHolidayList($firstDateOfThisMonth$endDateOfThisMonth);
  65.         // 【定休日カレンダー設定】定休日リストを取得
  66.         $holidayListOfThisMonth = [];
  67.         foreach ($HolidaysOfThisMonth as $Holiday) {
  68.             $holidayListOfThisMonth[] = $Holiday->getHoliday();
  69.         }
  70.         // 【定休日カレンダー設定】今月のカレンダー配列に定休日フラグを設定
  71.         $thisMonthCalendar $this->setHolidayAndTodayFlag($thisMonthCalendar$holidayListOfThisMonth$today->copy());
  72.         // 各カレンダータイトルを作成
  73.         $monthFormat $this->translator->trans('front.block.calendar.month_format');
  74.         $thisMonthTitle $firstDateOfThisMonth->format($monthFormat);
  75.         // $Calendars = $this->calendarRepository->findAll();
  76.         return [
  77.             // 'Calendars' => $Calendars,
  78.             'ThisMonthTitle' => $thisMonthTitle,
  79.             'ThisMonthCalendar' => $thisMonthCalendar,
  80.         ];
  81.     }
  82.     /**
  83.      * 一覧画面.
  84.      *
  85.      * @Route("/event", name="event_index", methods={"GET"})
  86.      * @Template("EventCalendar42/index.twig")
  87.      */
  88.     public function index(Request $request)
  89.     {
  90.         $today Carbon::now();
  91.         $year $today -> year;
  92.         $month $today -> month;
  93.         // $basedate = Carbon::createFromDate($year, $month, 1);
  94.         $firstDateOfThisMonth $today->copy()->startOfMonth();
  95.         $endDateOfThisMonth $today->copy()->endOfMonth();
  96.         // 今月のカレンダー配列を取得
  97.         $thisMonthCalendar $this->createCalendar($firstDateOfThisMonth);
  98.         // 今月の定休日を取得
  99.         $HolidaysOfThisMonth $this->calendarRepository->getHolidayList($firstDateOfThisMonth$endDateOfThisMonth);
  100.         // 定休日リストを取得
  101.         $holidayListOfThisMonth = [];
  102.         foreach ($HolidaysOfThisMonth as $Holiday) {
  103.             $holidayListOfThisMonth[] = $Holiday->getHoliday();
  104.         }
  105.         // 今月のカレンダー配列に定休日フラグを設定
  106.         $thisMonthCalendar $this->setHolidayAndTodayFlag($thisMonthCalendar$holidayListOfThisMonth$today->copy());
  107.         // 各カレンダータイトルを作成
  108.         $monthFormat $this->translator->trans('front.block.calendar.month_format');
  109.         $thisMonthTitle $firstDateOfThisMonth->format($monthFormat);
  110.         $changeMonth Carbon::createFromDate($year,$month,1);
  111.         $beforeMonth $changeMonth->copy()->subMonth()->startOfMonth();
  112.         $beforeY $beforeMonth->year;
  113.         $beforeM $beforeMonth->month;
  114.         $nextMonth $changeMonth->copy()->addMonth()->startOfMonth();
  115.         $nextY $nextMonth->year;
  116.         $nextM $nextMonth->month;
  117.         $url $_SERVER['REQUEST_URI'];
  118.         $pattern "/[\?&]([^&]+)=([^&#]+)/";
  119.         preg_match_all($pattern$url$matches);
  120.         if ($_SERVER['QUERY_STRING']) {
  121.             $queries = [];
  122.             $size count($matches[0]);
  123.             for($i 0$i $size$i++){
  124.                 $key $matches[1][$i];
  125.                 $value $matches[2][$i];
  126.                 $queries[$key] = $value;
  127.             }
  128.             $changeMonth Carbon::createFromDate($queries['year'],$queries['month'],1);
  129.             $firstDateOfChangeMonth $changeMonth->copy()->startOfMonth();
  130.             $endDateOfChangeMonth $changeMonth->copy()->endOfMonth();
  131.             //1ヶ月前
  132.             $beforeMonth $changeMonth->copy()->subMonth()->startOfMonth();
  133.             $beforeY $beforeMonth->year;
  134.             $beforeM $beforeMonth->month;
  135.             //1ヶ月後
  136.             $nextMonth $changeMonth->copy()->addMonth()->startOfMonth();
  137.             $nextY $nextMonth->year;
  138.             $nextM $nextMonth->month;
  139.             $thisMonthCalendar $this->createCalendar($changeMonth);
  140.             $thisMonthTitle $changeMonth->format($monthFormat);
  141.             // 今月の定休日を取得
  142.             $HolidaysOfChangeMonth $this->calendarRepository->getHolidayList($firstDateOfChangeMonth$endDateOfChangeMonth);
  143.             // 定休日リストを取得
  144.             $holidayListOfChangeMonth = [];
  145.             foreach ($HolidaysOfChangeMonth as $Holiday) {
  146.                 $holidayListOfChangeMonth[] = $Holiday->getHoliday();
  147.             }
  148.             // 今月のカレンダー配列に定休日フラグを設定
  149.             $thisMonthCalendar $this->setHolidayAndTodayFlag($thisMonthCalendar$holidayListOfChangeMonth$changeMonth);
  150.         }
  151.         // イベント一覧ページの重複しないイベントリスト
  152.         $eventIntro = [];
  153.         $eventLists = [];
  154.         foreach($thisMonthCalendar as $calendar){
  155.             if($calendar['events']){
  156.                 foreach( $calendar['events'] as $event) {
  157.                     if($event) {
  158.                         $eventIntro[$event['id']] = $event;
  159.                     }
  160.                 }
  161.             }
  162.         }
  163.         if($eventIntro){
  164.             $eventLists $this->sortByKey('start_date'SORT_ASC$eventIntro);
  165.         }
  166.         // イベント一覧を取得する
  167.         $eventLists $this->eventCalendarRepository->findBy(['is_active' => true], ['start_date' => 'asc']);
  168.         return [
  169.             // 'pagination' => $Events,
  170.             'ThisMonthTitle' => $thisMonthTitle,
  171.             'ThisMonthCalendar' => $thisMonthCalendar,
  172.             'beforeY' => $beforeY,
  173.             'beforeM' => $beforeM,
  174.             'nextY' => $nextY,
  175.             'nextM' => $nextM,
  176.             'eventLists' => $eventLists,
  177.         ];
  178.     }
  179.     /**
  180.      * 詳細画面.
  181.      *
  182.      * @Route("/event/detail/{id}", name="event_detail", requirements={"id":"\d+"})
  183.      * @Template("EventCalendar42/detail.twig")
  184.      *
  185.      */
  186.     // public function edit(Request $request, $id=null)
  187.     // {
  188.     //     $Event = $this->eventCalendarRepository->find($id);
  189.     //     //404設定
  190.     //     if(!$Event || $Event->getIsActive() == false){
  191.     //         throw new NotFoundHttpException();
  192.     //     }
  193.     //     return [
  194.     //         'event' => $Event,
  195.     //     ];
  196.     // }
  197.     /**
  198.      * カレンダー配列に定休日と今日フラグを設定します
  199.      *
  200.      * @param array $targetMonthCalendar カレンダー配列
  201.      * @param array $holidayListOfThisMonths 定休日リスト
  202.      * @param array $baseHolidaysOfThisMonth 定休日リスト【基本設定】
  203.      * @param Carbon $targetDate ターゲット日
  204.      *
  205.      * @return array カレンダーの配列
  206.      */
  207.     private function setHolidayAndTodayFlag($targetMonthCalendar$holidayListOfThisMonthsCarbon $targetDate)
  208.     {
  209.         $today Carbon::now();
  210.         // 【基本設定】今月の定休日を取得
  211.         $baseHolidaysOfThisMonth $this->baseInfoRepository->get()->getRegularHoliday();
  212.         for ($i 0$i count($targetMonthCalendar); $i++) {
  213.             // カレンダー配列の日が空の場合は処理をスキップ
  214.             if ($targetMonthCalendar[$i]['day'] == '') {
  215.                 $targetMonthCalendar[$i]['holiday'] = false;
  216.                 $targetMonthCalendar[$i]['baseholiday'] = false;
  217.                 $targetMonthCalendar[$i]['today'] = false;
  218.                 continue;
  219.             }
  220.             $targetYmdDateTime = new \DateTime($targetDate->copy()->format('Y-n').'-'.$targetMonthCalendar[$i]['day']);
  221.             $targetw $targetYmdDateTime->format('w');
  222.             if($targetYmdDateTime){
  223.                 // カレンダーの日付が定休日リストに存在するかを確認
  224.                 $result array_search($targetYmdDateTime$holidayListOfThisMonths);
  225.                 // 定休日フラグを設定
  226.                 if ($result !== false) {
  227.                     $targetMonthCalendar[$i]['holiday'] = true;
  228.                 } else {
  229.                     $targetMonthCalendar[$i]['holiday'] = false;
  230.                 }
  231.             }else{
  232.                 $targetMonthCalendar[$i]['holiday'] = false;
  233.             }
  234.             // 今日フラグを設定
  235.             if ($targetYmdDateTime == new \DateTime($today->copy()->format('Y-n-j'))) {
  236.                 $targetMonthCalendar[$i]['today'] = true;
  237.             } else {
  238.                 $targetMonthCalendar[$i]['today'] = false;
  239.             }
  240.             if($baseHolidaysOfThisMonth){
  241.                 // 【基本設定】カレンダーの曜日が定休日リストに存在するかを確認
  242.                 $result2 array_search($targetw$baseHolidaysOfThisMonth);
  243.                 // 定休日フラグを設定
  244.                 if ($result2 !== false) {
  245.                     $targetMonthCalendar[$i]['baseholiday'] = true;
  246.                 } else {
  247.                     $targetMonthCalendar[$i]['baseholiday'] = false;
  248.                 }
  249.             }else{
  250.                 $targetMonthCalendar[$i]['baseholiday'] = false;
  251.             }
  252.         }
  253.         return $targetMonthCalendar;
  254.     }
  255.     /**
  256.      * カレンダーの配列を生成します
  257.      *
  258.      * @param Carbon $firstDateOfTargetMonth 月初日
  259.      *
  260.      * @return array カレンダーの配列
  261.      */
  262.     private function createCalendar(Carbon $firstDateOfTargetMonth)
  263.     {
  264.         $year $firstDateOfTargetMonth->year;
  265.         $month $firstDateOfTargetMonth->month;
  266.         $Events $this->eventCalendarRepository->findBy([],['start_date' => 'desc']);
  267.         // 週のうちの何日目か 0 (日曜)から 6 (土曜)を取得
  268.         $firstDayOfWeek $firstDateOfTargetMonth->dayOfWeek;
  269.         $targetMonthCalendar = [];
  270.         // 1日目の曜日の位置手前まで空文字を追加
  271.         for ($i 0$i <= $firstDayOfWeek$i++) {
  272.             $targetMonthCalendar[$i]['day'] = '';
  273.             $targetMonthCalendar[$i]['dayOfWeek'] = '';
  274.             $targetMonthCalendar[$i]['dateTime'] = '';
  275.             $targetMonthCalendar[$i]['events'] =  array();
  276.         }
  277.         // 1日目の曜日の位置+月の日数
  278.         $loopCount $firstDayOfWeek $firstDateOfTargetMonth->daysInMonth;
  279.         // 月の日数に合わせて日と曜日を追加
  280.         $dayNumber 1;
  281.         $dayOfWeekNumber $firstDayOfWeek;
  282.         for ($i $firstDayOfWeek$i $loopCount$i++) {
  283.             // $dateTime = new \DateTime($firstDateOfTargetMonth->copy()->format('Y-n').'-'.$dayNumber);
  284.             $dateTime = new \DateTime($firstDateOfTargetMonth->format('Y-n-'.$dayNumber.' 00:00'));
  285.             $startTime = new \DateTime($firstDateOfTargetMonth->format('Y-n-'.$dayNumber.' 23:59'));
  286.             $targetMonthCalendar[$i]['day'] = $dayNumber;
  287.             $targetMonthCalendar[$i]['dayOfWeek'] = $this->getDayOfWeekString($dayOfWeekNumber);
  288.             $targetMonthCalendar[$i]['dateTime'] =  $dateTime;
  289.             $targetMonthCalendar[$i]['events'] =  array();
  290.             // $targetMonthCalendar[$i]['dateTime'] = Carbon::createFromDate($year, $month, $dayNumber);
  291.             foreach($Events as $event){
  292.                 $startDate '';
  293.                 $endDate '';
  294.                 $startDate = new \DateTime($event['start_date']->format('Y-n-j H:i'));
  295.                 $endDate = new \DateTime($event['end_date']->format('Y-n-j H:i'));
  296.                 if($startDate <= $startTime && $dateTime <= $endDate){
  297.                     // $startDate = $startDate->format('Y年n月j日');
  298.                     // $endDate = $endDate->format('Y年n月j日');
  299.                     array_push($targetMonthCalendar[$i]['events'],
  300.                     array(
  301.                         'id' => $event['id'],
  302.                         'title' => $event['title'],
  303.                         'icon' => $event['icon'],
  304.                         'url' => $event['url'],
  305.                         'link_method' => $event['link_method'],
  306.                         'is_active' => $event['is_active'],
  307.                         'type' => $event['type'],
  308.                         'start_date' => $event['start_date'],
  309.                         'end_date' => $event['end_date'],
  310.                         'free_area' => $event['free_area']
  311.                     ));
  312.                 }
  313.             }
  314.             $dayNumber++;
  315.             $dayOfWeekNumber++;
  316.             // 曜日のおりかえし: 0 (日曜)へ
  317.             if ($dayOfWeekNumber == 7) {
  318.                 $dayOfWeekNumber 0;
  319.             }
  320.         }
  321.         // 1日目の曜日の位置+月の日数に合わせて後に空文字を追加
  322.         // 7日*4週=28日(日曜始まりでうるう年じゃない2月)
  323.         if ($loopCount === 28) {
  324.             // 後に空文字追加はスキップ
  325.             return $targetMonthCalendar;
  326.         }
  327.         // 7日*6週=42日、7日*5週=35日
  328.         $paddingLoopCount 35;
  329.         if ($loopCount 35) {
  330.             $paddingLoopCount 42;
  331.         }
  332.         for ($i $loopCount$i $paddingLoopCount$i++) {
  333.             $targetMonthCalendar[$i]['day'] = '';
  334.             $targetMonthCalendar[$i]['dayOfWeek'] = '';
  335.             $targetMonthCalendar[$i]['dateTime'] = '';
  336.             $targetMonthCalendar[$i]['events'] =  array();
  337.         }
  338.         return $targetMonthCalendar;
  339.     }
  340.     /**
  341.      * 曜日を数値から文字列へ変換します
  342.      *
  343.      * @param int $dayOfWeekNumber 曜日の番号 : 0 (日曜)から 6 (土曜)
  344.      *
  345.      * @return string 曜日の文字 : Sun(日曜)からSat(土曜)
  346.      */
  347.     private function getDayOfWeekString($dayOfWeekNumber)
  348.     {
  349.         $weekday = ['Sun''Mon''Tue''Wed''Thu''Fri''Sat'];
  350.         return $weekday[$dayOfWeekNumber];
  351.     }
  352.     //キーによるソートのための関数
  353.     function sortByKey($key_name$sort_order$array) {
  354.         foreach ($array as $key => $value) {
  355.             $standard_key_array[$key] = $value[$key_name];
  356.         }
  357.         array_multisort($standard_key_array$sort_order$array);
  358.         return $array;
  359.     }
  360. }