Files
conservatorio-tomadini/plugins/system/nrframework/NRFramework/Widgets/Map.php
2024-12-31 11:07:09 +01:00

278 lines
6.7 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;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Router\Route;
abstract class Map extends Widget
{
/**
* Widget default options
*
* @var array
*/
protected $widget_options = [
/**
* The value of the widget.
* Format: latitude,longitude
*
* i.e. 36.891319,27.283480
*
* Otherwise, set the markers property
*/
'value' => '',
// Map tile provider key (if needed) to use the provider tiles
'provider_key' => null,
// Default map width
'width' => 500,
// Default map height
'height' => 400,
/**
* The Zoom Level.
*
* - preset: Set a fixed zoom.
* - fitbounds: Allow the map provider to auto-zoom and center the map around the markers.
*/
'zoom_level' => 'preset',
// Default map zoon
'zoom' => 4,
// Define lat,long format which will be used to center the map when zoom_level=preset is used.
'map_center' => null,
// Map scale. Values: metric, imperial, false
'scale' => false,
// View mode of the map.
'view' => '',
/**
* Set whether to show or not the map marker info window.
*
* Defaults to the map marker address (if not empty).
* If a map makrer label and/or description is set, these will be used.
*/
'enable_info_window' => true,
/**
* Map Marker
*/
/**
* The markers.
*
* An array of markers.
*
* [
* [
* latitude: 36.891319,
* longitude: 27.283480,
* label: 'Marker label',
* description: 'Marker description'
* ]
* ]
*/
'markers' => [],
// Marker image relative to Joomla installation
'markerImage' => '',
// Set whether to replace marker label/description smart tags
'replaceSmartTags' => false
];
public function __construct($options = [])
{
parent::__construct($options);
$this->prepare();
}
private function prepare()
{
$this->options['markerImage'] = $this->options['markerImage'] ? Uri::root() . ltrim($this->options['markerImage'], DIRECTORY_SEPARATOR) : '';
// Set the marker if a single value was given
if ($this->options['value'] && empty($this->options['markers']))
{
$coords = array_filter(array_map('trim', explode(',', $this->options['value'])));
if (count($coords) === 2)
{
$this->options['markers'] = [
[
'id' => 1,
'latitude' => $coords[0],
'longitude' => $coords[1]
]
];
}
}
// Make markers an array if a JSON string was given
if (is_string($this->options['markers']))
{
$this->options['markers'] = json_decode($this->options['markers'], true);
}
// Set as value the first marker so the JS library can have an initial center of the map
if (is_array($this->options['markers']))
{
$latitude = isset($this->options['markers'][0]['latitude']) ? $this->options['markers'][0]['latitude'] : false;
$longitude = isset($this->options['markers'][0]['longitude']) ? $this->options['markers'][0]['longitude'] : false;
if ($latitude && $longitude)
{
$this->options['value'] = implode(',', [$latitude, $longitude]);
}
}
if ($this->options['load_css_vars'])
{
$this->options['custom_css'] = $this->getWidgetCSS();
}
// Transform title/description translation strings
$this->prepareMarkerText();
}
private function prepareMarkerText()
{
if (!is_array($this->options['markers']) || !count($this->options['markers']))
{
return;
}
$st = new \NRFramework\SmartTags();
foreach ($this->options['markers'] as &$marker)
{
if (isset($marker['label']) && $marker['label'])
{
$marker['label'] = Text::_($marker['label']);
// Replace Smart tags
if ($this->options['replaceSmartTags'])
{
$marker['label'] = $st->replace($marker['label']);
}
}
if (isset($marker['description']) && $marker['description'])
{
$marker['description'] = Text::_($marker['description']);
$marker['description'] = \Joomla\CMS\HTML\HTMLHelper::_('content.prepare', $marker['description'], null, 'tassos.widget.map');
// Replace Smart tags
if ($this->options['replaceSmartTags'])
{
$marker['description'] = $st->replace($marker['description']);
}
}
if (empty($marker['label']) && isset($marker['address']))
{
$marker['label'] = $marker['address'];
}
// Link to the item
if (!empty($marker['label']) && isset($marker['item_id']) && $marker['item_id'] && isset($marker['context']) && $marker['context'] && $marker['context'] !== 'com_users.user')
{
$context = explode('.', $marker['context']);
$routerHelper = $routerMethod = null;
// Content
if ($marker['context'] === 'com_content.article')
{
$routerHelper = defined('nrJ4') ? 'Joomla\Component\Content\Site\Helper\RouteHelper' : 'ContentHelperRoute';
$routerMethod = 'getArticleRoute';
}
// Contact
else
{
if (!defined('nrJ4'))
{
\JLoader::register('ContactHelperRoute', JPATH_SITE . '/components/com_contact/helpers/route.php');
}
$routerHelper = defined('nrJ4') ? 'Joomla\Component\Contact\Site\Helper\RouteHelper' : 'ContactHelperRoute';
$routerMethod = 'getContactRoute';
}
$url = Route::_($routerHelper::$routerMethod($marker['item_id'], $marker['cat_id'], $marker['language']));
$marker['label'] = '<a href="' . $url . '">' . $marker['label'] . '</a>';
}
}
}
/**
* Returns the CSS for the widget.
*
* @param array $exclude_breakpoints Define breakpoints to exclude their CSS
*
* @return string
*/
public function getWidgetCSS($exclude_breakpoints = [])
{
$controls = [
// CSS Variables
[
'property' => '--width',
'value' => $this->options['width'],
'unit' => 'px'
],
[
'property' => '--height',
'value' => $this->options['height'],
'unit' => 'px'
],
];
$selector = '.nrf-widget.map-widget.' . $this->options['id'];
$controlsInstance = new \NRFramework\Controls\Controls(null, $selector, $exclude_breakpoints);
if (!$controlsCSS = $controlsInstance->generateCSS($controls))
{
return;
}
return $controlsCSS;
}
public function render()
{
$this->loadMedia();
return parent::render();
}
/**
* Loads media files
*
* @return void
*/
public function loadMedia()
{
if ($this->options['load_stylesheet'])
{
HTMLHelper::stylesheet('plg_system_nrframework/widgets/map.css', ['relative' => true, 'version' => 'auto']);
}
}
}