views:

169

answers:

1

Hey peeps,

This is my requirement: I have a bunch of radio box selections (types of workflows). If one of the radios are selected(i.e one particular type of workflow selected), I want to run a custom validation on that. This is what i tried, but it's not behaving well. Any help?

jQuery part:

  $(document).ready(function() {
    // this part is to expand the child radio selection if particular parent workflow selected
    $("#concernedDirectorChoice").hide();
    $("input[name^=workflowChoice]").change( function (){  
      if($(this).attr("class")=='chooseDir'){
        $("#concernedDirectorChoice").show();
      }else{
        $("#concernedDirectorChoice").hide(); }
      });

    // FORM VALIDATION
    $.validator.addMethod("dirRequired", function(value, element) { 
      return this.optional(element) || ($("input[name^=rdDir:checked]").length);
    }, "That particular workflow requires a Director to be chosen. Please select Director");

    $("#contExpInitiateForm").validate({ 
      debug:true
      ,rules:{ 
        RenewalNo: {required: true, number: true},
        chooseDir: {dirRequired: true},
        workflowChoice: {required: true} }
      ,errorPlacement: function(error, element) {
        $('.errorMessageBox').text(error.html()); }
    });
  });

HTML form part:

   <!-- Pick type of workflow -->
   <table class="hr-table" >
       <tr>  <td class="hr-table-label " colspan=2 >Pick Workflow Type</td> </tr>
       <tr>
         <td> <input type="radio" name="workflowChoice" value="1"> </input> </td>
         <td> Workflow 1 </td>
       </tr>
       <tr>
         <td> <input type="radio" name="workflowChoice" value="2"  class="chooseDir"> </input> </td>
         <td> Workflow 2 (Dir selection required) </td>
       </tr>
       <tr>
         <td> <input type="radio" name="workflowChoice" value="3"> </input> </td>
         <td> Workflow 3 </td>
       </tr>
   </table>    

  <!-- Pick Director for Workflow type 2 -->
     <table id="concernedDirectorChoice" name="concernedDirectorChoice" >     
      <tr><td class="hr-table-label" colspan=2 > Choose Concerned Director</td></tr>
  <tr>
    <td><input type="radio" value='Dir1' name="rdDir" /></td>
    <td>Director 1</td>
  </tr>
  <tr>
    <td><input type="radio" value='Dir2' name="rdDir" /></td>
    <td>Director 2</td>
  </tr>
  <tr>
    <td><input type="radio" value='Dir3' name="rdDir" /></td>
    <td>Director 3</td>
  </tr>
   </table>  
+1  A: 

Your main issue is probably the selector, the :checked needs to beside the attirubte ([]) selector, so this input[name^=rdDir:checked] should be input[name^=rdDir]:checked.

From your markup, it looks like (to me!) that you want it required if any of <input type="radio" class="chooseDir" /> are selected, so need to change that to .chooseDir:checked anyway.

Also, the rules pairs should be nameOfElement: { rules}, so instead of chooseDir, you want rdDir to actually be required.

Just as a tip though, you can also do this without a custom method (if you're not using it in multiple places, in which case I'd stick with the custom method) since required: can take a selector instead of just a true/false. If the selector finds anything, it's required, if not, it's not required.

Here's everything above put together so you can see that the whole picture looks like:

$("#contExpInitiateForm").validate({ 
  debug:true
  ,rules:{ 
    RenewalNo: {required: true, number: true},
    rdDir: {required: ".chooseDir:checked"},
    workflowChoice: {required: true} }
  ,messages:{
    rdDir: "That particular workflow requires a Director to be chosen. Please select Director" }
  ,errorPlacement: function(error, element) {
    $('.errorMessageBox').text(error.html()); }
});

In the above code, the rdDir radio button list is required if any of the class="chooseDir" radio buttons are selected, and will display the message provided if it's required and is not filled in.

Nick Craver
Brother.. you are the man! Works perfectly. Never knew required could take selectors. That's a golden tip. cheers.
Kaushik Gopal