динамическое расписание на основе единиц, запланированных на каждый день - PullRequest
0 голосов
/ 23 мая 2018

Я установил полный календарь jquery, который может извлекать юниты из сценария mysql.Теперь мои доступные единицы меняются ежедневно на основе запланированных сотрудников / единиц.Поэтому каждый раз, когда меняется дата, мне нужно обновить единицы измерения.Можно ли это сделать с fullcalendar?

Я пробовал это, но, похоже, не работает.calendar.php

        <!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/fullcalendar.min.css' rel='stylesheet' />
<link href='../lib/fullcalendar.print.min.css' rel='stylesheet' media='print' />
<link href='../scheduler.min.css' rel='stylesheet' />
<script src='../lib/moment.min.js'></script>
<script src='../lib/jquery.min.js'></script>
<script src='../lib/fullcalendar.min.js'></script>
<script src='../scheduler.min.js'></script>
<script>

  $(function() { // document ready

    $('#calendar').fullCalendar({
      defaultView: 'agendaDay',

      editable: true,
      selectable: true,
      eventLimit: true, // allow "more" link when too many events
      header: {
        left: 'prev,next today',
        center: 'title',
        right: 'agendaDay,agendaTwoDay,agendaWeek,month'
      },
      views: {
        agendaTwoDay: {
          type: 'agenda',
          duration: { days: 2 },

          // views that are more than a day will NOT do this behavior by default
          // so, we need to explicitly enable it
          groupByResource: true

          //// uncomment this line to group by day FIRST with resources underneath
          //groupByDateAndResource: true
        }
      },

      //// uncomment this line to hide the all-day slot
      //allDaySlot: false,






refetchResourcesOnNavigate: true,
resources: function(callback, start, end, timezone) {


  $.ajax({
   url:"units.php",
   type:"POST",
   data:{ 
     start: start.format(),
     end: end.format(),
     timezone: timezone
   },
   success: function(resourceObjects) //define a variable to capture the JSON from the server
   {
     callback(resourceObjects); //return the new resource data to the calendar
   }
})},




      events: 'load.php',

select: function(start, end, allDay)
    {
     var title = prompt("Enter Event Title");
     if(title)
     {
      var start = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss");
      var end = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss");
      $.ajax({
       url:"insert.php",
       type:"POST",
       data:{title:title, start:start, end:end},
       success:function()
       {
        calendar.fullCalendar('refetchEvents');
        alert("Added Successfully");
       }
      })
     }
    },
    editable:true,
    eventResize:function(event)
    {
     var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss");
     var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss");
     var title = event.title;
     var id = event.id;
     var resourceId = event.resourceId;
     $.ajax({
      url:"update.php",
      type:"POST",
      data:{title:title, start:start, end:end, id:id, resourceId:resourceId},
      success:function(){
       calendar.fullCalendar('refetchEvents');
       alert('Event Update');
      }
     })
    },

    eventDrop:function(event)
    {
     var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss");
     var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss");
     var title = event.title;
     var id = event.id;
     var resourceId = event.resourceId;
     $.ajax({
      url:"update.php",
      type:"POST",
      data:{title:title, start:start, end:end, id:id, resourceId:resourceId},
      success:function()
      {
       calendar.fullCalendar('refetchEvents');
       alert("Event Updated");
      }
     });
    },

    eventClick:function(event)
    {
     if(confirm("Are you sure you want to remove it?"))
     {
      var id = event.id;
      $.ajax({
       url:"delete.php",
       type:"POST",
       data:{id:id},
       success:function()
       {
        calendar.fullCalendar('refetchEvents');
        alert("Event Removed");
       }
      })
     }
    },

   });
  });

</script>
<style>

  body {
    margin: 0;
    padding: 0;
    font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif;
    font-size: 14px;
  }

  #calendar {
    max-width: 99%;
    margin: 50px auto;
  }

</style>
</head>
<body>

  <div id='calendar'></div>

</body>
</html>

units.php

<?php

//load.php
$start = $_POST['start'];
$end = $_POST['end'];
$tz = $_POST['timezone'];

$connect = new PDO('mysql:host=localhost;dbname=', '', 'pass');

$data = array();

$query = "select s.*, u.unit_number from schedules s
          left join units u on u.id = s.unit where s.start_time like '$start%'";

$statement = $connect->prepare($query);

$statement->execute();

$result = $statement->fetchAll();
foreach ($result as $row) {
    /* Get Shift Start and calculate end time
      $start = date('G:i', $row['start_time']);
      $shift_lentgth = $row[''];
      $end= strtotime("+ $shift_lentgth", $start);
     */

    // Check unit level to give identifier

    $data[] = array(
        'id' => $row["id"],
        'title' => $row["unit_number"]
    );
}

echo json_encode($data);
?>

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Использование

refetchResourcesOnNavigate: true,
  resources: '/my-resource-script.php'

Более подробная информация на полная документация документов

0 голосов
/ 24 мая 2018

Ваш код действительно имеет мало смысла.Основная проблема в том, что вы определили опцию «ресурсы» дважды, и я не знаю, что пытается сделать тот, у кого есть функции, связанные с ним.В худшем случае это может вызвать бесконечный цикл повторной загрузки.К счастью, он переопределяется статической ссылкой на «unit.php» позже в вашем списке опций и поэтому никогда не используется.

Похоже, вы пытаетесь установить список ресурсов на основе выбранной в данный момент датыдиапазон, который является вполне разумным и возможным, но вы, кажется, немного запутались, и поэтому ваш код не логичен.

Во-первых, удалите:

resources: "units.php"

полностью, так как это перезаписываетваша попытка динамического управления ресурсами.

Во-вторых, вы можете установить следующее:

refetchResourcesOnNavigate: true,
resources: function(callback, start, end, timezone) {
  $.ajax({
   url:"units.php",
   type:"POST",
   data:{ 
     "start": start.format(),
     "end": end.format(),
     "timezone": timezone,
   },
   success: function(resourceData) //define a variable to capture the JSON from the server
   {
     callback(resourceData); //return the new resource data to the calendar
   }
}

Примечания:

  • Обратите внимание, что я изменил данные, отправленные на ваш вызов ajax, чтобы охватить диапазон времени вместо одной даты - на основе представлений, которые вы сделали доступными через параметры заголовка, это вполне возможно длякалендарь, показывающий день, 2 дня, неделю или месяц на одном дисплее.Таким образом, ваш сервер должен иметь возможность возвращать все ресурсы, относящиеся к любому из дней в диапазоне.Я также включил переменную часового пояса на тот случай, если вам это нужно в вашем сценарии.

  • "refetchResourcesOnNavigate" - в соответствии с https://fullcalendar.io/docs/refetchResourcesOnNavigate это вызывает автоматическое обновление ресурсов всякий раз, когдадиапазон дат изменяется пользователем, а также позволяет любой настраиваемой функции обратного вызова «resources» задавать текущий диапазон дат и часовой пояс в качестве параметров, которые могут быть перенаправлены на сервер.

  • ресурсы как функция: для этого нужно просто позвонить на сервер и вернуть результаты, передав текущий выбранный диапазон дат, чтобы сервер мог вернуть правильные результаты.Вызывать в нем «refetchResources», как вы это делали в своей версии, не имеет смысла, поскольку это просто приведет к повторному вызову той же самой функции и вызовет бесконечный цикл - эта функция обратного вызова является процессом, посредством которогоресурсы пополняются.Подробнее см. https://fullcalendar.io/docs/resources-function.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...