質問するログイン新規登録

Q&A

解決済

1回答

756閲覧

fullcalenderにMySQLのシフトデータをカレンダー上に表示させたい

Umi_0w0

総合スコア5

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/04/04 06:15

0

1

実現したいこと

fullcalenderにMySQLのシフトデータをカレンダー上に表示させたい

発生している問題・分からないこと

fullcalenderにMySQLのシフトデータをカレンダー上に表示させたいのですが途中でエラーが発生しました。

エラーメッセージ

error

1Error fetching data: TypeError: e is not iterable 2 at i (index.global.min.js:6:145454) 3 at i (index.global.min.js:6:145501) 4 at index.global.min.js:6:147918 5 at ha.buildPluginHooks (index.global.min.js:6:147930) 6 at ha.processRawCalendarOptions (index.global.min.js:6:166590) 7 at ha.computeOptionsData (index.global.min.js:6:165940) 8 at new ha (index.global.min.js:6:160996) 9 at new e.Calendar (index.global.min.js:6:279010) 10 at calender.js:7:22

該当のソースコード

calendar.js

1document.addEventListener('DOMContentLoaded', function() { 2 var calendarEl = document.getElementById('calendar'); 3 4 fetch('getShifts.php') 5 .then(response => response.json()) 6 .then(data => { 7 var calendar = new FullCalendar.Calendar(calendarEl, { 8 headerToolbar: { 9 left: 'prev,next today', 10 center: 'title', 11 right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth' 12 }, 13 buttonText: { 14 prev: '先月', 15 next: '来月', 16 today: '今日', 17 dayGridMonth: '月', 18 timeGridWeek: '週', 19 timeGridDay: '日', 20 listMonth: 'リスト', 21 }, 22 locale: 'ja', 23 timeZone: 'Asia/Tokyo', 24 eventLimit: true, 25 navLinks: true, 26 editable: true, 27 dayMaxEvents: true, // for all non-TimeGrid views 28 views: { 29 timeGrid: { 30 dayMaxEventRows: 4 // adjust to 6 only for timeGridWeek/timeGridDay 31 } 32 }, 33 selectable: true, 34 plugins: ['dayGrid', 'timeGrid', 'interaction', 'list'], 35 initialView: 'dayGridMonth', 36 events: function(info, successCallback, failureCallback) { 37 // infoオブジェクトを使用して日付の範囲を取得 38 setCalendarList(info.startStr, info.endStr, successCallback); 39 }, 40 eventClick: function(info) { 41 // カレンダーに設定したイベントクリック時のイベント 42 }, 43 dateClick: function(info) { 44 // カレンダー空白部分クリック時のイベント 45 }, 46 select: function(info) { 47 // カレンダー空白部分をドラッグして範囲指定した時のイベント 48 }, 49 eventDrop: function(info) { 50 // イベントをドラッグして別日に移動させた時のイベント 51 } 52 }); 53 54 calendar.render(); 55 }) 56 .catch(error => { 57 console.error('Error fetching data:', error); 58 }); 59}); 60 61/** 62 * 対象日付スケジュールデータセット処理 63 * @param {string} startStr - 開始日付 64 * @param {string} endStr - 終了日付 65 * @param {function} successCallback - 成功時のコールバック関数 66 * @returns {undefined} 67 */ 68function setCalendarList(startStr, endStr, successCallback) { 69 $.ajax({ 70 type: 'post', 71 dataType: "json", 72 async: true, 73 cache: false, 74 url: 'getShifts.php', 75 data: { 76 startDate: startStr, 77 endDate: endStr 78 } 79 }) 80 .then(function(data) { 81 var events = []; 82 83 // 取得したデータをフルカレンダーのイベント形式に整形 84 $.each(data, function(index, value) { 85 events.push({ 86 id: value['shift_id'], 87 title: value['title'], 88 description: value['description'], 89 start: value['start'], 90 end: value['end'], 91 color: value['color'], 92 textColor: value['textColor'] 93 }); 94 }); 95 96 // 成功時のコールバック関数にイベントを渡す 97 successCallback(events); 98 }) 99 .catch(error => { 100 console.error('Error in setCalendarList:', error); 101 // 失敗時の処理をここに記述することもできます 102 }); 103 104 return; 105} 106

getShifts.php

1<?php 2// データベースの設定情報を定義します。 3$servername = "localhost"; 4$username = ""; 5$password = ""; 6$dbname = ""; 7 8// PDOを使用してデータベースに接続します。 9// PDOはエラー処理やセキュリティ(プリペアドステートメント)などの面でmysqliより推奨されます。 10try { 11 $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 12 // エラーモードを例外モードに設定 13 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 14} catch (PDOException $e) { 15 die("Connection failed: " . $e->getMessage()); 16} 17 18// スケジュールデータを取得するクエリを定義します。 19$sql = "SELECT shift_id, title, description, start_date, start_time, end_date, end_time, calendar_color, calendar_text_color FROM shifts WHERE start_date >= :startDate AND end_date <= :endDate"; 20 21// パラメータをバインドしてクエリを実行します。 22$startDate = $_GET['startDate'] ?? date('Y-m-d'); 23$endDate = $_GET['endDate'] ?? date('Y-m-d'); 24$stmt = $conn->prepare($sql); 25$stmt->bindParam(':startDate', $startDate); 26$stmt->bindParam(':endDate', $endDate); 27$stmt->execute(); 28 29// クエリ結果を配列に格納します。 30$scheduleList = $stmt->fetchAll(PDO::FETCH_ASSOC); 31 32// データベース接続を閉じます(PDOでは接続閉じる必要は基本的にありませんが、明示的に閉じたい場合はnullを代入します) 33$conn = null; 34 35// JSON形式でレスポンスを返します。 36header('Content-Type: application/json'); 37echo json_encode($scheduleList); 38?> 39

content.php

1<?PHP 2session_start(); 3 4// ログイン済みかどうかを確認 5if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){ 6 header("location: ../login/login.php"); 7 exit; 8} 9 10 11//データベース接続 龍の目 12require('../dbconnect.php'); 13 14// ユーザー情報の取得クエリ 15$sql = "SELECT e.name, r.role_name 16 FROM employees e 17 JOIN roles r ON e.role_id = r.role_id 18 WHERE e.employee_code = ?"; 19 20if($stmt = $db->prepare($sql)){ 21 22 // パラメータをバインド 23 $employee_code = $_SESSION["employee_code"]; 24 $stmt->bindParam(1, $employee_code, PDO::PARAM_STR); 25 26 // クエリの実行 27 if($stmt->execute()){ 28 // 結果を取得 29 $row = $stmt->fetch(PDO::FETCH_ASSOC); 30 if ($row) { 31 $name = $row['name']; 32 $role = $row['role_name']; 33 } 34 } 35} 36// データベース接続を閉じる 37$db = null; 38?> 39 40 41 42 43<!DOCTYPE html> 44<html lang="ja" class="is-overflow"> 45<head> 46 <meta charset="UTF-8"> 47 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 48 <title>ログインページ</title> 49 <link rel="stylesheet" href="index02.css"> 50 <script src="calender.js"></script> 51 52 <script src='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.11/index.global.min.js'></script> 53 54 55</head> 56 57<body> 58<div class="htmlContainer"> 59<!-- header --> 60 <main> 61 <div class="container"> 62 <h1>スケジュール</h1> 63 </div> 64 <div id="cale" style="padding: 10px 10px;"> 65 <div id='calendar'></div> 66 </div> 67 </main> 68</div> 69</body> 70</html>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

エラーコードとかを調べましたが見つけられませんでした。

補足

windows XAMPP vscode

まだプログラミング始めたばかりで色々いたらない点もありますがご教授願います。
もっと詳細な情報が必要な場合はどうぞご気軽にコメントしてください。
よろしくお願いします.

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

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

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

Lhankor_Mhy

2024/04/04 07:09

plugins の行を削除するとどうなりますか?
guest

回答1

0

ベストアンサー

plugins オプションですが、ドキュメントを見ると、
ビルドする場合と、
Initialize with ES6 Build System - Docs | FullCalendar
ESモジュールを使う場合は、
Initialize with Script Tags (ESM) - Docs | FullCalendar
とそれぞれ、インポートして配列にして渡す形式になっています。

CDNなどを使う場合は、
Initialize with Script Tags - Docs | FullCalendar
と、plugins に値を設定せずに、プラグインのスクリプトをscript要素でグローバルに読み込む形式になっているようです。

ご提示のコードでは、plugins: ['dayGrid', 'timeGrid', 'interaction', 'list']と文字列の配列を渡していますから、ドキュメントと違うことをしているようです。
この記述が正しいのか、確認されてみてはいかがでしょうか。


もう少しドキュメントを眺めてみたところ、pluginsに文字列の配列を渡す形は、古いバージョンであったようです。
Initialize with Script Tags - Docs v4 | FullCalendar
ですので、使われているバージョンを再度確認してみてはどうでしょうか。

投稿2024/04/04 09:22

編集2024/04/04 09:33
Lhankor_Mhy

総合スコア37736

Umi_0w0

2024/04/04 12:38

回答ありがとうございます。 申し訳ありません、アルバイトがあったので返信が遅くなりました。 後で時間ができ次第確認し返答させていただきます。 調べていただきありがとうございます。
Umi_0w0

2024/04/05 04:41

回答ありがとうございます。 バージョンの確認や少し試行錯誤したら正常に動きましたありがとうございました。 ベストアンサーに選ばせていただきました。
Lhankor_Mhy

2024/04/05 05:12

ご解決されて何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問