Eine weitere Frage zu Ajax und FullCalendar. Ich habe die zuvor vorgeschlagenen Korrekturen hier gelesen und ausprobiert, aber alles ohne Erfolg. Ich kann JSON-Ereignisse nicht in fullCalendar laden. Was mache ich falsch?fullCalendar Ereignisse von Ajax Antwort nicht geladen
Der Aufruf von $ .ajax funktioniert und gibt Werte zurück. Der JSON hat ein Elternelement und die Daten des Kalenderarrays befinden sich tatsächlich in jsondata.message. Die JSON.stringify im folgenden Code ist Teil meiner verschiedenen Experimente.
Ich habe ursprünglich versucht, den FullCalendar eventSource mit dem integrierten Ajax-Abruf zu verwenden. Ich trennte den Code, der dachte, dass ich Anruf-/Kommunikationsproblem hatte.
Ich habe versucht [jsondata.message] und nur jsondata.message. Ich habe versucht, die JSON-Daten in ein Standardarray zu analysieren und das Array an das Ereigniselement zu übergeben. Nichts, was ich tue, ohne die Antwort zu kopieren und in die Ereignisse einzufügen: Element in Anführungszeichen funktioniert.
- Ajax Anruf funktioniert und gibt Daten zurück.
- da ich die Daten von der Ajax-Antwort in den Code kopieren und einfügen kann, laden die Ereignisse, es ist nicht das Format der Daten.
Könnte es ein Limit für das Laden von Ereignissen geben? Es gibt ungefähr 4800 Ereignisse, die ich versuche zu laden.
AJAX-Aufruf:
$.ajax({
url: "/appointment/ajax_get_available_records",
type: "POST",
data:{
startdate: start.format("YYYY-MM-DD 00:00:01"),
enddate: end.format("YYYY-MM-DD 23:59:59"),
userid:<?= $doctor->user_id?>
},
error: function() {
$('#errormsg').html("<p class='alert alert-danger'>There was an error while fetching calendar events!</p>'");
},
success: function(jsondata, status, xhr){
$('#calendar').fullCalendar({
events: [JSON.stringify(jsondata.message)],
color: 'green',
textColor: 'white'
});
},
dataType: "json"
});
Antwortheader
Cache-Control:no-transform,public,max-age=300,s-maxage=900
Content-Length:104282
Content-Type:application/json
Date:Tue, 04 Apr 2017 02:40:50 GMT
Server:Microsoft-IIS/10.0
X-Powered-By:ASP.NET
** Teil AJAX Antwort **
{"status":true,
"message":[{
"doctor_user_id":"636",
"title":"available",
"start":"2017-04-03T19:10:00",
"end":"2017-04-03T19:19:59",
"clinic_id":"10",
"clinic_location_id":"0"
},
{
"doctor_user_id":"636",
"title":"available",
"start":"2017-04-03T19:20:00",
"end":"2017-04-03T19:29:59",
"clinic_id":"10",
"clinic_location_id":"0"
},
---- omitted ----
Server PHP 7.0/MySQL Modell:
function get_available_dates_in_range($user_id, $start_datetime = null , $end_datetime = null)
{
$startrange = date('Y-m-01 H:i:s',strtotime($start_datetime));
$endrange = date('Y-m-d 23:59:59',strtotime($end_datetime));
if($endrange == NULL) {
$end_datetime = date_add($startrange,date_interval_create_from_date_string("INTERVAL 2 MONTHS"));
$endrange = date("Y-m-01 00:00:00",$end_datetime);
}
$this->db->select(
"doctor_user_id,
status as `title`,
DATE_FORMAT(datetime,'%Y-%m-%dT%H:%i:%s') as `start`,
DATE_FORMAT(date_add(datetime, Interval 599 SECOND),'%Y-%m-%dT%H:%i:%s') as end,
clinic_id,
clinic_location_id ");
$this->db->where('doctor_user_id', $user_id);
$this->db->where('datetime >=', mysql_user_to_gmt_date($start_datetime));
$this->db->where('datetime <=', mysql_user_to_gmt_date($end_datetime));
$this->db->where('status', 'available');
$this->db->order_by('datetime ASC');
$query = $this->db->get('schedule_records');
return $query;
}
Codeigniter 3.1.4 Controller:
....
$query = $this->appointment_model->get_available_dates_in_range($userid, $startdate, $enddate);
$this->json_response($query->result_array());
Encode und Rückkehr JSON Funktion
function json_response($message = null, $code = 200) {
// clear the old headers
header_remove();
// set the actual code
http_response_code($code);
// set the header to make sure cache is forced
header("Cache-Control: no-transform,public,max-age=300,s-maxage=900");
// treat this as json
header('Content-Type: application/json');
$status = array(
200 => '200 OK',
400 => '400 Bad Request',
422 => 'Unprocessable Entity',
500 => '500 Internal Server Error'
);
// ok, validation error, or failure
header('Status: '.$status[$code]);
// return the encoded json
echo json_encode(array(
'status' => $code < 300, // success or not?
'message' => $message
));
}
Vielen Dank für Ihre Antwort. Ihr Vorschlag ist die Art, wie ich es ursprünglich codiert. Leider die MySQL-Aufruf dauert etwa 1,3-1,8 Sekunden Roundtrip und macht es zu einem unangenehmen UX-Erlebnis. Die stringify war Teil meiner Debugging-Kampf versuchen, zu erraten, was mit meinen Ereignissen passiert ist.Das gleiche gilt für das Verschieben der Ajax-Aufruf aus eventSources in eine separate – AV8R
Ich würde vorschlagen, Ihre SQL-Abfrage und/oder PHP dann zu korrigieren.Das Holen einer kleinen Anzahl von Ereignissen wie diesem sollte wirklich nicht zu lange dauern, es sei denn, Sie fügen Hunderte von Ereignissen in eine einzelne Kalenderansicht hinzu? die Benutzererfahrung vielleicht durch Hinzufügen eines "Ladens ... bitte Warten Sie "Spinner irgendwo in der Seite, während der Ajax läuft. Benutzer sind eher geduldig, wenn sie erkennen, dass die Daten auf dem Weg sind und nicht abgestürzt sind. Und ... es sieht nicht so aus, als ob Sie es hätten, aber stellen Sie sicher, dass der Ajax nicht im synchronen Modus läuft, weil das wirklich für schreckliches UX sorgt. – ADyson
Stimmen Spinner/Overlay bereits dort zu. Aber wir laden 30 Tage ~ 4800 Ereignisse. Die vorherige Version lud Daten Seite für Seite mit einer Hin- und Rückfahrt dazwischen. Problem ist eigentlich schlechte Architektur, aber es ist nicht meine und es ist grundlegend. Dies ist eine Übergangsversion und wir müssen das alte Datenbankschema verwenden. Es wird ein Redesign für die ng2-Version geben, wenn wir Codeigniter ablehnen. – AV8R