У меня проблемы с использованием FullCalendar v3.8.2
и метод eventDataTransform.
Я ищу часы сейчас, чтобы не сойти с ума, я пишу свой первый пост StackOverflow …
Я хочу передать дополнительный параметр к событию Object, calles blockd
, Таким образом, в случае блокировки заблокированные события получают другой стиль
Если я передам blocked
параметр с Int 1
события календаря отображаются в интерфейсе. (Как показано в приведенном ниже коде)
Хотя я делаю переменную PHP e.g. $is_blocked
вместо этого я получаю TypeError
в веб-интерфейсе и события не отображаются.
Это мое fullcalendar.js
сценарий:
eventSources: [
{
url: WP_PUBLIC_DATA.pluginsUrl + '/dev-booking-system/dbs-calendar-feed.php', // use the `url` property
className: 'dbs-event',
eventDataTransform: function( eventData ){
var blocked = parseInt( eventData.blocked );
if( blocked == 1 ){
var substr = 'Reserviert - ' + eventData.title.substring( 0, 15 ) + '...';
return {
id: eventData.id,
title: substr,
start: eventData.start,
end: eventData.end,
className: 'dbs-event--disabled-by-load'
};
}
}
}
],
При отправке JSON в файл javascript происходит нечто странное.
URL-адрес eventSoruces получает данные из php-файла с помощью цикла wordpress.
Это та точка, где это становится странным. Переходя 'blocked' => 1
работает, проходя 'blocked' => $is_blocked
не работает (значение преобразуется в int через intval)
if( $event_listing->have_posts() ) :
while( $event_listing->have_posts() ) : $event_listing->the_post();
$post_id = get_the_ID();
$title = get_the_title();
$is_blocked = intval( get_post_meta( $post_id, 'event_reserved', true ) );
$start = get_post_meta( $post_id, 'start_trip', true ) != '' ? get_post_meta( $post_id, 'start_trip', true ) : NULL;
$end = get_post_meta( $post_id, 'end_trip', true ) != '' ? get_post_meta( $post_id, 'end_trip', true ) : NULL;
$event_array[] = array(
'id' => $post_id,
'title' => $title,
'start' => $start,
'end' => $end,
// 'blocked' => 1,
'blocked' => $is_blocked,
'allDay' => true // Event ist nicht Zeitabhängig
);
endwhile;
else:
wp_send_json_error( "No events found" );
endif;
echo json_encode($event_array);
exit;
Используя WordPress, я ставлю сценарии в правильном порядке:
//fullcalendar
wp_enqueue_script('dbs-fullcalendar-moment-scripts', plugins_url('assets/fullcalendar/lib/moment.min.js', __FILE__ ), array('jquery'), '3.8.2', true );
wp_enqueue_script('dbs-fullcalendar-scripts', plugins_url('assets/fullcalendar/fullcalendar.js', __FILE__ ) , array('jquery'), '3.8.2', true );
Firefox говорит TypeError: eventInput is undefined
Хром против говорит Uncaught TypeError: Cannot read property 'start' of undefined
У вас есть идеи, что происходит?
Было бы здорово услышать от вас, остановите меня, чтобы пить слишком много кофе;)
Вот результат JSON:
0:
id: 3453
title: "19. März bis 23. März Beipieltext"start: "2018-03-19"end: "2018-03-23"blocked: 0
allDay: true
1:
id: 3451
title: "09. März bis 11. März Beispieltext"start: "2018-03-09"end: "2018-03-11"blocked: 1
allDay: true
Значение «заблокировано» получено как значение типа int, но, похоже, у javascript есть проблема с «0», поскольку при передаче только значений «1», как описано выше, все работает
Проблема в том, что всякий раз, когда blocked
0, ваш метод eventDataTransform ничего не возвращает в календарь, поэтому код, который пытается использовать возвращенное событие, дает сбой, потому что он пытается получить доступ к объекту события, который не существует.
Даже если вы не собираетесь изменять данные события, вам все равно нужно просто вернуть существующие данные события обратно.
Вам также не нужно делать parseInt (), так как blocked
это уже число, и вам не нужно создавать новый объект события — вы можете просто изменить тот, который вам дан. Таким образом, ваш код может быть следующим:
eventDataTransform: function( eventData ){
if( eventData.blocked == 1 ){
var substr = 'Reserviert - ' + eventData.title.substring( 0, 15 ) + '...';
eventData.title = substr;
eventData.className = 'dbs-event--disabled-by-load';
}
return eventData; //always return something, even if it wasn't modified
}
Других решений пока нет …