Jump to content

Compare Dates in Loop and Increment Value


jarvis

Recommended Posts

Hi All,

I'm hoping someone can help as I've got myself in a muddle on some code.

Basically, the form has a date field (date moved in).

If the date entered is over 3 years old, all's ok

However, if the date entered is less than 3 years old, the user needs to complete a list field. The list field is essentially a repeater field with a date and address field.

If the user adds a date and address and this (plus the original date) is more than 3 years combined history - happy days!

If the user adds a date and address and they've still not hit 3 years history, then I need to increase the number of rows (this is handled by another function which works by incrementing a field on the form.

As it stands, it works until I need another field to appear i.e. they've entered the first date, then entered a date within the list/repeater field but still not got 3 years worth.

I think it's more or less there but seem to have muddled some of the logic (I think/hope!). A fresh pair of eyes would be great:

Here's my code:

function dateDiffInDays($date1, $date2) { 
    # Calulating the difference in timestamps 
    $diff = strtotime($date2) - strtotime($date1); 
      
    # 1 day = 24 hours 
    # 24 * 60 * 60 = 86400 seconds 
    return abs(round($diff / 86400)); 
} 

add_filter( 'gform_pre_render_2', 'applicant_2_previous_address_history' );
add_filter( 'gform_pre_validation_2', 'applicant_2_previous_address_history' );
function applicant_2_previous_address_history( $form ) {

	#get the value from the form date input d/m/Y so need to change
	$get_moved_in_date = rgpost( 'input_1' );
	if ( $get_moved_in_date ) {
		#convert the date format
		$moved_in_date = date_format(date_create_from_format('d/m/Y', $get_moved_in_date), 'd-m-Y'); 	
		#echo "New date format is: ".$moved_in_date. "<br/>"; 
	}
	
	#get todays date
	$today = date("d-m-Y");
	#echo "<h3>Today: ".$today."</h3>";
	
	#calculate the difference in days
	$dateDiff = dateDiffInDays($today, $moved_in_date); 	
	#printf("<p>Difference between two dates: " . $dateDiff . " Days</p>"); 	

	#check if we moved in less than 3 years ago
	if ( $dateDiff < 1095 ) {
		
		#less than 3 years, so need to loop through the list fields, compare dates and tally totals days
		if ( $days_sum < 1095 ) {
			
			# get the input from the list
			$list_values = rgpost( 'input_2' );
			$i = 0; #use this to get even rows only due to the way data is stored :(
			$sum = 0; #use this to increment the no. of rows in the list
			$previous = null; #use this to calc date difference between rows
			$days_sum = $dateDiff; #set the total number of days. Don't start at 0, start from current date - time at current residence
			if ( $list_values ) {
				foreach ( $list_values as $key => $value ){
					#get even rows only
					if($i%2 == 0){
						
						#$sum = $sum + 1; #increment our rows
						
						if ( $value ) {
							#convert the date format
							$additional_date = date_format(date_create_from_format('d/m/Y', $value), 'd-m-Y');
							#echo "<h3>Date: ".$additional_date."</h3>";
						}			
								
						if ( $previous !== null ){ # if it's null, we're in the first loop
						
							#convert the date format
							$previous_date = date_format(date_create_from_format('d/m/Y', $previous), 'd-m-Y');
							
							$dateDiff2 = dateDiffInDays($additional_date, $previous_date); 	
							printf("<p>Next Iteration Difference between " . $additional_date . " and " . $previous_date . " is: " . $dateDiff2 . " Days</p>"); 	
							
							$days_sum = $days_sum + $dateDiff2;
							
						} else {
							
							#convert the date format
							$dateDiff1 = dateDiffInDays($additional_date, $moved_in_date); 	
							printf("<p>1st Iteration Difference between " . $additional_date . " and " . $moved_in_date . " is: " . $dateDiff1 . " Days</p>"); 	
							
							$days_sum = $days_sum + $dateDiff1;
							
						}
						
						$previous = $value; # set the current value, so it will be saved for the next iteration
			
					}
					$i++;
				} #end foreach $list_values
			} #endif $list_values
			$sum = $sum + 1; #increment our rows
			echo "<p>Total no of days = " .$days_sum.'</p>';
			
		} #endif $days_sum < 1095	
	
		echo '<p>Not enough days so loop through list</p>';
		$flag = 'true';
		
	} else {
		
		echo '<p>Were ok!</p>';
		$flag = 'false';	
		
	} #endif $dateDiff < 1095



	/*
	if ( $dateDiff < 1095 ) {
		$value = 'yes';
	} else {
		$value = 'no';	
	}	
	*/

	#we moved in less than 3 years ago, so get history
	if ( $flag == 'false' ) {		
        return $form;
    } 

    foreach ( $form['fields'] as &$field ) {
        if ( $field->id == 2 ) {
            $field->isRequired = true;
        }
		echo "<p>The sum of array element is = " .$sum.'</p>';
		if ( $field->id == 3 ) {
			$_POST['input_3'] = $sum;
		}
		
    }

    return $form;
	
}

Thanks

Link to comment
Share on other sites

I "think" I may have sussed this:

