Храните значения json в массиве

#javascript #php #jquery #jquery-ui-datepicker

Вопрос:

Здравствуйте, у меня не так много опыта, но обычно с помощью Google я могу это понять, но не сегодня. Я записываюсь на прием и борюсь с блокировкой значений из базы данных в датапикере.

JS:

   <script>
  $( function() {
    $( "#datepicker" ).datepicker({
      minDate: 2,
      maxDate: "1w",
      beforeShowDay: function(date)
      {
          var dates = new Array();
          $.ajax({
              url:"load_days.php",
              type:"POST",
              success:function(data)
              {
                for (var i = 0; i < data.length; i  ){
                  dates.push(data)
                }
              },
              dataType:"json"
            })
            var string = jQuery.datepicker.formatDate('dd-mm-yy', date);
            return [ dates.indexOf(string) == -1 ]
      }
    });
  } );
  </script>
 

PHP файл:

 $data = array();

$query = "SELECT * FROM events ORDER BY id";

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

$statement->execute();

$result = $statement->fetchAll();

foreach($result as $row)
{
    $data[] = array(
        'day'     =>  date("d-m-Y", strtotime($row["start_event"]))
    );
}

echo json_encode($data);
 

Комментарии:

1. боретесь с блокировкой значений из базы данных в датапикере ???

2. Может быть, здесь чего-то не хватает, например: dates.push(data) . Это перенесет все данные на даты, не так ли?

3. В чем проблема? Укажите это здесь.

4. Я имею в виду, что отступ немного смещен, но ваша инструкция » return [ dates.indexOf(строка) == -1 ]` выполняется до завершения вызова ajax. так что это в основном и будет return [ true ] . Но, как упоминалось предыдущими комментаторами, включите четкое изложение проблемы и того, чего вы хотите достичь. И, как упоминает @Don’ dates.push(data) Tp, вероятно, должно быть dates.push(data[i])

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

Ответ №1:

Во — первых, я бы предложил изменить PHP-скрипт, чтобы удалить оболочку ['day' => date] массива вокруг даты каждого события. Это облегчит JavaScript поиск дат в массиве.

 foreach($result as $row) {
    $data[] = date("d-m-Y", strtotime($row["start_event"]));
}
 

Затем я бы немного реорганизовал JS, чтобы даты из load_days.php загружаются только один раз, а затем используются повторно, а не перезагружаются в каждом событии перед шоу. После переформатирования данных, возвращаемых PHP, как показано выше, массив, возвращаемый ajax, можно использовать напрямую, поэтому цикл for больше не требуется для его преобразования.

 $( function() {
    $.ajax({
        url: "load_days.php",
        type: "POST",
        success: function (dates) {
            $( "#datepicker" ).datepicker({
                minDate: 2,
                maxDate: "1w",
                beforeShowDay: function(date)
                {
                    var string = jQuery.datepicker.formatDate('dd-mm-yy', date);
                    return [dates.indexOf(string) === -1]
                }
            })
        },
        dataType: "json"
    });
})