javascript — полный календарь JS, ошибка TypeError при разборе переменной PHP в JSON

У меня проблемы с использованием 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», как описано выше, все работает

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
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]