10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Person Link newAdvent Calendar 2020

Day 6

FullCalendarでドラッグ&ドロップで日付を変更する

Last updated at Posted at 2020-12-05

fullcalendar祭りです。

【技術スタック】

  • Laravel 6.0
  • AdminLTE 3 (ComposerでLaravelにインストール)
  • jQuery 3.3.1+ (AdminLTEにデフォルトで入っている)
  • FullCalendar 5.3.2 (AdminLTEでデフォルトで入ってるのは古いので別途新しいバージョンをCDNで導入)
  • moment.js (CDNで導入)

全体の大まかな流れ

  1. カレンダーのイベントをドラッグ&ドロップする
  2. イベントの id日付(ドラッグ&ドロップした後) を取得して、AjaxでコントローラーにPOSTで取得した値を送る
  3. コントローラー側で、JS側から送られてきた値でレコードを更新して、saveする

気になる部分をかいつまんでいきます。

document.addEventListener("DOMContentLoaded", function () {
  var calendarEl = document.getElementById("calendar");
  var calendar = new FullCalendar.Calendar(calendarEl, {
    headerToolbar: {
      left: "prev,next today",
      center: "title",
      right: "dayGridMonth,timeGridWeek,timeGridDay,listWeek",
    },
    locale: "ja",
    editable: true,
    googleCalendarApiKey: "GoogleCalendarのAPIKEY",
    eventSources: [
      {
        googleCalendarId: "japanese__ja@holiday.calendar.google.com", //休日の予定を取得
        rendering: "background",
        color: "#FF6666",
      },
      {
        googleCalendarId: "自分のカレンダーID",
      },
    ],
    events: "/getevents",
    selectable: true,

    eventDrop: function (info) {
      $.ajax({
        //POST通信
        type: "post",
        //ここでデータの送信先URLを指定します。
        url: "/dropevents",
        dataType: "json", //データ形式を指定
        data: {
          dropped_date: moment(info.event.start).format("YYYY-MM-DD"), //dropped_dateをキーにして値を送信
          id: info.event.id, //idをキーにして値を送信
        },
      }).then((res) => {
        console.log(res);
        calendar.render();
      });
    },
  });
  calendar.render();
});
// コントローラー側
  public function getEvents() // イベントの取得
  {
    // user_idを持たせておく
    $data = [];
    $authUser = Auth::user()->id;
    $events = Event::where("user_id", "=", $authUser)->get();
    $data = $events;

    echo json_encode($data);
  }

  public function dropEvents(Request $request) // ドラッグ&ドロップしたときの挙動
  {
    $event = Event::find($request->id); // JSから送信されたidで該当イベントを検索
    $event->start = $request->dropped_date;
    $event->save();
  }

  • カレンダーの予定は、events: "/getevents"で取得しています。
  • eventDrop: function (info)で、ドラッグ&ドロップしたときの挙動を表しています。この時にAjax通信をしています。
  • ドラッグ&ドロップすると、
    data: { dropped_date: moment(info.event.start).format("YYYY-MM-DD"), id: info.event.id, }の値がコントローラーに送信されます。
    DBの日付のフォーマットがYYYY-MM-DDなのに対して、カレンダーから送信される値はFri Nov 20 2020 00:00:00 GMT+0900 (日本標準時)という形式なので、moment.jsでYYYY-MM-DD形式に整形しています。
  • calendar.render();でカレンダーを再描画しています。

予定「あああああああ」を、20日に動かすと・・・
image.png

リアルタイムでDBの値が更新され、ページリロードしなくても予定が20日に移動していることが確認できました。
image.png

10
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?