/** * @param Array - $googleMapAddressArray: an array of geographic data provided by google maps * @param Int - $maxRadius: maximum number of kilometers (as the bird flies) between search point defined in $googleMapAddressArray and city found. * @return Object | false : returns a BrowseCitiesPage or false if nothing was found **/ public static function get_clostest_city_page($googleMapAddressArray, $maxRadius = 500) { $cityPage = null; $suburbPage = null; $bt = defined('DB::USE_ANSI_SQL') ? "\"" : "`"; $existingDistance = $maxRadius + 1; $newDistance = $maxRadius + 1; $existingPage = null; $newPage = null; $radiusSelectionSQL = self::radiusDefinitionOtherTable($googleMapAddressArray[0], $googleMapAddressArray[1], "BrowseCitiesPage", "Latitude", "Longitude"); $sqlQuery = new SQLQuery(); $sqlQuery->select = array("{$bt}BrowseCitiesPage{$bt}.{$bt}ID{$bt}, " . $radiusSelectionSQL . " as distance"); $sqlQuery->from[] = "{$bt}BrowseCitiesPage{$bt}"; $sqlQuery->where[] = $radiusSelectionSQL . " < " . $maxRadius; $sqlQuery->orderby = " distance "; $sqlQuery->limit = "1"; $result = $sqlQuery->execute(); $page = null; foreach ($result as $row) { $existingDistance = $row["distance"]; $existingPage = DataObject::get_by_id("BrowseCitiesPage", $row["ID"]); } $radiusSelectionSQL = self::radiusDefinitionOtherTable($googleMapAddressArray[0], $googleMapAddressArray[1], "cities", "Latitude", "Longitude"); $sqlQuery = new SQLQuery(); $sqlQuery->select = array("cities.CityID", $radiusSelectionSQL . " as distance"); $sqlQuery->from[] = "{$bt}cities{$bt}"; $sqlQuery->where[] = $radiusSelectionSQL . " < " . $maxRadius; $sqlQuery->orderby = " distance "; $sqlQuery->limit = "1"; $result = $sqlQuery->execute(); foreach ($result as $row) { $sameOne = false; if ($existingPage) { if ($row["CityID"] == $existingPage->HiddenDataID) { $sameOne = true; } } if (!$sameOne) { $newPage = self::create_city_and_parents($row["CityID"]); $newDistance = $row["distance"]; } } if ($newPage && $newDistance < $existingDistance && $newDistance < $maxRadius) { $cityPage = $newPage; } elseif ($existingPage && $existingDistance < $maxRadius) { $cityPage = $existingPage; } if ($cityPage) { if ($cityPage->allowBrowseChildren()) { $suburbPage = BrowseSuburbPage::create_suburb($googleMapAddressArray, $cityPage); } } if ($suburbPage) { return $suburbPage; } return $cityPage; }
/** * Creates a region... called from BrowseCountriesPage * *@param Array $googleMapAddressArray - array of google Map Address Data *@param Object $parent - a BrowseCountriesPage object *@return Object | false - returns the BrowseSuburbPage if there is one. * **/ public static function create_suburb($googleMapAddressArray, BrowseCitiesPage $parent) { if ($parent && isset($googleMapAddressArray["LocalityName"]) && isset($googleMapAddressArray[0]) && isset($googleMapAddressArray[1])) { $name = htmlentities($googleMapAddressArray["LocalityName"]); if ($name) { $page = DataObject::get("BrowseSuburbPage", "\"Title\" = '" . $name . "' AND \"ParentID\" = " . $parent->ID); if (!$page) { $page = new BrowseSuburbPage(); $page->ParentID = $parent->ID; $page->Title = $name; $page->MetaTitle = $name; $page->MenuTitle = $name; $page->Longitude = $googleMapAddressArray[0]; $page->Latitude = $googleMapAddressArray[1]; $page->writeToStage('Stage'); $page->publish('Stage', 'Live'); $page->flushCache(); } $page = DataObject::get("BrowseSuburbPage", "\"Title\" = '" . $name . "' AND \"ParentID\" = " . $parent->ID); } } }