We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 3316
    • 28 Posts
    Here is what I need to do. I have created a zip code store locator script that returns 1 or more store locations to a page based on the zip code entered by the user (http://findairductcleaner.com/results?postcode=94041).

    I also have a form on that page that I would like to enable so the user can submit their information to all or 1 or 2 of the locations with one click.

    I’ve been able to get the locations returned and I have a form loaded on the results page, which is NOT actually an eForm form, and I even have check boxes that populate dynamically to match the results.

    How do I get this form to actually work so that when a user checks or unchecks a company and submits the form, the results go to the right people?

    Here’s the page: http://findairductcleaner.com/results?postcode=94041

    Basically, I just need to get the form on the right actually working correctly. Right now it does not actually work.

    Here is my code:

    
    <?php
    /*==============================================================================
    Application: Easy Postcode Finder
    Author: Leon Chevalier
    Version: V1.0
    Date: 16th December 2007
    URL: http://aciddrop.com/2007/12/17/quick-easy-and-free-nearest-store-postcodezip-finder/
    ------------------------------------------------------------------------------*/
    /** 
    * The curl class
    */	
    class curl {
    
    	/** 
    	* COnstructor
    	*/	
    	function curl() {
    	}
    	function init_curl($ch,$url,$postfields=null,$follow=null,$cookie=null,$referer=null) {
    		
    		// Set url
    		curl_setopt($ch, CURLOPT_URL, $url);
    		
    		// Enable Post
    		if($postfields) {
    			curl_setopt ($ch, CURLOPT_POST, 1);
    			curl_setopt ($ch, CURLOPT_POSTFIELDS, $postfields);
    		}
    		
    		if($follow) {
    		curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1 ); 		
    		}
    				
    		if($referer) {
    		curl_setopt($ch, CURLOPT_REFERER, $referer);
    		}
    						
    		//Enable SSL
    		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    		
    	
    		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    		
    		//Return results as string
    		curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    				
    		return $ch;
    	
    	} // end function
    	
    
    	/*
    	Grabs a page
    	*/
    
    	function get_page($options) {
    
    	//Set options
    	foreach($options AS $key=>$value) {
    	$$key = $value;	
    	}	
    			
    		$ch = curl_init();		
    		$ch = $this->init_curl($ch,$url,$postfields,$follow,$cookie);
    		$page = curl_exec($ch);
    		curl_close($ch);
    		return $page;
    	
    	
    	}
    	
    	
    } // end class
    
    /**
     * A simple wrapper for db functions
     *
     */
    class db_custom {
    
    	/**
    	 * Constructor
    	 *
    	 * A simple wrapper for database functions
    	 *
    	 */	
    	function db_custom()	{
    	
    	// database configuration
    	$host = "XXXXXXXXXXXX";
    	$user = "XXXXXXXXXXXX";
    	$pass = "XXXXXXXXXXXXXXXXX";
    	$db = "XXXXXXXXXXXX";	
    
    	// open database connection
    	$connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!");
    	// select database
    	mysql_select_db($db) or die ("Unable to select database!");
    
    
    	}
    
    	###############################################
    	## Updates an array of fields and values
    	## and reurn the resulting ID
    	###############################################
    	function quick_update($database,$fields,$values,$wherearray) {
    	//Variables
    	$num_array = count($values);
    	//Format NULL
    	$values = str_replace("'NULL'","NULL",$values);
    	//Write query
    	$query = "UPDATE `$database` SET ";
    	foreach ($fields AS $key=>$value) {
    	$count++;
    	$query .= " $fields[$key] = '$values[$key]'";
    	if ($count <> $num_array) { $query .= ","; }
    	}
    	//Create where
    	foreach ($wherearray AS $key=>$value) {
    	$counterv++;
    		$query_chk .= "$key = '" . trim($value) . "'";
    		
    			if ($counterv != count($wherearray)) {
    			$query_chk .= " AND ";
    			}
    	}
    	
    	$query .= " WHERE $query_chk";
    	$query = str_replace("'`","",$query);
    	$query = str_replace("`'","",$query);
    
    
    	$result = mysql_query($query) or die ("Error in query: $query. " . mysql_error());
    	$rows = mysql_affected_rows();
    	return $rows;
    	}
    	
    
    	######################################################
    	# Execute row
    	# runs query and gets row back
    	######################################################
    	function executeRow($query__ER,$type=null) {
    	$result__ER = mysql_query($query__ER) or die ("Error in query: $query__ER. " . mysql_error());
    		if($result__ER != 1) {
    			if($type!="array") {
    			$row__ER = mysql_fetch_object($result__ER);
    			} else {
    			$row__ER = mysql_fetch_assoc($result__ER);
    			}
    		return $row__ER;		
    		}
    	}
    	
    	######################################################
    	# Connects to the database and returns the 
    	# results in an array
    	######################################################
    	
    	function executeQuery($query,$func=null,$type="") {
    	
    		//Get the table name from the query
    		preg_match("/SELECT(.*)FROM( )([A-z_]+)/i",$query,$matches);
    		$table_name = $matches[3];
    		
    	$result = mysql_query($query) or die ("Error in query: $query. " . mysql_error());
    	$rows = mysql_num_rows($result);
    	$columns = mysql_fetch_assoc($result);
    	
    		if ($rows > 0) { // Only proceed if we have a result
    		
    		mysql_data_seek($result,0);
    			while ($row=mysql_fetch_array($result)) {
    			
    				foreach ($columns As $key=>$value) {
    				
    							
    							//Run any extra functions that have been sent over
    							if(is_array($func)) {			
    								foreach ($func AS $Fkey=>$Fvalue) {						
    								$row[$key] = $this->$Fvalue($row[$key],$key,$table_name);				
    								} // end FE			
    							} // end IF
    							
    								if($type == "object") {
    								//echo $key . "  "  . $row[$key] . "\n";
    								$tmp->$key = $row[$key];				
    								} else {
    								$tmp[$key] = $row[$key];
    								}
    									
    				}// end for each
    			
    					$results[] = $tmp;
    					unset($tmp);
    			} //end while 
    				
    		$final_result['result'] = $results;
    		$final_result['rows'] = mysql_num_rows($result);		
    		} else {
    		$final_result['rows'] = 0;		
    		}// end if
    	
    	return $final_result;
    	
    	} // end function
    	
    
    }
    
    /**
     * A postcode finder class
     *
     */
    class postcode_finder {
    
    	/**
    	* Constructor
    	*
    	*/
    	function postcode_finder($array) {
    	
    		if(is_array($array)) {
    			foreach($array AS $key=>$value) {
    			$this->$key = $value;
    			}
    		}	
    	
    		//DO stuff
    	
    	}
    
    	/**
    	* Setup database tables and insert lat longs
    	*
    	*/	
    	function setup() {
    	
    	$this->create_store_table();
    	$this->insert_example_stores();
    	$this->update_lat_lngs();	
    	
    	
    	}
    
    	/**
    	* Makes an example store table
    	*
    	*/	
    	function create_store_table() {
    	
    		//Create table
    		$query = "CREATE TABLE IF NOT EXISTS `modx_store` (
    		  `id` int(10) NOT NULL auto_increment,
    		  `name` varchar(75) NOT NULL default '',
    		  `address` text NOT NULL,
    		  `postcode` varchar(10) NOT NULL default '',
    		  `lat` double NOT NULL default '0',
    		  `lng` double NOT NULL default '0',
    		  `domain` varchar(10) NOT NULL default '',
    		  PRIMARY KEY  (`id`)
    		) ENGINE=MyISAM";
    		$this->db->executeRow($query);	
    	
    	
    	
    	
    	}
    
    	/**
    	* Update lat lngs
    	*
    	*/	
    	function update_lat_lngs() {
    		
    	//Get the list of stores
    	$query = "SELECT * FROM store 
    				WHERE `lat` = ''
    				LIMIT 0,10";
    	$stores = $this->db->executeQuery($query);
    	$stores = $stores['result'];
    	
    	//Run through stores and get lat / lng
    	foreach($stores AS $store) {
    	
    		$latlng = $this->get_lat_long($store['postcode'],$store['domain']);
    		
    		//Update store with its lat lng
    		$this->db->quick_update("store",
    								array('lat','lng'),
    								array($latlng['lat'],$latlng['lng']),
    								array('id'=>$store['id'])
    								);			
    				
    	}
    	
    	
    	}
    
    	/**
    	* Returns a lat / long of a given postcode
    	*
    	*/	
    	function get_lat_long($postcode,$domain=null) {
    		
    		if(!$domain) {
    		$domain = "com";
    		}
    
    		$url = "http://maps.google." . $domain . "/maps/geo?q=" . urlencode($postcode) . "&output=json&key=ABQIAAAA1LjTJt-5Xu_6mlpqkrf8TBSVn473B6do3GOC8HptIhDHy-w2KhQrN-Ey1C97zh0cY9yVqaWXm4OB4Q";
    						
    		$json = $this->curl->get_page(array("url"=>$url));
    						
    		$store_data = json_decode(str_replace(""","\"",htmlentities($json))); //Take care of accents
    								
    		$lng = $store_data->Placemark[0]->Point->coordinates[0];			
    		$lat = $store_data->Placemark[0]->Point->coordinates[1];
    		
    			//Return
    			if($lng && $lat) {
    	
    				return array('lat'=>$lat,
    							 'lng'=>$lng
    							 );
    						 
    			} else {
    			
    				return false;
    			
    			}
    
    	}
    
    
    	/**
    	* Get a list of our stores, sorted by distance to this postcode
    	*
    	*/	
    	function get_stores_list($postcode) {
    	
    		//If it's a UK postcode then format correctly
    		$postcode = $this->checkPostcode($postcode);
    	
    		$latlng = $this->get_lat_long($postcode);
    		
    		if(!$latlng) { //Unrecognised postcode
    		return false;
    		}
    		
    		$latitude = $latlng['lat'];
    		$longitude = $latlng['lng'];
    //		print_r($latlng);
    
    
    			$query = "SELECT *,
    						(((acos(sin((".$latitude."*pi()/180)) * sin((`lat`*pi()/180))
    						+cos((".$latitude."*pi()/180)) * cos((`lat`*pi()/180)) 
    						* cos(((".$longitude."- `lng`)*pi()/180))))*180/pi())*60*1.1515) 
    						as distance 
    							FROM `modx_store`
    							HAVING distance < 100
    							ORDER BY distance ASC
    							LIMIT 0,3
    					";
    			$stores = $this->db->executeQuery($query);
    			$stores = $stores['result'];			
    			
    			return $stores;
    	
    	
    	}
    
    
    	/**
    	* Checks whether supplied postcode is a valid UK postcode
    	*/
    	function checkPostcode($toCheck) {
    	
    	  $orig = $toCheck;
    	
    	  // Permitted letters depend upon their position in the postcode.
    	  $alpha1 = "[abcdefghijklmnoprstuwyz]";                          // Character 1
    	  $alpha2 = "[abcdefghklmnopqrstuvwxy]";                          // Character 2
    	  $alpha3 = "[abcdefghjkstuw]";                                   // Character 3
    	  $alpha4 = "[abehmnprvwxy]";                                     // Character 4
    	  $alpha5 = "[abdefghjlnpqrstuwxyz]";                             // Character 5
    	  
    	  // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
    	  $pcexp[0] = '^('.$alpha1.'{1}'.$alpha2.'{0,1}[0-9]{1,2})([0-9]{1}'.$alpha5.'{2})$';
    	
    	  // Expression for postcodes: ANA NAA
    	  $pcexp[1] =  '^('.$alpha1.'{1}[0-9]{1}'.$alpha3.'{1})([0-9]{1}'.$alpha5.'{2})$';
    	
    	  // Expression for postcodes: AANA NAA
    	  $pcexp[2] =  '^('.$alpha1.'{1}'.$alpha2.'[0-9]{1}'.$alpha4.')([0-9]{1}'.$alpha5.'{2})$';
    	  
    	  // Exception for the special postcode GIR 0AA
    	  $pcexp[3] =  '^(gir)(0aa)$';
    	  
    	  // Standard BFPO numbers
    	  $pcexp[4] = '^(bfpo)([0-9]{1,4})$';
    	  
    	  // c/o BFPO numbers
    	  $pcexp[5] = '^(bfpo)(c\/o[0-9]{1,3})$';
    	
    	  // Load up the string to check, converting into lowercase and removing spaces
    	  $postcode = strtolower($toCheck);
    	  $postcode = str_replace (' ', '', $postcode);
    	
    	  // Assume we are not going to find a valid postcode
    	  $valid = false;
    	  
    	  // Check the string against the six types of postcodes
    	  foreach ($pcexp as $regexp) {
    	  
    		if (ereg($regexp,$postcode, $matches)) {
    		  
    		  // Load new postcode back into the form element  
    		  $toCheck = strtoupper ($matches[1] . ' ' . $matches [2]);
    		  
    		  // Take account of the special BFPO c/o format
    		  $toCheck = ereg_replace ('C\/O', 'c/o ', $toCheck);
    		  
    		  // Remember that we have found that the code is valid and break from loop
    		  $valid = true;
    		  break;
    		}
    	  }
    			
    	  // Return with the reformatted valid postcode in uppercase if the postcode was 
    	  // valid
    	  if ($valid){
    	  return $toCheck;
    	  } else {
    	  $this->non_standard_postcode = true;
    	  return $orig;
    	  };
    	  
    	}	
    
    
    }
    
    //If we have a post
    if($_GET['postcode']) {
    	//Start database class
    	$db = new db_custom();
    	$curl = new curl();
    	$finder = new postcode_finder(array('db'=>$db,
    							  'curl'=>$curl));						  
    	$stores = $finder->get_stores_list($_GET['postcode']);						  
    }
    
    if($_GET['fill']) {
    
    	$db = new db_custom();
    	$curl = new curl();
    	$finder = new postcode_finder(array('db'=>$db,
    							  'curl'=>$curl));						  
    	$finder->setup();
    }
    ?>
    
    				<form id="resultsForm" action="" method="get">
    					<fieldset>
    					<legend>Search Another Zip Code</legend>					
    						<input type="text" name="postcode" value="<?= $_GET['postcode'] ?>" style="width:50px;text-align:center;"> 						
    						<input type="submit" value="Submit">
    					
    					</fieldset>
    				</form>
    				<? if ($_GET['fill']) { ?>
    				<h2 style="background-color:padding:2px">Database filled</h2>								
    				<? } ?>
    				<? if ($_GET['postcode']) { ?>
    					<? if ($stores) { ?>
    					<h4>The following air duct cleaners were found within 100 miles of your zip code:</h4>
                        <div class="quoteForm">
                        <h4>Get a Free Quote Now!</h4>
                            <form method="post" action="results" id="QuoteForm" name="quoteform">
                                <fieldset>
                                    <input name="formid" type="hidden" value="QuoteForm" />
                                    	<label for="cfZip">
                                    		<strong>Zip</strong><br />
                                            <input type="text" value="<?= $_GET['postcode'] ?>" name="zip" readonly="readonly" />
                                        </label><br />
                                        <label for="cfName">
                                            <strong>Name</strong><br />
                                            <input value="" name="fullname" id="cfName" class="text" type="text" eform="Your Name::1:" />
                                        </label><br />
                                        <label for="cfEmail">
                                            <strong>Email</strong><br />
                            
                                            <input value="" name="email" id="cfEmail" class="text" type="text" eform="Email Address:email:1" />
                                        </label><br />
                                        <label for="cfRegarding">
                                            <strong>Phone</strong><br />
                                            <input value="" name="phone" id="cfRegarding" class="text" type="text" eform="Phone::1" />
                                        </label><br />
                                        <div class="special">
                                              <label for="cfSpecial">
                            
                                                    Special<br /><input value="" name="special" id="cfSpecial" class="text" type="text" eform="Special:date:0"  />
                                              </label>
                                        </div>
                                        <label for="recipient">
                                           <strong>Send request to:</strong><br /><span style="font-size:85%">(Must choose at least one)</span><br />
    										<ul class="checkboxes"><? foreach($stores AS $store) { ?>
                                            <li><input name="<?= $store['name'] ?>[]" eform="Recipient::1" type="checkbox" value="<?= $store['name'] ?>" checked="checked" /> <?= $store['name'] ?></li>
                                            <? } ?></ul>
                                        </label><br />
                                        <label for="cfMessage">
                                            <strong>Comments</strong><br />
                                        <textarea value="" name="message" id="cfMessage" eform="Message:textarea:0"></textarea>
                                        </label><br />
                                        <label> </label><p><input type="submit" name="contact" id="cfContact" class="button" value="Send Email" />
                                </fieldset>
                            </form>
                        </div>
    						<? foreach($stores AS $store) { ?>
    							<div class="listing">
    								<h4><?= $store['name'] ?><span class="distance"> (<?= number_format($store['distance'],2) ?> mi)</span></h4>
    								<p><?= $store['address'] ?> <?= $store['postcode'] ?></p>
    							</div>
    						<? } ?>
    					<? } else { ?>
    					<h4 class="noneFound">There are no air duct cleaners in our network within 100 miles of your zip code.</h4>					
    					<? } ?>	
    				<? }
    ?>