2010-09-21 4 views
1

Я использую jQuery.datepicker и jQuery.validate. В моей форме у меня есть несколько диапазонов дат:Подтвердить дату между несколькими датами в jQuery.validate и datepicker

2010-02-10 - 2010-02-18 
2010-03-01 - 2010-03-12 
2010-03-15 - 2010-03-19 

и т.д.

Теперь мне нужно проверить поле Datepicker, чтобы проверить, если дата, установленная в DatePicker между любой из этих диапазонов дат. Например, 2010-01-01 будет недействительным, как и 2010-02-19.

Я видел несколько ответов, но на самом деле они не связаны с несколькими диапазонами, насколько я могу судить.

Надеюсь, что кто-нибудь узнает решение или, по крайней мере, может намекнуть мне в правильном направлении. Я думаю, может быть, зацикливание каждого daterange в .each() и запуск проверки там. Но, вероятно, лучший способ.

+0

Вы поняли это? – Silkster

+0

Не бойтесь, у меня не было времени, чтобы заглянуть в него, начиная с размещения вопроса. Но мне нужно кое-что выяснить. – amunds

+0

Эти значения жестко закодированы в форму или меняются? Если это так, у меня может быть решение. –

ответ

1

Ваш вопрос - это то, что я пытался выяснить на какое-то время. Это то, что у меня есть до сих пор.

Я использую это для проверки единственного диапазона дат. Он принимает входные поля, как Params, а не даты:

jQuery.validator.addMethod("rangeDate", function(value, element, params) { 
    try { 
     var beforedate=$.datepicker.parseDate($(params[0]).datepicker('option','dateFormat'),$(params[0]).val()); 
     var afterdate=$.datepicker.parseDate($(params[1]).datepicker('option','dateFormat'),$(params[1]).val()); 
     var qdate=$.datepicker.parseDate($(element).datepicker('option','dateFormat'),value); 
     return this.optional(element) || (qdate >= beforedate && qdate<=afterdate); 
    } catch(err){ 
     return false; 
    } 
}, function(params){ 
    return "Date must occur between " + $(params[0]).val() + ' and ' + $(params[1]).val(); 
} 
); 

и правило выглядит следующим образом:

rules:{ 
    between_date: { dateCan: true, 
     rangeDate: { 
      depends: function(element) { //check that params exist 
       return $("input[name='before_date']").valid() 
         && $("input[name='after_date']").valid(); 
      }, 
      param: ["input[name='before_date']", "input[name='after_date']"] 
     } 
    } 
} 

После экспериментов немного, я видел, что это возможно, чтобы иметь более одного rangeDate правила для поля. Тем не менее, последний вызов переписывает результаты всех предыдущих вызовов rangeDate для этого поля. Итак, думаю, что может работать, заключается в добавлении другого настраиваемого правила, которое принимает массив пар полей, который может быть подан в rangeDate. Проблема с этим подходом заключается в том, что правило depends для правила rangeDate становится громоздким, так как вы получаете больше пар дат. Это особенно важно, если вам требуется только наличие одной пары, а не всех пар.

Конечно, если диапазоны дат не являются динамическими, проблема проще, потому что не требуется depends. Просто перепишите rangeDate, чтобы принять даты, а не поля, и написать правило оболочки, чтобы принять массив пар дат.

Если вы нашли решение проблемы, мне бы очень хотелось ее увидеть. Надеюсь, он будет более изящным, чем мой.