2010-09-21 5 views
1

J'utilise jQuery.datepicker et jQuery.validate. Dans ma forme j'ai plusieurs plages de dates:Validez la date entre plusieurs dates dans jQuery.validate et datepicker

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

etc.

Maintenant, je dois valider le champ DatePicker pour vérifier si la date fixée dans le datepicker se situe entre l'une de ces plages de dates. Par exemple, 2010-01-01 serait invalide, tout comme le 2010-02-19.

J'ai vu quelques réponses mais elles ne se rapportent pas vraiment à plusieurs gammes, pour autant que je puisse voir.

J'espère que quelqu'un connaîtra une solution, ou au moins peut me donner des indications dans la bonne direction. Je pense peut-être en boucle chaque daterange dans un .each() et l'exécution d'une validation là-bas. Mais il y a probablement un meilleur moyen.

+0

Avez-vous compris? – Silkster

+0

Peur, je n'ai pas eu le temps d'y jeter un œil depuis que j'ai posté la question. Mais c'est absolument quelque chose que je dois comprendre bientôt. – amunds

+0

sont ces valeurs codées en dur dans le formulaire ou en changeant? Si oui, je peux avoir une solution. –

Répondre

1

Votre question est quelque chose que j'ai essayé de comprendre depuis un moment aussi. C'est ce que j'ai jusqu'ici. Je l'utilise pour valider une plage de dates unique. Il faut des champs d'entrée comme params plutôt que les dates:

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(); 
} 
); 

et la règle ressemble à ceci:

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']"] 
     } 
    } 
} 

Après avoir expérimenté un peu, je l'ai vu qu'il est possible d'avoir plus d'une règle rangeDate pour un champ. Toutefois, le dernier appel semble écraser les résultats de tous les appels rangeDate précédents pour ce champ. Donc, je pense ce qui pourrait fonctionner est d'ajouter une autre règle personnalisée qui accepte un tableau de paires de champs qui peuvent être alimentés à rangeDate. Le problème avec cette approche est que la clause depends pour la règle rangeDate devient difficile car vous obtenez plus de paires de dates. Cela est particulièrement vrai si vous n'avez besoin que d'au moins une paire pour être présente plutôt que pour toutes les paires.

Bien sûr, si les plages de dates ne sont pas dynamiques, le problème est plus facile car aucune clause depends n'est nécessaire. Il suffit de réécrire rangeDate pour accepter les dates plutôt que les champs et écrire une règle d'encapsulation pour accepter un tableau de paires de dates.

Si vous avez trouvé une solution au problème, j'aimerais le voir. J'espère que ce sera plus élégant que le mien.

Questions connexes