ตัวสร้างเว็บไซต์

'Zip Code Redirect', 'page callback' => 'drupal_get_form', 'page arguments' => array('zipcode_redirect_settings'), 'access arguments' => array('administer zipcode redirect'), 'file' => 'zipcode_redirect.admin.inc', ); $items['zipcode_redirect/addanother_js'] = array( 'page callback' => 'zipcode_redirect_add_fields_js', 'access arguments' => array('administer zipcode redirect'), 'type' => MENU_CALLBACK, 'file' => 'zipcode_redirect.admin.inc', ); return $items; } /** * Implemtation of hook_init(). */ function zipcode_redirect_init() { drupal_add_css(drupal_get_path('module', 'zipcode_redirect') .'/zipcode_redirect.css', 'module'); } function zipcode_redirect_block($op = 'list', $delta = 0, $edit = array()) { if ($op == 'list') { $blocks[0] = array( 'info' => t('Zipcode Redirect Form'), ); return $blocks; } else if ($op == 'view') { switch ($delta) { case 0: $block = array( 'subject' => t('Zipcode Redirect'), 'content' => zipcode_redirect_block_content(), ); break; } return $block; } } /** * Block Definition */ function zipcode_redirect_block_content() { static $message_set = FALSE; if ($_COOKIE['zr_cookie_zip'] != '' && is_numeric($_COOKIE['zr_cookie_zip'])) { // Prevent endless redirect loops and set message if (isset($_GET['zr_redirect'])) { if ($message_set == FALSE) { drupal_set_message(t('An error has occured. Please notify administrator (Watchdog: zipcode_redirect)'), 'error'); watchdog('zipcode_redirect', 'Zipcode Redirect module not configured properly. Configuration causes an endless loop. Zipcode Redirect Block should not be displayed on pages that are the result of a zipcode redirect', array(), WATCHDOG_CRITICAL); // Delete the cookie setcookie(ZR_COOKIE_ZIP, $user_zipcode, time() - 3600, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure') == '1'); } $message_set = TRUE; } else { zipcode_redirect_redirect($_COOKIE['zr_cookie_zip']); } } return drupal_get_form('zipcode_redirect_search_form'); } /** * Form Definition for the Search Form */ function zipcode_redirect_search_form() { $form['zipcode'] = array( '#type' => 'textfield', '#title' => t('Enter your Zipcode'), '#size' => 40, '#default_value' => $_COOKIE['zr_cookie_zip'], '#maxlength' => 5, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Go'), ); return $form; } /** * Make sure that a number was entered */ function zipcode_redirect_search_form_validate($form, &$form_state) { if (strlen($form_state['values']['zipcode']) < 5 || !is_numeric($form_state['values']['zipcode'])) { form_set_error('zipcode', t('Please enter in a valid 5 digit zipcode')); } } /** * Implmentation of hook_submit() */ function zipcode_redirect_search_form_submit(&$form, &$form_state) { zipcode_redirect_redirect($form_state['values']['zipcode']); } /** * Handler for redirecting user to URL based on zip code * * @param $user_zipcode The zip code that the user entered */ function zipcode_redirect_redirect($user_zipcode) { $saved_zipcodes = variable_get('zipcode_redirect_zips', array()); // Set cookie to prevent users getting the zipcode form after submission $expires = ini_get('session.cookie_lifetime'); $expires = (!empty($expires) && is_numeric($expires) ? time() + (int)$expires : 0); setcookie(ZR_COOKIE_ZIP, $user_zipcode, $expires, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure') == '1'); foreach ($saved_zipcodes as $zipcode) { // Grab the Latitude and Longitude for the saved zipcodes $saved_geo = db_fetch_object(db_query("SELECT latitude lat, longitude lon FROM {zr_zipcodes} WHERE zip = %d", $zipcode['zr_zipcode'])); // Get the user entered zipcode Latitude and Longitude $user_geo = db_fetch_object(db_query("SELECT latitude lat, longitude lon, city, state FROM {zr_zipcodes} WHERE zip = %d", $user_zipcode)); $distance = _zipcode_redirect_calculate($saved_geo, $user_geo); if ($distance <= $zipcode['zr_radius']) { drupal_goto($zipcode['zr_true'], 'zr_redirect'); } } drupal_goto($zipcode['zr_false'], 'zr_redirect'); } /** * Calculate the distance between two points using the Haversine method * * This formula for this calculation was taken from * http://mathforum.org/library/drmath/view/51879.html (snippet below) * dlon = lon2 - lon1 * dlat = lat2 - lat1 * a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 * c = 2 * atan2(sqrt(a), sqrt(1-a)) * d = R * c */ function _zipcode_redirect_calculate($saved_geo, $user_geo) { // Convert Lat/Long to radians $rlat1 = deg2rad($user_geo->lat); $rlon1 = deg2rad($user_geo->lon); $rlat2 = deg2rad($saved_geo->lat); $rlon2 = deg2rad($saved_geo->lon); // Get the differences $dlon = $rlon2 - $rlon1; $dlat = $rlat2 - $rlat1; // Calculate the Arc $a = pow(sin($dlat/2.0), 2) + cos($rlat1) * cos($rlat2) * pow(sin($dlon/2.0), 2); // Great Circle Distance in Radians $c = 2 * atan2(sqrt($a), sqrt(1-$a)); // Muliply the Radius of the Earth in desired unit with Great Circle Distance in Radians $R = variable_get('zipcode_redirect_units', 'mi') == "mi" ? 3956 : 6367; // Calculating the earth distance (Radius of earth x Distance in Radians) // $d will take on the units of $R (i.e. if $R unit is km, $d will be km) $d = $R * $c; return $d; }