Kartik Multidate DatePicker и beforeShowDay с AJAX в Yii2 - PullRequest
0 голосов
/ 13 октября 2018

Я использую Kartik datepicker и пытаюсь выделить определенные дни, которые возвращаются из ответа AJAX в форме array.Дни стали жирными, но они делают слишком много AJAX звонков, и всякий раз, когда я хочу изменить месяц, для этого требуется немного больше времени.Вот мой код

<?php
                echo DatePicker::widget([
                         'name' => 'check_multiple_date',
                         'type' => DatePicker::TYPE_INLINE,
                         'options' => ['placeholder' => 'Select issue date ...', 'id' => 'date-picker-multiple', 'toggleActive' => true],
                         'pluginOptions' => [
                             'format' => 'dd-M-yyyy',
                             'todayHighlight' => false,
                             'multidate' => true,
                             'beforeShowDay' => new JsExpression($JsBeforeDay)
                         ],
                    ]);
?>

А ниже - JQuery для AJAX звонка и полужирный несколько дней.

<?php
 $JsBeforeDay = <<<EOF
 [enter image description here][1]function(date){
    var dates;
    var duration =30;
    $.ajax({
            async: false,
            url: siteDomain+'/reservation/find-reservations-by-duration?duration='+duration,
            type: 'POST',
            data: {format: 'json'},
            success: function(response) {
                dates = response; 
            },
            error: function(response) {
            }
        });

    var year = date.getFullYear(), month = date.getMonth(), day = date.getDate();
    for (var i=0; i < dates.length; ++i)
        if (year == parseInt(dates[i][0]) && month == parseInt(dates[i][1]) - 1 &&  day == parseInt(dates[i][2]))
        return {classes: 'bold-text'};
    return [false];

 }
 EOF;
 ?>

В результате формат определенных дней меняется, но онсовершает слишком много вызовов AJAX, как показано на рисунке Нажмите для изображения

1 Ответ

0 голосов
/ 14 октября 2018

Я думаю, что вы можете решить эту проблему, выполнив некоторые уловки здесь: 1) Вы можете передавать даты (ответ ajax) из текущего действия вместо запроса Ajax, например:

render(..., ['datesInAction' => reservation::find....()])

, а затем вы можете передать$ dateInAction напрямую к $ JsBeforeDay.

2) если вам нужно сделать это с помощью ajax без передачи переменной php, вы можете установить флаг перед запросом ajax ... если успех остановит запрос ajax и продолжит использовать старые даты, ноздесь вам нужно использовать localstorage или глобальную переменную js для данных и флаг ... Например:

var dates = localStorage.getItem('dates');
if(!dates){ 
$.ajax({
            async: false,
            url: siteDomain+'/reservation/find-reservations-by-duration?duration='+duration,
            type: 'POST',
            data: {format: 'json'},
            success: function(response) {
                dates = response;
                localStorage.setItem('dates', dates);
            },
            error: function(response) {
            }
        });
}

Примечание: Kartik DatePicker является зависимостью сборки Bootstrap-date-picker, проверьте эту ссылку. самозагрузка-DatePicker

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