예제 #1
0
 /**
  * Geolocation core functions
  * 
  * @global Object $objPage 
  */
 protected function checkGeolocation()
 {
     global $objPage;
     $arrMethods = array();
     // Check options for this page
     if ($objPage->geo_single_page == true) {
         $arrMethods = deserialize($objPage->geo_single_choose);
     } else {
         if ($objPage->geo_child_page == true) {
             $arrMethods = deserialize($objPage->geo_child_choose);
         } else {
             $intID = $objPage->pid;
             while ($intID != 0) {
                 $arrResult = $this->Database->prepare("SELECT * FROM tl_page WHERE id =?")->execute($intID);
                 if ($arrResult->numRows == 0) {
                     break;
                 }
                 $intID = $arrResult->pid;
                 if ($arrResult->geo_child_choose == true) {
                     $arrMethods = deserialize($arrResult->geo_child_choose);
                     break;
                 }
             }
         }
     }
     // Get current running method as string
     $stringCurrentRunning = "";
     switch ($this->objUserGeolocation->getTrackRunning()) {
         case GeolocationContainer::LOCATION_W3C:
             $stringCurrentRunning = "w3c";
             break;
         case GeolocationContainer::LOCATION_IP:
             $stringCurrentRunning = "ip";
             break;
         case GeolocationContainer::LOCATION_FALLBACK:
             $stringCurrentRunning = "fallback";
             break;
         case GeolocationContainer::LOCATION_NONE:
         default:
             $stringCurrentRunning = "none";
     }
     // Rest current running loacatin operation, if not in current methods
     if (!in_array($stringCurrentRunning, $arrMethods)) {
         $this->objUserGeolocation->setTrackRunning(GeolocationContainer::LOCATION_NONE);
         $this->objUserGeolocation->setFailed(false);
         $this->objUserGeolocation->setError("");
         $this->objUserGeolocation->setErrorID("");
     }
     // Check if optios were found
     if (count($arrMethods) != 0) {
         // Check each option
         foreach ($arrMethods as $value) {
             // Flag for skipping this foreach
             $booBreakOutter = false;
             // Some informations
             $intCurrenRunning = $this->objUserGeolocation->getTrackRunning();
             $intMethodsStillLeft = count($arrMethods) - $this->objUserGeolocation->countTrackFinished();
             switch ($value) {
                 case "w3c":
                     $booNoneRunning = $intCurrenRunning == GeolocationContainer::LOCATION_NONE;
                     $booAllreadyRun = $this->objUserGeolocation->isTrackFinished(GeolocationContainer::LOCATION_W3C);
                     // Check if no other method is running and if this is the first time
                     if ($booNoneRunning == true && $booAllreadyRun == false) {
                         // Include js and hock fpr w3c
                         $GLOBALS['TL_JAVASCRIPT']['geoCore'] = "system/modules/geolocation/html/js/geoCore.js";
                         $GLOBALS['TL_HOOKS']['parseFrontendTemplate'][] = array('Geolocation', 'insertJSVars');
                         // Set information
                         $this->objUserGeolocation->setTrackRunning(GeolocationContainer::LOCATION_W3C);
                         $this->objUserGeolocation->setFailed(false);
                         //Break foreach
                         $booBreakOutter = true;
                     } else {
                         if ($intCurrenRunning == GeolocationContainer::LOCATION_W3C && $this->objUserGeolocation->isFailed() == true) {
                             // Set information
                             $this->objUserGeolocation->addTrackFinished(GeolocationContainer::LOCATION_W3C);
                             $this->objUserGeolocation->setTrackRunning(GeolocationContainer::LOCATION_NONE);
                             // Set tracked true, if this the only method
                             if ($intMethodsStillLeft == 1) {
                                 $this->objUserGeolocation->setTracked(true);
                                 $this->objUserGeolocation->setFailed(true);
                             }
                         } else {
                             if ($intCurrenRunning == GeolocationContainer::LOCATION_W3C) {
                                 // Check if this is the only method
                                 if ($intMethodsStillLeft == 1) {
                                     $GLOBALS['TL_JAVASCRIPT']['geoCore'] = "system/modules/geolocation/html/js/geoCore.js";
                                     $GLOBALS['TL_HOOKS']['parseFrontendTemplate'][] = array('Geolocation', 'insertJSVars');
                                     $booBreakOutter = true;
                                 } else {
                                     // Skip W3C and use next
                                     $this->objUserGeolocation->addTrackFinished(GeolocationContainer::LOCATION_W3C);
                                     $this->objUserGeolocation->setTrackRunning(GeolocationContainer::LOCATION_NONE);
                                 }
                             }
                         }
                     }
                     break;
                 case "ip":
                     $booNoneRunning = $intCurrenRunning == GeolocationContainer::LOCATION_NONE;
                     $booAllreadyRun = $this->objUserGeolocation->isTrackFinished(GeolocationContainer::LOCATION_IP);
                     // Check if no other method is running and if this is the first time
                     if ($booNoneRunning == true && $booAllreadyRun == false) {
                         $this->objUserGeolocation->setFailed(false);
                         // Try to load the location from IP
                         $this->objUserGeolocation->setIP($_SERVER['REMOTE_ADDR']);
                         $objResult = $this->doIPLookUp($this->objUserGeolocation);
                         // Check if we got a result
                         if ($objResult == FALSE) {
                             $this->objUserGeolocation->addTrackFinished(GeolocationContainer::LOCATION_IP);
                             $this->objUserGeolocation->setTrackRunning(GeolocationContainer::LOCATION_NONE);
                             $this->objUserGeolocation->setError("No ip result.");
                             $this->objUserGeolocation->setErrorID(GeolocationContainer::ERROR_NO_IP_RESULT);
                             // Set information for geolocation
                             $this->objUserGeolocation->setIP(preg_replace("/\\.\\d?\\d?\\d?\$/", ".0", $this->objUserGeolocation->getIP()));
                             if ($intMethodsStillLeft == 1) {
                                 $this->objUserGeolocation->setTracked(true);
                                 $this->objUserGeolocation->setFailed(true);
                             }
                         } else {
                             // Got a result
                             $this->objUserGeolocation = $objResult;
                             $booBreakOutter = true;
                         }
                     }
                     break;
                 case "fallback":
                     $booNoneRunning = $intCurrenRunning == GeolocationContainer::LOCATION_NONE;
                     $booAllreadyRun = $this->objUserGeolocation->isTrackFinished(GeolocationContainer::LOCATION_FALLBACK);
                     // Check if a fallback is define
                     if ($booNoneRunning == true && $booAllreadyRun == false) {
                         if (strlen($GLOBALS['TL_CONFIG']['geo_countryFallback']) != 0) {
                             // Set information for geolocation
                             $this->objUserGeolocation->setCountry($this->getCountryByShortTag($GLOBALS['TL_CONFIG']['geo_countryFallback']));
                             $this->objUserGeolocation->setCountryShort($GLOBALS['TL_CONFIG']['geo_countryFallback']);
                             $this->objUserGeolocation->setTracked(true);
                             $this->objUserGeolocation->setTrackType(GeolocationContainer::LOCATION_FALLBACK);
                             $this->objUserGeolocation->addTrackFinished(GeolocationContainer::LOCATION_FALLBACK);
                             $this->objUserGeolocation->setFailed(false);
                             $this->objUserGeolocation->setError("");
                             $this->objUserGeolocation->setErrorID(GeolocationContainer::ERROR_NONE);
                         } else {
                             $this->objUserGeolocation->addTrackFinished(GeolocationContainer::LOCATION_FALLBACK);
                             $this->objUserGeolocation->setTrackRunning(GeolocationContainer::LOCATION_NONE);
                             $this->objUserGeolocation->setFailed(true);
                             $this->objUserGeolocation->setError("No fallback defined");
                             $this->objUserGeolocation->setErrorID(GeolocationContainer::ERROR_POSITION_UNAVAILABLE);
                             if ($intMethodsStillLeft == 1) {
                                 $this->objUserGeolocation->setTracked(true);
                                 $this->objUserGeolocation->setFailed(true);
                             }
                         }
                     }
                     break;
                 default:
                     break;
             }
             if ($booBreakOutter == true) {
                 break;
             }
         }
         // Save in Session and cookie
         $this->saveSession();
         $this->saveCookie();
     }
     $this->booRunFinished = true;
 }