WordPress.org

Ready to get started?Download WordPress

Forums

Contact Form 7
[resolved] Custom field validation code (12 posts)

  1. fusionx22
    Member
    Posted 3 years ago #

    Hello,

    I have a client that needs some custom validation code added to their forms.

    They require a specific ID number, and the number needs to be run through a LUHN algorithm (mod 10) to check for validity - similar to verifying a credit card number.

    Is there any way to hook into the process and run a custom validation routine, or would I need to hack up the text.php file and add my own tag definitions, etc? I really don't want to modify plug-in code.

    Thanks in advance!

    --jeff

    http://wordpress.org/extend/plugins/contact-form-7/

  2. Takayuki Miyoshi
    Member
    Plugin Author

    Posted 3 years ago #

    You don't need t edit the text.php file directly, but looking into the function wpcf7_text_validation_filter() defined in the text.php would help you learn how you can customize validation in your own plugin or functions.php in your theme.

    This is a sample code:

    add_filter( 'wpcf7_validate_text', 'your_validation_filter_func', 10, 2 );
    add_filter( 'wpcf7_validate_text*', 'your_validation_filter_func', 10, 2 );
    
    function your_validation_filter_func( $result, $tag ) {
    	$type = $tag['type'];
    	$name = $tag['name'];
    
    	if ( 'your-id-number-field' == $name ) {
    		$the_value = $_POST[$name];
    
    		if ( is_not_valid_against_your_validation( $the_value ) ) {
    			$result['valid'] = false;
    			$result['reason'][$name] = "Error message here";
    		}
    	}
    
    	return $result;
    }
  3. fusionx22
    Member
    Posted 3 years ago #

    Thank you very much for this.

    The one thing that stumps me, is I would like this to work on more than one field on the site - there are several forms that require this validation.

    this line:

    if ( 'your-id-number-field' == $name ) {

    makes me think I would need to define a new tag that is specific to my ID fields. Can that also be done in a new plug-in, to have it available in the Contact Form 7 plugin? I would think hacking the Contact Form 7 plug-in would be necessary.

    It would be great if CF7 had user defined tags :)

  4. Takayuki Miyoshi
    Member
    Plugin Author

    Posted 3 years ago #

    Yes. Add this into your plugin:

    wpcf7_add_shortcode( 'yourid', 'wpcf7_text_shortcode_handler', true );

    Then, use a tag like this inside the form:

    [yourid your-id-number-field]

  5. Takayuki Miyoshi
    Member
    Plugin Author

    Posted 3 years ago #

    In above case,

    $type = $tag['type'];
    $name = $tag['name'];

    $tag['type'] has "yourid" and $tag['name'] has "your-id-number-field". So, your_validation_filter_func() should be:

    function your_validation_filter_func( $result, $tag ) {
    	$type = $tag['type'];
    	$name = $tag['name'];
    
    	if ( 'yourid' == $type ) { // <--- this line changed
    		$the_value = $_POST[$name];
    
    		if ( is_not_valid_against_your_validation( $the_value ) ) {
    			$result['valid'] = false;
    			$result['reason'][$name] = "Error message here";
    		}
    	}
    
    	return $result;
    }
  6. fusionx22
    Member
    Posted 3 years ago #

    Takayuki-San, domo arigato gozaimasu!

  7. Karesansui
    Member
    Posted 3 years ago #

    Hi Jeff, glad you understood. I also need this but I am still not sure if I understand.

    Could you place the place the code (part of) you used with the variable and tag-names you used ? This may just help me enough to understand the application.

    As an example, I have two dates and need to check if the start date is before the end date. If not issue a message.

    Thanks,

  8. KZeni
    Member
    Posted 2 years ago #

    I can't thank you enough for making this plugin as flexible as it is while keeping the high-level aspects as simple as they are.

    I've just created a custom verification/validation function that prevents free email providers to be used for the email field, and I thought I'd share. BTW, this is a fully working example, but you can repurpose/modify it to do anything else.

    // Add custom validation for CF7 form fields
    function is_company_email($email){ // Check against list of common public email providers & return true if the email provided *doesn't* match one of them
    	if(
    		preg_match('/@gmail.com/i', $email) ||
    		preg_match('/@hotmail.com/i', $email) ||
    		preg_match('/@live.com/i', $email) ||
    		preg_match('/@msn.com/i', $email) ||
    		preg_match('/@aol.com/i', $email) ||
    		preg_match('/@yahoo.com/i', $email) ||
    		preg_match('/@inbox.com/i', $email) ||
    		preg_match('/@gmx.com/i', $email) ||
    		preg_match('/@me.com/i', $email)
    	){
    		return false; // It's a publicly available email address
    	}else{
    		return true; // It's probably a company email address
    	}
    }
    function custom_email_validation_filter($result,$tag){
    	$type = $tag['type'];
    	$name = $tag['name'];
    	if($name == 'company-email'){ // Only apply to fields with the form field name of "company-email"
    		$the_value = $_POST[$name];
    		if(!is_company_email($the_value)){ // Isn't a company email address (it matched the list of free email providers)
    			$result['valid'] = false;
    			$result['reason'][$name] = 'You need to provide an email address that isn\'t hosted by a free provider.<br />Please contact us directly if this isn\'t possible.';
    		}
    	}
    	return $result;
    }
    add_filter('wpcf7_validate_email','custom_email_validation_filter', 10, 2); // Email field
    add_filter('wpcf7_validate_email*', 'custom_email_validation_filter', 10, 2); // Req. Email field

    Thanks again, and I hope others might find this helpful.

  9. Takayuki Miyoshi
    Member
    Plugin Author

    Posted 2 years ago #

    Thanks, KZeni. I think this is a good example of custom validation.

  10. Joacim
    Member
    Posted 2 years ago #

    Can someone give me a step-to-step guide for this? Or is it impossible to understand if you're not a good programmer?

    - Thanks

  11. Joacim
    Member
    Posted 2 years ago #

    I have found this. Could i implement it somehow?

    It's for Swedish use

    Thanks

    function personnummer(nr){
    	this.valid=false;
    	if(!nr.match(/^(\d{2})(\d{2})(\d{2})\-(\d{4})$/)){ return false; }
    	this.now=new Date(); this.nowFullYear=this.now.getFullYear()+""; this.nowCentury=this.nowFullYear.substring(0,2); this.nowShortYear=this.nowFullYear.substring(2,4);
    	this.year=RegExp.$1; this.month=RegExp.$2; this.day=RegExp.$3; this.controldigits=RegExp.$4;
    	this.fullYear=(this.year*1<=this.nowShortYear*1)?(this.nowCentury+this.year)*1:((this.nowCentury*1-1)+this.year)*1;
    	var months = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    	if(this.fullYear%400==0||this.fullYear%4==0&&this.fullYear%100!=0){ months[1]=29; }
    	if(this.month*1<1||this.month*1>12||this.day*1<1||this.day*1>months[this.month*1-1]){ return false; }
    	this.alldigits=this.year+this.month+this.day+this.controldigits;
    	var nn="";
    	for(var n=0;n<this.alldigits.length;n++){ nn+=((((n+1)%2)+1)*this.alldigits.substring(n,n+1)); }
    	this.checksum=0;
    	for(var n=0;n<nn.length;n++){ this.checksum+=nn.substring(n,n+1)*1; }
    	this.valid=(this.checksum%10==0)?true:false;
    	this.sex=parseInt(this.controldigits.substring(2,3))%2;
    }
    </script>
    
    <form onsubmit="if(new personnummer(this.pnr.value).valid){ alert('A valid social security number'); } else { alert('No valid social security number'); }; return false;">
    Personnummer: <input type="text" name="pnr"> <input type="submit" value="Check">
    </form>
  12. Dinesh Karki
    Member
    Posted 2 years ago #

    This plugin will help to add more validation rules in contact form 7.
    http://wordpress.org/extend/plugins/jquery-validation-for-contact-form-7/

Topic Closed

This topic has been closed to new replies.

About this Plugin

About this Topic