name values, starting with the Top Level // e.g. array(0=>'Top Level', 16=>'England', 19=>'London', 217=>'Westminster'); // NB This function exists in both places.php and places_edit.php function place_id_to_hierarchy($id) { $statement= WT_DB::prepare("SELECT pl_parent_id, pl_place FROM `##placelocation` WHERE pl_id=?"); $arr=array(); while ($id!=0) { $row=$statement->execute(array($id))->fetchOneRow(); $arr=array($id=>$row->pl_place)+$arr; $id=$row->pl_parent_id; } return $arr; } // NB This function exists in both admin_places.php and places_edit.php function getHighestIndex() { return (int)WT_DB::prepare("SELECT MAX(pl_id) FROM `##placelocation`")->fetchOne(); } function getHighestLevel() { return (int)WT_DB::prepare("SELECT MAX(pl_level) FROM `##placelocation`")->fetchOne(); } /** * Find all of the places in the hierarchy */ function get_place_list_loc($parent_id, $inactive=false) { if ($inactive) { $rows= WT_DB::prepare("SELECT pl_id, pl_place, pl_lati, pl_long, pl_zoom, pl_icon FROM `##placelocation` WHERE pl_parent_id=? ORDER BY pl_place") ->execute(array($parent_id)) ->fetchAll(); } else { $rows= WT_DB::prepare( "SELECT DISTINCT pl_id, pl_place, pl_lati, pl_long, pl_zoom, pl_icon". " FROM `##placelocation`". " INNER JOIN `##places` ON `##placelocation`.pl_place=`##places`.p_place AND `##placelocation`.pl_level=`##places`.p_level". " WHERE pl_parent_id=? ORDER BY pl_place" ) ->execute(array($parent_id)) ->fetchAll(); } $placelist=array(); foreach ($rows as $row) { $placelist[]=array('place_id'=>$row->pl_id, 'place'=>$row->pl_place, 'lati'=>$row->pl_lati, 'long'=>$row->pl_long, 'zoom'=>$row->pl_zoom, 'icon'=>$row->pl_icon); } uasort($placelist, 'placesort'); return $placelist; } function outputLevel($parent_id) { $tmp = place_id_to_hierarchy($parent_id); $maxLevel = getHighestLevel(); if ($maxLevel>8) $maxLevel = 8; $prefix = implode(';', $tmp); if ($prefix!='') $prefix.=';'; $suffix=str_repeat(';', $maxLevel-count($tmp)); $level=count($tmp); $rows= WT_DB::prepare("SELECT pl_id, pl_place, pl_long, pl_lati, pl_zoom, pl_icon FROM `##placelocation` WHERE pl_parent_id=? ORDER BY pl_place") ->execute(array($parent_id)) ->fetchAll(); foreach ($rows as $row) { echo $level,';',$prefix,$row->pl_place,$suffix,';',$row->pl_long,';',$row->pl_lati,';',$row->pl_zoom,';',$row->pl_icon,"\r\n"; if ($level < $maxLevel) { outputLevel($row->pl_id); } } } /** * recursively find all of the csv files on the server * * @param string $path */ function findFiles($path) { global $placefiles; if (file_exists($path)) { $dir = dir($path); while (false !== ($entry = $dir->read())) { if ($entry!='.' && $entry!='..' && $entry!='.svn') { if (is_dir($path.'/'.$entry)) { findFiles($path.'/'.$entry); } elseif (strstr($entry, '.csv')!==false) { $placefiles[] = preg_replace('~'.WT_MODULES_DIR.'googlemap/extra~', '', $path).'/'.$entry; } } } $dir->close(); } } if (!WT_USER_IS_ADMIN) { header('Location: '.WT_SERVER_NAME.WT_SCRIPT_PATH.'admin.php'); exit; } global $GOOGLEMAP_MAX_ZOOM; if ($action=='ExportFile' && WT_USER_IS_ADMIN) { $tmp = place_id_to_hierarchy($parent); $maxLevel = getHighestLevel(); if ($maxLevel>8) $maxLevel=8; $tmp[0] = 'places'; $outputFileName=preg_replace('/[:;\/\\\(\)\{\}\[\] $]/', '_', implode('-', $tmp)).'.csv'; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$outputFileName.'"'); echo '"', WT_I18N::translate('Level'), '";"', WT_I18N::translate('Country'), '";'; if ($maxLevel>0) echo '"', WT_I18N::translate('State'), '";'; if ($maxLevel>1) echo '"', WT_I18N::translate('County'), '";'; if ($maxLevel>2) echo '"', WT_I18N::translate('City'), '";'; if ($maxLevel>3) echo '"', WT_I18N::translate('Place'), '";'; if ($maxLevel>4) echo '"', WT_I18N::translate('Place'), '";'; if ($maxLevel>5) echo '"', WT_I18N::translate('Place'), '";'; if ($maxLevel>6) echo '"', WT_I18N::translate('Place'), '";'; if ($maxLevel>7) echo '"', WT_I18N::translate('Place'), '";'; echo '"', WT_I18N::translate('Longitude'), '";"', WT_I18N::translate('Latitude'), '";'; echo '"', WT_I18N::translate('Zoom factor'), '";"', WT_I18N::translate('Icon'), '";', WT_EOL; outputLevel($parent); exit; } $controller=new WT_Controller_Base(); $controller->setPageTitle(WT_I18N::translate('Edit geographic place locations')); $controller->pageHeader(); echo '', '', '', '', '
', WT_I18N::translate('Google Maps configuration'), '', '', WT_I18N::translate('Edit geographic place locations'), '', '', WT_I18N::translate('Place Check'), '', help_link('GOOGLEMAP_PLACECHECK','googlemap'), '
'; if ($action=='ImportGedcom') { $placelist=array(); $j=0; if ($mode=='all') { $statement= WT_DB::prepare("SELECT i_gedcom FROM `##individuals` UNION ALL SELECT f_gedcom FROM `##families`") ->execute(); } else { $statement= WT_DB::prepare("SELECT i_gedcom FROM `##individuals` WHERE i_file=? UNION ALL SELECT f_gedcom FROM `##families` WHERE f_file=?") ->execute(array(WT_GED_ID, WT_GED_ID)); } while ($gedrec=$statement->fetchColumn()) { $i = 1; $placerec = get_sub_record(2, '2 PLAC', $gedrec, $i); while (!empty($placerec)) { if (preg_match("/2 PLAC (.+)/", $placerec, $match)) { $placelist[$j] = array(); $placelist[$j]['place'] = trim($match[1]); if (preg_match("/4 LATI (.*)/", $placerec, $match)) { $placelist[$j]['lati'] = trim($match[1]); if (($placelist[$j]['lati'][0] != 'N') && ($placelist[$j]['lati'][0] != 'S')) { if ($placelist[$j]['lati'] < 0) { $placelist[$j]['lati'][0] = 'S'; } else { $placelist[$j]['lati'] = 'N'.$placelist[$j]['lati']; } } } else $placelist[$j]['lati'] = NULL; if (preg_match("/4 LONG (.*)/", $placerec, $match)) { $placelist[$j]['long'] = trim($match[1]); if (($placelist[$j]['long'][0] != 'E') && ($placelist[$j]['long'][0] != 'W')) { if ($placelist[$j]['long'] < 0) { $placelist[$j]['long'][0] = 'W'; } else { $placelist[$j]['long'] = 'E'.$placelist[$j]['long']; } } } else $placelist[$j]['long'] = NULL; $j = $j + 1; } $i = $i + 1; $placerec = get_sub_record(2, '2 PLAC', $gedrec, $i); } } asort($placelist); $prevPlace = ''; $prevLati = ''; $prevLong = ''; $placelistUniq = array(); $j = 0; foreach ($placelist as $k=>$place) { if ($place['place'] != $prevPlace) { $placelistUniq[$j] = array(); $placelistUniq[$j]['place'] = $place['place']; $placelistUniq[$j]['lati'] = $place['lati']; $placelistUniq[$j]['long'] = $place['long']; $j = $j + 1; } else if (($place['place'] == $prevPlace) && (($place['lati'] != $prevLati) || ($place['long'] != $prevLong))) { if (($placelistUniq[$j-1]['lati'] == 0) || ($placelistUniq[$j-1]['long'] == 0)) { $placelistUniq[$j-1]['lati'] = $place['lati']; $placelistUniq[$j-1]['long'] = $place['long']; } else if (($place['lati'] != '0') || ($place['long'] != '0')) { echo 'Difference: previous value = ', $prevPlace, ', ', $prevLati, ', ', $prevLong, ' current = ', $place['place'], ', ', $place['lati'], ', ', $place['long'], '
'; } } $prevPlace = $place['place']; $prevLati = $place['lati']; $prevLong = $place['long']; } $highestIndex = getHighestIndex(); $default_zoom_level=array(4, 7, 10, 12); foreach ($placelistUniq as $k=>$place) { $parent=preg_split('/ *, */', $place['place']); $parent=array_reverse($parent); $parent_id=0; for ($i=0; $iexecute(array($i, $parent_id, $escparent)) ->fetchOneRow(); if ($i < count($parent)-1) { // Create higher-level places, if necessary if (empty($row)) { $highestIndex++; WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_zoom) VALUES (?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $default_zoom_level[$i])); echo htmlspecialchars($escparent), '
'; $parent_id=$highestIndex; } else { $parent_id=$row->pl_id; } } else { // Create lowest-level place, if necessary if (empty($row->pl_id)) { $highestIndex++; WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_long, pl_lati, pl_zoom) VALUES (?, ?, ?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $place['long'], $place['lati'], $default_zoom_level[$i])); echo htmlspecialchars($escparent), '
'; } else { if (empty($row->pl_long) && empty($row->pl_lati) && $place['lati']!='0' && $place['long']!='0') { WT_DB::prepare("UPDATE `##placelocation` SET pl_lati=?, pl_long=? WHERE pl_id=?") ->execute(array($place['lati'], $place['long'], $row->pl_id)); echo htmlspecialchars($escparent), '
'; } } } } } $parent=0; } if ($action=='ImportFile') { $placefiles = array(); findFiles(WT_MODULES_DIR.'googlemap/extra'); sort($placefiles); ?>
0) { ?>

$value) { $country_names[$key]=WT_I18N::translate($key); } if (isset($_POST['cleardatabase'])) { WT_DB::exec("DELETE FROM `##placelocation` WHERE 1=1"); } if (!empty($_FILES['placesfile']['tmp_name'])) { $lines = file($_FILES['placesfile']['tmp_name']); } elseif (!empty($_REQUEST['localfile'])) { $lines = file(WT_MODULES_DIR.'googlemap/extra'.$_REQUEST['localfile']); } // Strip BYTE-ORDER-MARK, if present if (!empty($lines[0]) && substr($lines[0], 0, 3)==WT_UTF8_BOM) $lines[0]=substr($lines[0], 3); asort($lines); $highestIndex = getHighestIndex(); $placelist = array(); $j = 0; $maxLevel = 0; foreach ($lines as $p => $placerec) { $fieldrec = explode(';', $placerec); if ($fieldrec[0] > $maxLevel) $maxLevel = $fieldrec[0]; } $fields = count($fieldrec); $set_icon = true; if (!is_dir(WT_MODULES_DIR.'googlemap/places/flags/')) { $set_icon = false; } foreach ($lines as $p => $placerec) { $fieldrec = explode(';', $placerec); if (is_numeric($fieldrec[0]) && $fieldrec[0]<=$maxLevel) { $placelist[$j] = array(); $placelist[$j]['place'] = ''; for ($ii=$fields-4; $ii>1; $ii--) { if ($fieldrec[0] > $ii-2) $placelist[$j]['place'] .= $fieldrec[$ii].','; } foreach ($country_names as $countrycode => $countryname) { if ($countrycode == strtoupper($fieldrec[1])) { $fieldrec[1] = $countryname; break; } } $placelist[$j]['place'] .= $fieldrec[1]; $placelist[$j]['long'] = $fieldrec[$fields-4]; $placelist[$j]['lati'] = $fieldrec[$fields-3]; $placelist[$j]['zoom'] = $fieldrec[$fields-2]; if($set_icon) { $placelist[$j]['icon'] = trim($fieldrec[$fields-1]); } else { $placelist[$j]['icon'] = ''; } $j = $j + 1; } } $prevPlace = ''; $prevLati = ''; $prevLong = ''; $placelistUniq = array(); $j = 0; foreach ($placelist as $k=>$place) { if ($place['place'] != $prevPlace) { $placelistUniq[$j] = array(); $placelistUniq[$j]['place'] = $place['place']; $placelistUniq[$j]['lati'] = $place['lati']; $placelistUniq[$j]['long'] = $place['long']; $placelistUniq[$j]['zoom'] = $place['zoom']; $placelistUniq[$j]['icon'] = $place['icon']; $j = $j + 1; } else if (($place['place'] == $prevPlace) && (($place['lati'] != $prevLati) || ($place['long'] != $prevLong))) { if (($placelistUniq[$j-1]['lati'] == 0) || ($placelistUniq[$j-1]['long'] == 0)) { $placelistUniq[$j-1]['lati'] = $place['lati']; $placelistUniq[$j-1]['long'] = $place['long']; $placelistUniq[$j-1]['zoom'] = $place['zoom']; $placelistUniq[$j-1]['icon'] = $place['icon']; } else if (($place['lati'] != '0') || ($place['long'] != '0')) { echo 'Difference: previous value = ', $prevPlace, ', ', $prevLati, ', ', $prevLong, ' current = ', $place['place'], ', ', $place['lati'], ', ', $place['long'], '
'; } } $prevPlace = $place['place']; $prevLati = $place['lati']; $prevLong = $place['long']; } $default_zoom_level = array(); $default_zoom_level[0] = 4; $default_zoom_level[1] = 7; $default_zoom_level[2] = 10; $default_zoom_level[3] = 12; foreach ($placelistUniq as $k=>$place) { $parent = explode(',', $place['place']); $parent = array_reverse($parent); $parent_id=0; for ($i=0; $iexecute(array($i, $parent_id, $escparent)) ->fetchOneRow(); if (empty($row)) { // this name does not yet exist: create entry if (!isset($_POST['updateonly'])) { $highestIndex = $highestIndex + 1; if (($i+1) == count($parent)) { $zoomlevel = $place['zoom']; } elseif (isset($default_zoom_level[$i])) { $zoomlevel = $default_zoom_level[$i]; } else { $zoomlevel = $GOOGLEMAP_MAX_ZOOM; } if (($place['lati'] == '0') || ($place['long'] == '0') || (($i+1) < count($parent))) { WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_zoom, pl_icon) VALUES (?, ?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $zoomlevel, $place['icon'])); } else { //delete leading zero $pl_lati = str_replace(array('N', 'S', ','), array('', '-', '.') , $place['lati']); $pl_long = str_replace(array('E', 'W', ','), array('', '-', '.') , $place['long']); if ($pl_lati >= 0) { $place['lati'] = 'N'.abs($pl_lati); } elseif ($pl_lati < 0) { $place['lati'] = 'S'.abs($pl_lati); } if ($pl_long >= 0) { $place['long'] = 'E'.abs($pl_long); } elseif ($pl_long < 0) { $place['long'] = 'W'.abs($pl_long); } WT_DB::prepare("INSERT INTO `##placelocation` (pl_id, pl_parent_id, pl_level, pl_place, pl_long, pl_lati, pl_zoom, pl_icon) VALUES (?, ?, ?, ?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $place['long'], $place['lati'], $zoomlevel, $place['icon'])); } $parent_id = $highestIndex; } } else { $parent_id = $row->pl_id; if ((isset($_POST['overwritedata'])) && ($i+1 == count($parent))) { WT_DB::prepare("UPDATE `##placelocation` SET pl_lati=?, pl_long=?, pl_zoom=?, pl_icon=? WHERE pl_id=?") ->execute(array($place['lati'], $place['long'], $place['zoom'], $place['icon'], $parent_id)); } else { if ((($row->pl_long == '0') || ($row->pl_long == null)) && (($row->pl_lati == '0') || ($row->pl_lati == null))) { WT_DB::prepare("UPDATE `##placelocation` SET pl_lati=?, pl_long=? WHERE pl_id=?") ->execute(array($place['lati'], $place['long'], $parent_id)); } if (empty($row->pl_icon) && !empty($place['icon'])) { WT_DB::prepare("UPDATE `##placelocation` SET pl_icon=? WHERE pl_id=?") ->execute(array($place['icon'], $parent_id)); } } } } } $parent=0; } if ($action=='DeleteRecord') { $exists= WT_DB::prepare("SELECT 1 FROM `##placelocation` WHERE pl_parent_id=?") ->execute(array($deleteRecord)) ->fetchOne(); if (!$exists) { WT_DB::prepare("DELETE FROM `##placelocation` WHERE pl_id=?") ->execute(array($deleteRecord)); } else { echo '
', WT_I18N::translate('Location not removed: this location contains sub-locations'), '
'; } } ?> '; $where_am_i=place_id_to_hierarchy($parent); foreach (array_reverse($where_am_i, true) as $id=>$place) { if ($id==$parent) { if ($place != 'Unknown') { echo PrintReady($place); } else { echo WT_I18N::translate('unknown'); } } else { echo ''; if ($place != 'Unknown') { echo PrintReady($place), ''; } else { echo WT_I18N::translate('unknown'), ''; } } echo ' - '; } echo '', WT_I18N::translate('Top Level'), ''; echo '
'; echo ''; echo help_link('PLE_ACTIVE','googlemap'); echo '
'; $placelist=get_place_list_loc($parent, $inactive); echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; if (count($placelist) == 0) echo ''; foreach ($placelist as $place) { echo ''; else echo WT_I18N::translate('unknown'), ''; echo ''; echo ''; echo ''; echo ''; echo ''; $noRows= WT_DB::prepare("SELECT COUNT(pl_id) FROM `##placelocation` WHERE pl_parent_id=?") ->execute(array($place['place_id'])) ->fetchOne(); if ($noRows==0) { ?>
', WT_Gedcom_Tag::getLabel('PLAC'), '', WT_Gedcom_Tag::getLabel('LATI'), '', WT_Gedcom_Tag::getLabel('LONG'), '', WT_I18N::translate('Zoom factor'), '', WT_I18N::translate('Icon'), ''; echo WT_I18N::translate('Edit geographic location'), help_link('PL_EDIT_LOCATION','googlemap'), '
', WT_I18N::translate('No places found'), '
'; if ($place['place'] != 'Unknown') echo PrintReady($place['place']), '', $place['lati'], '', $place['long'], '', $place['zoom'], ''; if (($place['icon'] == NULL) || ($place['icon'] == '')) { if (($place['lati'] == NULL) || ($place['long'] == NULL) || (($place['lati'] == '0') && ($place['long'] == '0'))) { echo ' '; echo ''; } else { echo ' '; echo ''; } } else { echo ''; } echo '', WT_I18N::translate('; ?><?php echo WT_I18N::translate('Remove'); ?>
'; echo WT_I18N::translate('Export current view to file'), ''; echo help_link('PL_EXPORT_FILE','googlemap'); } else { echo ' '; } echo ''; echo ''; echo WT_I18N::translate('Export all locations to file'), ''; echo help_link('PL_EXPORT_ALL_FILE','googlemap'); echo '
'; if (empty($SEARCH_SPIDER)) { } else { echo WT_I18N::translate('Search Engine Spider Detected'), ': ', $SEARCH_SPIDER; echo ''; }