* @link https://www.tassos.gr * @copyright Copyright © 2024 Tassos All Rights Reserved * @license GNU GPLv3 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(); } }