CakePHP: JQuery Datepicker не показывает значение БД - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь реализовать этот пример в моем приложении CakePHP 3.6.14.

(function( $ ) {
    $.widget( "ui.dp", {
            _create: function() {
                var el = this.element.hide();
                this.options.altField = el;
                var input = this.input = $('<input>').insertBefore( el )
                input.focusout(function(){
                        if(input.val() == ''){
                            el.val('');
                        }
                    });
                input.datepicker(this.options)
                if(convertDate(el.val()) != null){
                    this.input.datepicker('setDate', convertDate(el.val()));
                }
            },
            destroy: function() {
                this.input.remove();
                this.element.show();
                $.Widget.prototype.destroy.call( this );
            }
    });

    var convertDate = function(date){
      if(typeof(date) != 'undefined' && date != null && date != ''){
        return new Date(date);
      } else {
        return null;
      }
    } })( jQuery );

Так что в default.ctp у меня есть этот код:

$(document).ready(function() {
           $( "input.datepicker" ).dp({
              dateFormat: 'dd/mm/yy',
              altFormat: 'yy-mm-dd'
           }); 

        });

И в edit.ctp у меня есть этот элемент управления:

echo $this->Form->control('created_date', ['class' => 'datepicker', 'type' => 'text', 'empty' => true]);

Хотя он отправляет и правильно сохраняет дату в базе данных, когда я снова открываю страницу редактирования, я вижу сегодняшнюю дату, а не ту избаза данных.Значение базы данных: 2019-06-27, и если я изменю параметр dateFormat на yy-mm-dd, я все равно получу сегодняшнюю дату вместо даты, сохраненной в БД.

Но в сгенерированном HTML-коде яможно увидеть, что значение верное:

enter image description here

1 Ответ

1 голос
/ 10 июня 2019

С этим сценарием вы должны использовать altFormat в вашем элементе управления формой, т.е. dateFormat - это формат display , а altFormat - это формат value , и этот формат должен быть стандартным форматом ISO, так как скрипт пытается преобразовать значение в объект Date, чтобы шаблоны, отличные от ISO, могли привести к ошибочно проанализированным датам или вообще не могут быть проанализированы, что и происходит с вашим значение, как JavaScript Date синтаксический анализатор обрабатывает первое число как месяц, а не как день.

Если формат преобразования даты в вашем приложении по умолчанию не совпадает с altFormat, вам придется позаботиться об этом вручную, например, так для отдельного поля:

$value = $this->Form->getSourceValue('created_date');
if ($value instanceof \DateTimeInterface) {
    $value = $value->format('Y-m-d');
}

echo $this->Form->control('created_date', [
    'class' => 'datepicker',
    'type' => 'text',
    'val' => $value
]);

Также обратите внимание, что yy означает полный год в датчике jQuery UI, т.е. 2019, а не 19, который, по-видимому, является значением по умолчанию вашего приложения. Если вы хотите использовать последнее, то вам нужно использовать один y в шаблоне dateFormat.

...