diff --git a/code/Module.class.php b/code/Module.class.php index 5b50557..775416b 100644 --- a/code/Module.class.php +++ b/code/Module.class.php @@ -18,10 +18,11 @@ class Module extends FormToolsModule protected $author = "Ben Keen"; protected $authorEmail = "ben.keen@gmail.com"; protected $authorLink = "http://formtools.org"; - protected $version = "2.1.0"; - protected $date = "2019-10-16"; + protected $version = "2.1.1"; + protected $date = "2019-10-19"; protected $originLanguage = "en_us"; + protected $nav = array( "module_name" => array("index.php", false) ); @@ -30,7 +31,6 @@ public function install($module_id) { $db = Core::$db; $LANG = Core::$L; - $root_url = Core::getRootUrl(); // check it's not already installed (i.e. check for the unique field type identifier) $field_type_info = FieldTypes::getFieldTypeByIdentifier("google_maps_field"); @@ -60,169 +60,6 @@ public function install($module_id) $count = $db->fetch(PDO::FETCH_COLUMN); $next_list_order = $count + 1; - $resources_js =<<< END -window.googleMapsInit = function () { - var maps = {}; - var defaultMapSettings = { - zoom: 3, - center: new google.maps.LatLng(42.258881, -100.195313), - mapTypeId: google.maps.MapTypeId.ROADMAP, - streetViewControl: false, - mapTypeControl: false - }; - - function addYourLocationButton(map) { - var controlDiv = document.createElement('div'); - - var defaultIconOpacity = 0.6; - - var bg = document.createElement('button'); - bg.style.backgroundColor = '#fff'; - bg.style.border = 'none'; - bg.style.outline = 'none'; - bg.style.width = '40px'; - bg.style.height = '40px'; - bg.style.borderRadius = '2px'; - bg.style.boxShadow = '0 1px 4px rgba(0,0,0,0.3)'; - bg.style.cursor = 'pointer'; - bg.style.marginRight = '10px'; - bg.style.padding = '0'; - bg.title = 'Your Location'; - controlDiv.appendChild(bg); - - var icon = document.createElement('div'); - icon.style.margin = '7px'; - icon.style.width = '26px'; - icon.style.height = '26px'; - icon.style.backgroundImage = 'url($root_url/modules/field_type_google_maps/images/location.png)'; - icon.style.backgroundSize = '26px 26px'; - icon.style.backgroundPosition = '0 0'; - icon.style.backgroundRepeat = 'no-repeat'; - icon.style.opacity = defaultIconOpacity; - bg.appendChild(icon); - - google.maps.event.addListener(map, 'center_changed', function () { - icon.style.opacity = defaultIconOpacity; - }); - - bg.addEventListener('click', function (e) { - e.preventDefault(); - var currOpacity = 0, - animationInterval = setInterval(function () { - currOpacity = currOpacity === defaultIconOpacity ? 0.3 : defaultIconOpacity; - icon.style.opacity = currOpacity; - }, 500); - - if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(function(position) { - var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); - map.setCenter(latlng); - map.setZoom(8); - clearInterval(animationInterval); - icon.style.opacity = defaultIconOpacity; - }, function () { - clearInterval(animationInterval); - icon.style.opacity = defaultIconOpacity; - }, { timeout: 60000 }); - } else { - clearInterval(animationInterval); - icon.style.opacity = defaultIconOpacity; - } - }); - - controlDiv.index = 1; - map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(controlDiv); - } - - var initMap = function () { - var gmf_id = $(this).attr("id"); - var address_field = $(this).find(".cf_gmf_address"); - var field_name = address_field.attr("name"); - var data = $(this).find(".cf_gmf_data").val(); - var opts = $.extend(true, {}, defaultMapSettings); - - if (data) { - var parts = data.split("|"); - if (parts.length == 3 && parts[1].length != 0) { - var lat_lng = parts[1].split(", "); - opts.zoom = parseInt(parts[2], 10); - opts.center = new google.maps.LatLng(parseFloat(lat_lng[0]), parseFloat(lat_lng[1])); - } - } - - maps[gmf_id] = { - map: new google.maps.Map($(this).find(".cf_gmf")[0], opts) - }; - - if (address_field.val() != "") { - maps[gmf_id].marker = new google.maps.Marker({ position: opts.center, map: maps[gmf_id].map }); - } else { - maps[gmf_id].marker = new google.maps.Marker(); - } - - google.maps.event.addListener(maps[gmf_id].map, 'zoom_changed', function (e) { - $("#" + gmf_id).find("[name=" + field_name + "_zoom]").val(maps[gmf_id].map.getZoom()); - }); - - if (location.protocol === 'https:') { - addYourLocationButton(maps[gmf_id].map); - } - }; - - // googleMapsInit may fire before or after DOM ready - $(function () { - $(".cf_gmf_section").each(initMap); - - $(".cf_gmf_address").bind("keydown", function (e) { - if (e.keyCode === 13) { - $(e.target).closest(".cf_gmf_section").find(".cf_gmf_update").trigger("click"); - return false; - } - }); - - $(".cf_gmf_update").bind("click", update_map); - - function update_map (e) { - var gmf_div = $(e.target).closest(".cf_gmf_section"); - var field_name = gmf_div.find(".cf_gmf_address").attr("name"); - var map_info = maps[gmf_div.attr("id")]; - var map = map_info.map; - var address = gmf_div.find(".cf_gmf_address").val(); - var geocoder = new google.maps.Geocoder(); - - geocoder.geocode({'address': address}, function (results, status) { - if (status == google.maps.GeocoderStatus.OK) { - var loc = results[0].geometry.location; - map.setCenter(loc); - var coords = loc.lat() + ", " + loc.lng(); - $(gmf_div).find("[name=" + field_name + "_coords]").val(coords); - $(gmf_div).find("[name=" + field_name + "_zoom]").val(map.getZoom()); - $(".cf_gmf_coords_str").html(coords); - map_info.marker.setPosition(loc); - map_info.marker.setMap(map); - } - }); - } - }); -}; - - -$(function () { - // if google maps isn't included (found by an ID on the script tag), - if ($("#google-maps-field-lib").length) { - return; - } - - $(".cf_gmf_section").each(function () { - var address_field = $(this).find(".cf_gmf_address"); - var field_name = address_field.attr("name"); - $("#cf_gmf_" + field_name + "_map").after("
Please set your Google Maps API key in the Google Maps Field module settings.
"); - $("#cf_gmf_" + field_name + "_map").remove(); - $(this).find(".cf_gmf_update").hide(); - }); -}); -END; - $db->query(" INSERT INTO {PREFIX}field_types (is_editable, non_editable_info, managed_by_module_id, field_type_name, field_type_identifier, group_id, is_file_field, is_date_field, raw_field_type_map, @@ -251,7 +88,7 @@ function update_map (e) { "edit_field_smarty_markup" => "{assign var=address value=\"\"}\r\n{assign var=coordinates value=\"\"}\r\n{assign var=zoom_level value=\"\"}\r\n{if \$VALUE}\r\n {assign var=parts value=\"|\"|explode:\$VALUE}\r\n {assign var=address value=\$parts[0]}\r\n {assign var=coords value=\$parts[1]}\r\n {assign var=zoom_level value=\$parts[2]}\r\n{/if}\r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n \r\n {if \$show_coordinates == \"yes\"}\r\n
{\$coords|default:\"—\"}
\r\n {/if}\r\n {if \$comments}\r\n
{\$comments}
\r\n {/if}\r\n
\r\n\r\n", "php_processing" => "\$field_name = \$vars[\"field_info\"][\"field_name\"];\r\n\r\n\$value = \"\";\r\nif (!empty(\$vars[\"data\"][\$field_name])) {\r\n \$address = \$vars[\"data\"][\$field_name];\r\n \$coords = \$vars[\"data\"][\"{\$field_name}_coords\"];\r\n \$zoom = \$vars[\"data\"][\"{\$field_name}_zoom\"];\r\n \$value = \"\$address|\$coords|\$zoom\";\r\n}\r\n", "resources_css" => ".cf_gmf_address {\r\n width: 98%;\r\n}\r\n.cf_gmf_tiny {\r\n height: 160px; \r\n}\r\n.cf_gmf_small {\r\n height: 250px; \r\n}\r\n.cf_gmf_medium {\r\n height: 350px; \r\n}\r\n.cf_gmf_large {\r\n height: 590px; \r\n}\r\n", - "resources_js" => $resources_js + "resources_js" => self::getResourcesJs() )); $db->execute(); $field_type_id = $db->getInsertId(); @@ -361,8 +198,22 @@ public function uninstall($module_id) return array(true, ""); } + public function upgrade($module_id, $old_module_version) + { + $db = Core::$db; + + $db->query(" + UPDATE {PREFIX}field_types + SET resources_js = :resources_js + WHERE field_type_identifier = 'google_maps_field' + "); + $db->bind("resources_js", self::getResourcesJs()); + $db->execute(); + + $this->resetHooks(); + } - public function includeGoogleMaps($template, $page_data) + public function includeGoogleMaps($template, $page_data) { // we only need this field on the edit pages $curr_page = $page_data["page"]; @@ -433,4 +284,174 @@ public function updateSettings($google_maps_key) { )); return array(true, $this->L["notify_settings_updated"]); } + + + private static function getResourcesJs() + { + $root_url = Core::getRootUrl(); + + $resources_js =<<< END +window.googleMapsInit = function () { + var maps = {}; + var defaultMapSettings = { + zoom: 3, + center: new google.maps.LatLng(42.258881, -100.195313), + mapTypeId: google.maps.MapTypeId.ROADMAP, + streetViewControl: false, + mapTypeControl: false + }; + + function addYourLocationButton(map) { + var controlDiv = document.createElement('div'); + + var defaultIconOpacity = 0.6; + + var bg = document.createElement('button'); + bg.style.backgroundColor = '#fff'; + bg.style.border = 'none'; + bg.style.outline = 'none'; + bg.style.width = '40px'; + bg.style.height = '40px'; + bg.style.borderRadius = '2px'; + bg.style.boxShadow = '0 1px 4px rgba(0,0,0,0.3)'; + bg.style.cursor = 'pointer'; + bg.style.marginRight = '10px'; + bg.style.padding = '0'; + bg.title = 'Your Location'; + controlDiv.appendChild(bg); + + var icon = document.createElement('div'); + icon.style.margin = '7px'; + icon.style.width = '26px'; + icon.style.height = '26px'; + icon.style.backgroundImage = 'url($root_url/modules/field_type_google_maps/images/location.png)'; + icon.style.backgroundSize = '26px 26px'; + icon.style.backgroundPosition = '0 0'; + icon.style.backgroundRepeat = 'no-repeat'; + icon.style.opacity = defaultIconOpacity; + bg.appendChild(icon); + + google.maps.event.addListener(map, 'center_changed', function () { + icon.style.opacity = defaultIconOpacity; + }); + + bg.addEventListener('click', function (e) { + e.preventDefault(); + var currOpacity = 0, + animationInterval = setInterval(function () { + currOpacity = currOpacity === defaultIconOpacity ? 0.3 : defaultIconOpacity; + icon.style.opacity = currOpacity; + }, 500); + + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(function(position) { + var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); + map.setCenter(latlng); + map.setZoom(8); + clearInterval(animationInterval); + icon.style.opacity = defaultIconOpacity; + }, function () { + clearInterval(animationInterval); + icon.style.opacity = defaultIconOpacity; + }, { timeout: 60000 }); + } else { + clearInterval(animationInterval); + icon.style.opacity = defaultIconOpacity; + } + }); + + controlDiv.index = 1; + map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(controlDiv); + } + + var initMap = function () { + var gmf_id = $(this).attr("id"); + var address_field = $(this).find(".cf_gmf_address"); + var field_name = address_field.attr("name"); + var data = $(this).find(".cf_gmf_data").val(); + var opts = $.extend(true, {}, defaultMapSettings); + + if (data) { + var parts = data.split("|"); + if (parts.length == 3 && parts[1].length != 0) { + var lat_lng = parts[1].split(", "); + opts.zoom = parseInt(parts[2], 10); + opts.center = new google.maps.LatLng(parseFloat(lat_lng[0]), parseFloat(lat_lng[1])); + } + } + + maps[gmf_id] = { + map: new google.maps.Map($(this).find(".cf_gmf")[0], opts) + }; + + if (address_field.val() != "") { + maps[gmf_id].marker = new google.maps.Marker({ position: opts.center, map: maps[gmf_id].map }); + } else { + maps[gmf_id].marker = new google.maps.Marker(); + } + + google.maps.event.addListener(maps[gmf_id].map, 'zoom_changed', function (e) { + $("#" + gmf_id).find("[name=" + field_name + "_zoom]").val(maps[gmf_id].map.getZoom()); + }); + + if (location.protocol === 'https:') { + addYourLocationButton(maps[gmf_id].map); + } + }; + + // googleMapsInit may fire before or after DOM ready + $(function () { + $(".cf_gmf_section").each(initMap); + + $(".cf_gmf_address").bind("keydown", function (e) { + if (e.keyCode === 13) { + $(e.target).closest(".cf_gmf_section").find(".cf_gmf_update").trigger("click"); + return false; + } + }); + + $(".cf_gmf_update").bind("click", update_map); + + function update_map (e) { + var gmf_div = $(e.target).closest(".cf_gmf_section"); + var field_name = gmf_div.find(".cf_gmf_address").attr("name"); + var map_info = maps[gmf_div.attr("id")]; + var map = map_info.map; + var address = gmf_div.find(".cf_gmf_address").val(); + var geocoder = new google.maps.Geocoder(); + + geocoder.geocode({'address': address}, function (results, status) { + if (status == google.maps.GeocoderStatus.OK) { + var loc = results[0].geometry.location; + map.setCenter(loc); + var coords = loc.lat() + ", " + loc.lng(); + $(gmf_div).find("[name=" + field_name + "_coords]").val(coords); + $(gmf_div).find("[name=" + field_name + "_zoom]").val(map.getZoom()); + $(".cf_gmf_coords_str").html(coords); + map_info.marker.setPosition(loc); + map_info.marker.setMap(map); + } + }); + } + }); +}; + + +$(function () { + // if google maps isn't included (found by an ID on the script tag), + if ($("#google-maps-field-lib").length) { + return; + } + + $(".cf_gmf_section").each(function () { + var address_field = $(this).find(".cf_gmf_address"); + var field_name = address_field.attr("name"); + $("#cf_gmf_" + field_name + "_map").after("
Please set your Google Maps API key in the Google Maps Field module settings.
"); + $("#cf_gmf_" + field_name + "_map").remove(); + $(this).find(".cf_gmf_update").hide(); + }); +}); +END; + return $resources_js; + } }