add_filter( 'gform_pre_render_2', 'applicant_2_previous_address_history' );
add_filter( 'gform_pre_validation_2', 'applicant_2_previous_address_history' );
function applicant_2_previous_address_history( $form ) {

	#get the value from the form date input d/m/Y so need to change
	$get_moved_in_date = rgpost( 'input_1' );
	if ( $get_moved_in_date ) {
		#convert the date format
		$moved_in_date = date_format(date_create_from_format('d/m/Y', $get_moved_in_date), 'd-m-Y'); 	
		#echo "New date format is: ".$moved_in_date. "<br/>"; 
	}
	
	#get todays date
	$today = date("d-m-Y");
	#echo "<h3>Today: ".$today."</h3>";
	
	#calculate the difference in days
	$dateDiff = dateDiffInDays($today, $moved_in_date); 	
	#printf("<p>Difference between two dates: " . $dateDiff . " Days</p>"); 	
	
	
	if ( $dateDiff < 1095 ) {
		
		#$flag = 'true';
		
		# get the input from the list
		$list_values = rgpost( 'input_2' );
		$i = 0; #use this to get even rows only due to the way data is stored :(
		$sum = 0; #use this to increment the no. of rows in the list
		$previous = null; #use this to calc date difference between rows
		$days_sum = $dateDiff; #set the total number of days. Don't start at 0, start from current date - time at current residence		
		
			if ( $list_values ) {
				foreach ( $list_values as $key => $value ){
					#get even rows only
					if($i%2 == 0){
						
						$sum = $sum + 1; #increment our rows
						
						if ( $value ) {
							#convert the date format
							$additional_date = date_format(date_create_from_format('d/m/Y', $value), 'd-m-Y');
							echo "<h3>Date: ".$additional_date."</h3>";
						}			
								
						if ( $previous !== null ){ # if it's null, we're in the first loop
						
							#convert the date format
							$previous_date = date_format(date_create_from_format('d/m/Y', $previous), 'd-m-Y');
							
							$dateDiff2 = dateDiffInDays($additional_date, $previous_date); 	
							printf("<p>Next Iteration Difference between " . $additional_date . " and " . $previous_date . " is: " . $dateDiff2 . " Days</p>"); 	
							
							$days_sum = $days_sum + $dateDiff2;
							
						} else {
							
							#convert the date format
							$dateDiff1 = dateDiffInDays($additional_date, $moved_in_date); 	
							printf("<p>1st Iteration Difference between " . $additional_date . " and " . $moved_in_date . " is: " . $dateDiff1 . " Days</p>"); 	
							
							$days_sum = $days_sum + $dateDiff1;
							
						}
						
						$previous = $value; # set the current value, so it will be saved for the next iteration
			
					}
					$i++;
				} #end foreach $list_values
			} #endif $list_values
			#$sum = $sum + 1; #increment our rows
			echo "<p>Total no of days = " .$days_sum.'</p>';		
			
			if ( $days_sum < 1095 ) {
				echo '<p>Not enough days so loop through list</p>';
				$sum = $sum + 1; #increment our rows
				$flag = 'true';
			}
				
	} else {
		echo '<p>Were ok!</p>';
		$flag = 'false';	
	}		

	#we moved in less than 3 years ago, so get history
	if ( $flag == 'false' ) {		
        return $form;
    } 
		
	echo "<p>The sum of array element is = " .$sum.'</p>';
	
    foreach ( $form['fields'] as &$field ) {
        if ( $field->id == 2 ) {
            $field->isRequired = true;
        }

		
		if ( $field->id == 3 ) {
			$_POST['input_3'] = $sum;
		}
		
    }

    return $form;
	
}

From initial testing, this now seems to work!

Link to comment
Share on other sites

I would have thought it better to this client-side.

This example prompts for address and date moved in, then until date oder than three years is entered it prompts for a previous address

<?php
// HANDLE THE AJAX REQUEST
if (isset($_GET['prevdate'])) {
    $dt = new DateTime($_GET['prevdate']);
    $years = $dt->diff(new DateTime())->y;
    if ($years >= 3) {
        exit("OK");
    }
    else {
        exit('<div>
                <b>Previous Address</b><br>
                <input type="text" name="prevadd[]"  class="prevadd" size="55">
                <b>Moved in</b> <input type="date" name="prevdate[]" class="prevdate" onchange="checkDate(this)">
            </div>');
    }
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
        function checkDate(dobj) {
            var date = $(dobj).val()
            $.get(
                "",
                {"prevdate":date},
                function(resp) {
                    if (resp != "OK") {
                        $("#prevaddresses").append(resp)
                    }
                },
                "TEXT"
            )
        }
</script>
<style type="text/css">
    #prevaddresses {
        padding: 16px;
        border: 1px solid gray;
        width: 600px;
        margin: 16px auto;
    }
</style>
</head>
<body>
<h1>Example</h1>
<div id="prevaddresses">   
    <div>
        <b>Address</b><br>
        <input type="text" name="prevadd[]"  class="prevadd" size="55">
        <b>Moved in</b> <input type="date" name="prevdate[]" class="prevdate" onchange="checkDate(this)">
    </div>
</div>
</body>
</html>

It could be pure JS but I used ajax to take advantage of PHP's date arithmetic.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.