Current File : /home/pacjaorg/www/km/plugins/djclassifieds/leaflet/leaflet.php |
<?php
/**
* @package DJ-Classifieds
* @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
* @license http://www.gnu.org/licenses GNU/GPL
* @author url: http://dj-extensions.com
* @author email contact@dj-extensions.com
*
*/
defined ( '_JEXEC' ) or die ( 'Restricted access' );
class plgDJClassifiedsLeaflet extends JPlugin {
public function __construct(&$subject, $config) {
parent::__construct ( $subject, $config );
$this->loadLanguage ();
}
public function onIncludeMapsScripts(&$load_gm_script){
$document = JFactory::getDocument();
$ver = $this->params->get('ver','1.3.4');
$document->addStyleSheet('https://unpkg.com/leaflet@'.$ver.'/dist/leaflet.css');
$document->addScript('https://unpkg.com/leaflet@'.$ver.'/dist/leaflet.js');
$load_gm_script = 0;
return true;
}
function onGeocoderGetLocation(&$use_gm, $address) {
$use_gm = 0;
return $this->leafletGetLocation($address);
}
function onGeocoderGetLocationPostCode(&$use_gm, $post_code, $address) {
$use_gm = 0;
return $this->leafletGetLocation($address, $post_code);
}
public function onItemEditForm($item, $par ,$subscr_id, $promotions, $categories, $types) {
$par->set('allow_user_lat_lng','0');
return null;
}
public function onProfileEditFormSections($user, $custom_fields, $custom_values_c, $profile_image, $par){
$par->set('allow_user_lat_lng','0');
return null;
}
public function onBeforeDJClassifiedsDisplayAdvertMap($item, $par, $view_type){
$par->set('show_googlemap',0);
if($item->latitude=='0.000000000000000' && $item->longitude=='0.000000000000000'){
return null;
}
$tile_data = $this->getLeafletTileProvider(); //$dispatcher->trigger('getLeafletTileProvider', array());
$tile_data = isset($tile_data[0]) && is_array($tile_data[0]) ? $tile_data[0] : $tile_data;
if(empty($tile_data)){
die('no Leaflet tile data found');
}
$use_gm = 0;
$this->onIncludeMapsScripts($use_gm);
$icon_img = '';
$icon_size = ['',''];
if($par->get('gm_icon',1)==1 && file_exists(JPATH_ROOT.'/images/djcf_gmicon_'.$item->cat_id.'.png')){
$icon_size = getimagesize(JPATH_ROOT.'/images/djcf_gmicon_'.$item->cat_id.'.png');
$icon_img = JURI::base().'images/djcf_gmicon_'.$item->cat_id.'.png';
}else if($par->get('gm_icon',1)==1 && file_exists(JPATH_ROOT.'/images/djcf_gmicon.png')){
$icon_size = getimagesize(JPATH_ROOT.'/images/djcf_gmicon.png');
$icon_img = JURI::base()."images/djcf_gmicon.png";
}elseif($par->get('gm_icon',1)==1){
$icon_size = getimagesize(JPATH_ROOT.'/components/com_djclassifieds/assets/images/djcf_gmicon.png');
$icon_img = JURI::base()."components/com_djclassifieds/assets/images/djcf_gmicon.png";
}
$content = '<div id="map" style="width: 320px; height: 210px;"></div>
<script>
jQuery(document).ready(function(){
var lat = "'.$item->latitude.'";
var lng = "'.$item->longitude.'";
var zoom = "'.$par->get('gm_zoom','10').'";
var scrollWheelZoom = "'.($par->get('gm_scrollwheel','1') ? true : false).'";
var myIcon = L.icon({
iconUrl: "'.$icon_img.'",
iconSize: ['.$icon_size[0].', '.$icon_size[1].']
//iconAnchor: [22, 94]
});
var mapOptions = {
center: new L.LatLng(lat, lng),
scrollWheelZoom: scrollWheelZoom,
//zoom: zoom,
//layers: new L.TileLayer("https://a.tiles.mapbox.com/v3/mapbox.world-bright/{z}/{x}/{y}.png"),
zoom: zoom
};
var map = new L.Map("map", mapOptions);
L.tileLayer("'.$tile_data[0].'", '.json_encode($tile_data[1]).').addTo(map);
//var marker = L.marker([lat, lng]).addTo(map);
var marker = new L.Marker([lat, lng]'.($icon_img ? ', {icon: myIcon}' : '').');
marker.bindPopup("<div style=\"width:200px\"><b>'.addslashes($item->name).'</b><br>'.addslashes(str_replace(array("\n","\r","\r\n"), '',$item->intro_desc)).'</div>");
map.addLayer(marker);
});
</script>';
//$par->set('show_googlemap',0);
return $content;
}
public function onBeforeDJClassifiedsDisplayProfileMap($profile, $par, $view_type){
$item = new stdClass();
if(is_array($profile)){ // front
if(!empty($profile['details']->latitude) && !empty($profile['details']->longitude)){
$item->latitude = $profile['details']->latitude;
$item->longitude = $profile['details']->longitude;
$item->name = $profile['name'];
$item->intro_desc = !empty($profile['details']->address) ? $profile['details']->address : '';
}
}else{ // back-end
$item->latitude = $profile->latitude;
$item->longitude = $profile->longitude;
$item->name = $profile->user_id;
$item->intro_desc = $profile->address;
}
return $this->onBeforeDJClassifiedsDisplayAdvertMap($item, $par, $view_type);
}
public function getLeafletTileProvider(){
$default_tile_provider = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
$tile_provider = $this->params->get('tile_provider', $default_tile_provider);
$access_token = $this->params->get('access_token', '');
$tile_options = [];
if($tile_provider == $default_tile_provider){
$tile_options['attribution'] = '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a>';
}
if($access_token){
$tile_options['accessToken'] = $access_token;
}
return [$tile_provider, $tile_options];
}
private function leafletGetLocation($address, $post_code = ''){
$url = "https://nominatim.openstreetmap.org/search?format=json&q=".urlencode($address);
if($post_code){
$url .= "&postalcode=".urlencode($post_code);
}
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($c, CURLOPT_REFERER, JURI::root()); // nominatim requires providing HTTP REFERER
$resp_json = curl_exec($c);
curl_close($c);
$resp = json_decode($resp_json, true);
if(isset($resp[0])){
return array('lat' => $resp[0]['lat'], 'lng' => $resp[0]['lon']);
}else{
return null;
}
}
}