Подтвердить дату между несколькими датами в jQuery.validate и datepicker

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

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

и т.п.

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

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

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


person amunds    schedule 21.09.2010    source источник
comment
Вы поняли это?   -  person Silkster    schedule 15.10.2010
comment
Боюсь, что нет, у меня больше не было времени изучать это с момента публикации вопроса. Но это абсолютно то, что мне нужно выяснить в ближайшее время.   -  person amunds    schedule 17.10.2010
comment
эти значения жестко закодированы в форму или меняются? Если да, то у меня может быть решение.   -  person Alastair Pitts    schedule 25.10.2010
comment
Извините за поздний ответ, они постоянны на момент создания формы. Они не изменятся, как только вы окажетесь в форме, однако существует буквально сотня различных комбинаций форм. Поэтому мне нужно что-то, что работает независимо от того, какие значения находятся в форме.   -  person amunds    schedule 31.10.2010
comment
@Alistair: В свете ответа @amunds на ваш комментарий, можете ли вы опубликовать решение, о котором вы думали? Если вы все еще помните это... :) Спасибо.   -  person Bill the Lizard    schedule 04.01.2011


Ответы (1)


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

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

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, чтобы он принимал даты, а не поля, и напишите правило-оболочку, чтобы принимать массив пар дат.

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

person dnagirl    schedule 07.01.2011