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>
<? } ?>
<? }
?>