171 lines
4.1 KiB
PHP
171 lines
4.1 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @author Tassos Marinos <info@tassos.gr>
|
|
* @link https://www.tassos.gr
|
|
* @copyright Copyright © 2024 Tassos All Rights Reserved
|
|
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
|
|
*/
|
|
|
|
namespace NRFramework\Widgets;
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
class MapAddress extends Widget
|
|
{
|
|
/**
|
|
* Widget default options
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $widget_options = [
|
|
/**
|
|
* The map coordinates.
|
|
* Format: latitude,longitude
|
|
*
|
|
* i.e. 36.891319,27.283480
|
|
*/
|
|
'value' => '',
|
|
|
|
/**
|
|
* Set whether and where to show the map.
|
|
*
|
|
* Available values:
|
|
*
|
|
* false
|
|
* backend
|
|
* frontend
|
|
* both
|
|
*/
|
|
'show_map' => false,
|
|
|
|
// The map HTML (If can be rendered)
|
|
'map' => false,
|
|
|
|
// Set what information the user can see.
|
|
'showAddressDetails' => [
|
|
'address' => true,
|
|
'latitude' => false,
|
|
'longitude' => false,
|
|
'country' => true,
|
|
'country_code' => false,
|
|
'city' => false,
|
|
'postal_code' => true,
|
|
'county' => false,
|
|
'state' => false,
|
|
'municipality' => false,
|
|
'town' => false,
|
|
'road' => false,
|
|
],
|
|
|
|
/**
|
|
* The address details.
|
|
*
|
|
* Supported data:
|
|
*
|
|
* address
|
|
* latitude
|
|
* longitude
|
|
* country
|
|
* country_code
|
|
* city
|
|
* postal_code
|
|
* county
|
|
* state
|
|
* municipality
|
|
* town
|
|
* road
|
|
*/
|
|
'address' => [
|
|
'address' => '',
|
|
'latitude' => '',
|
|
'longitude' => '',
|
|
'country' => '',
|
|
'country_code' => '',
|
|
'city' => '',
|
|
'postal_code' => '',
|
|
'county' => '',
|
|
'state' => '',
|
|
'municipality' => '',
|
|
'town' => '',
|
|
'road' => '',
|
|
],
|
|
|
|
/**
|
|
* The layout type of the output.
|
|
*
|
|
* Available values:
|
|
*
|
|
* - default
|
|
* - custom
|
|
*/
|
|
'layout_type' => 'default',
|
|
|
|
/**
|
|
* The custom layout code (HTML + Smart Tags).
|
|
*
|
|
* Available Smart Tags:
|
|
*
|
|
* Allowed Smart Tags:
|
|
*
|
|
* {address.map}
|
|
* {address.address} - {address.address.label}
|
|
* {address.latitude} - {address.latitude.label}
|
|
* {address.longitude} - {address.longitude.label}
|
|
* {address.country} - {address.country.label}
|
|
* {address.country_code} - {address.country_code.label}
|
|
* {address.city} - {address.city.label}
|
|
* {address.county} - {address.county.label}
|
|
* {address.postal_code} - {address.postal_code.label}
|
|
* {address.state} - {address.state.label}
|
|
* {address.municipality} - {address.municipality.label}
|
|
* {address.town} - {address.town.label}
|
|
* {address.road} - {address.road.label}
|
|
*/
|
|
'custom_layout' => '{address.address.label}: {address.address}',
|
|
|
|
/**
|
|
* Map location in correlation with the address details.
|
|
*
|
|
* Note: This takes effect only if no custom layout is used.
|
|
*
|
|
* Available values:
|
|
*
|
|
* - above (Above the address details)
|
|
* - below (Below the address details)
|
|
*/
|
|
'map_location' => 'below',
|
|
|
|
// The map HTML which will return the map HTML only if a map is set and current layout is not custom
|
|
'map_html' => ''
|
|
];
|
|
|
|
/**
|
|
* Renders the widget
|
|
*
|
|
* @return string
|
|
*/
|
|
public function render()
|
|
{
|
|
$this->options['enable_info_window'] = false;
|
|
|
|
if (in_array($this->options['show_map'], ['frontend', 'both']) || (in_array($this->options['show_map'], ['frontend', 'both']) && $this->options['layout_type'] === 'custom' && !empty($this->options['custom_layout']) && strpos($this->options['custom_layout'], '{address.map}') !== false))
|
|
{
|
|
$this->options['markerImage'] = $this->options['marker_image'];
|
|
// Get the map
|
|
$map_options = $this->options;
|
|
// Remove unneeded props.
|
|
// The custom layout can include Smart Tags and this breaks the Smart Tags replace method as it tries to replace inner Smart Tags too
|
|
unset($map_options['custom_layout']);
|
|
unset($map_options['showAddressDetails']);
|
|
unset($map_options['address']);
|
|
$map = new OpenStreetMap($map_options);
|
|
$map->loadMedia();
|
|
$this->options['map'] = $map->render();
|
|
}
|
|
|
|
$this->options['map_html'] = in_array($this->options['show_map'], ['frontend', 'both']) && $this->options['layout_type'] !== 'custom' ? $this->options['map'] : '';
|
|
|
|
return parent::render();
|
|
}
|
|
} |