как использовать monthNames в jqgrid при проверке даты? - PullRequest
1 голос
/ 15 июня 2010

В моем jqgrid, когда я нажимаю на кнопку добавления новой записи, у меня есть поле даты, предварительно заполненное текущей датой. Формат даты: гггг-МММ-д (например, 2010-янв-23). Поле «Дата является обязательным», и когда я нажимаю кнопку «Отправить», проверка не проходит и выдает ошибку, что эта дата недопустима и требуется формат Y-m-d.

Как я могу проверить свое значение с помощью jqgrid? Другими словами, как заставить jqgrid принять следующий формат даты при проверке 2010-Jan-23?

Спасибо.

Вот мои данные JSON:

{"rows":[

{"id":1,"cell":["2010-Mar-3","Pepto","2","False","not active"]},
{"id":2,"cell":["2009-May-6","Tylenol","5","False","not active"]},
{"id":3,"cell":["2008-May-6","Aspirin","9","True","active"]}

]}},

Вот мое определение столбца даты:

{ name: 'Date', 
index: 'date', 
width: '80px', 
align: 'center', 
sortable: false,
editable: true, 
datefmt: 'Y-M-d', 
editoptions: { dataInit: function(elem) { $(elem).datepicker({ dateFormat: 'yy-M-d' });},value: getDate } ,
editrules: { required: true, date:true} },

Функция getdate вставляет текущую дату в поле. вот функция:

 function getDate(){
        var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
        var now = new Date();
        return now.getFullYear() + "-" + monthNames[now.getMonth()] + "-" + now.getDate();
    }

Может быть, это из-за этой функции? Могу ли я вставить текущую дату из DatePicker?

Объем данных, отправляемых с сервера, не слишком велик (около 10-30 строк), и этим приложением будет пользоваться максимум 50 человек, поэтому проблем с количеством данных не возникает.

В любое время, когда у меня есть значение как 2010-июнь-23 в поле, я получаю сообщение об ошибке: Введите действительное значение даты - Y-M-d

Ответы [ 2 ]

2 голосов
/ 15 июня 2010

Убедитесь, что вы определили datefmt: 'Y-M-d' в определении столбца colModel.В списке опций editrules (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules#editrules) определено, что если вы используете date: true в качестве опции editrules, проверка будет выполнена в соответствии с опцией datefmt.

Еще несколько рекомендаций, если вы используете дату в jqGrid:

Если вы еще не используете, подумайте об использовании jQuery.datepicker (см. http://jqueryui.com/demos/datepicker/#date-formats) внутри dataInit функции editoptions(например,

editoptions: {
    dataInit : function (elem) {
        $(elem).datepicker();
    }
    // ...
}

в простейшем случае.) Если вы используете поиск по полям дат, вы можете использовать dataInit с jQuery.datepicker также в searchoptions таким же образом (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:singe_searching#colmodel_options). Использование jQuery.datepicker в jqGrid очень просто, но делает вашу программу более удобной.

Использование стандартного форматера даты (formatter: 'date') может быть полезно для преобразования исходного формата данных, отправляемого в jqGrid дляновый формат, который будет отображаться. Например,

formatter: 'date', formatoptions: {srcformat:'y-m-d', newformat: 'Y-M-d' }

Это менее интересно, но может немного уменьшить размер данных, передаваемых с сервера клиенту.

ОБНОВЛЕНО : Я должен признать, что я не проверял свое предложение с точно вашими даннымиформат.Только сейчас я протестировал все еще раз, а затем внимательно прочитал документацию jqGrid о datefmt (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options). Для datefmt только числовой формат для месяцев поддерживается! Так что значение навремя проверки даты должно быть в числовом формате. Что мы можем сделать? Например, следуя

, мы определяем как параметры navGrid функции «добавить» параметры (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:navigator параметр prmAdd) вроде следующего:

{ beforeCheckValues: function(posdata, formid, mode) {
      var data = posdata.Date;
      var dateParts = data.split("-");
      var mounth = dateParts[1];
      var mounths = $.jgrid.formatter.date.monthNames;
      var iMounth = -1;
      for (var i=0; i<12; i++) {
          if (mounth === mounths[i]) {
              iMounth = i;
              break;
          }
      }
      if (iMounth !== -1) {
          posdata.Date = dateParts[0]+'-'+(iMounth+1)+'-'+dateParts[2];
      }
  },
  beforeSubmit: function(postdata, formid) { 
      var data = postdata.Date;
      var dateParts = data.split("-");
      var mounths = $.jgrid.formatter.date.monthNames;
      postdata.Date = dateParts[0]+'-'+
                      $.jgrid.formatter.date.monthNames[dateParts[1]-1]+
                      '-'+dateParts[2];
      return [true,""];
  }
}

Таким образом, мы конвертируем поле Date в числовой формат внутри функции beforeCheckValues, а затем преобразуем все обратно в исходный формат (например, 2010-январь-23) после использованияиз checkDate. Это будет работать.

Основной вопрос сейчас: есть ли у нас какое-то преимущество от такой проверки даты? Мы можем просто не использовать editrules: { date:true } иреализовать нашу собственную проверку даты внутри функции beforeSubmit. Если мы обнаружим неправильную дату, мы должны вернуть [false,"My error message"], и jqGrid будет отображать наше пользовательское сообщение об ошибке «Мое сообщение об ошибке».

Так что самое простоерешение оЕсли ваша проблема возникнет, если мы сможем изменить формат даты на любую числовую форму (Г-мм-д, мм / д / Г или другую).Использование datepicker сделает для пользователей проблему с форматом не очень важной.Подумайте об этом и выберите способ, который вы предпочитаете.

1 голос
/ 08 апреля 2014

Я столкнулся с подобной проблемой. Я решил, используя пользовательские функции для проверки. Я подаю в суд на формат даты '23-янв-05 '. Вы можете изменить его в соответствии с требуемым форматом даты.

function datecheck(value, colname) {
            var dateParts = value.split("-");
            var datePart = dateParts[0];
            var mounth = dateParts[1];
            var yearPart = dateParts[2];

            var mounths = $.jgrid.formatter.date.monthNames;
            var monthPart = -1;
            for (var i = 0; i < 12; i++) {
                if (mounth === mounths[i]) {
                    monthPart = i + 1;
                    break;
                }
            }
            var dateText = monthPart + '-' + datePart + '-' + yearPart;
            var date = Date.parse(dateText);
            if (isNaN(date)) 
                return [false,"Invalid date. Format expected: dd-mmm-yy. (23-Jul-05)"];
            else 
            return [true,""];                  

        }

Подробности столбца JQGrid:

colModel: [name: 'JoiningDate', align: "center", editable: true, 
           editrules: { custom: true, custom_func: datecheck },
           formatter: 'date', formatoptions: { srcformat: 'y-m-d', newformat: 'd-M-y' }, edittype: 'text', editable: true,
           editoptions: { dataInit: function (el) { setTimeout(function () { $(el).datepicker({ dateFormat: 'd-M-y' }); }, 200); } }
            },

Надеюсь, это поможет.

С уважением,

Abhilash

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