1bd120a73SMark C. Prins<?php 29fe665eaSgithub-actions[bot] 3bd120a73SMark C. Prins/* 494fb91ccSMark Prins * Copyright (c) 2011-2026 Mark C. Prins <mprins@users.sf.net> 5bd120a73SMark C. Prins * 6bd120a73SMark C. Prins * Permission to use, copy, modify, and distribute this software for any 7bd120a73SMark C. Prins * purpose with or without fee is hereby granted, provided that the above 8bd120a73SMark C. Prins * copyright notice and this permission notice appear in all copies. 9bd120a73SMark C. Prins * 10bd120a73SMark C. Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11bd120a73SMark C. Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12bd120a73SMark C. Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13bd120a73SMark C. Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14bd120a73SMark C. Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15bd120a73SMark C. Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16bd120a73SMark C. Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17bd120a73SMark C. Prins */ 1878ebf9c0SMark Prins 199fe665eaSgithub-actions[bot]use dokuwiki\Extension\ActionPlugin; 209fe665eaSgithub-actions[bot]use dokuwiki\Extension\Event; 2178ebf9c0SMark Prinsuse dokuwiki\Extension\EventHandler; 2278ebf9c0SMark Prinsuse dokuwiki\Logger; 23e48b49c1SMark Prinsuse dokuwiki\Sitemap\Item; 24bd120a73SMark C. Prins 25a9441f7dSMark C. Prins/** 26a9441f7dSMark C. Prins * DokuWiki Plugin dokuwikispatial (Action Component). 27a9441f7dSMark C. Prins * 28a9441f7dSMark C. Prins * @license BSD license 29a9441f7dSMark C. Prins * @author Mark C. Prins <mprins@users.sf.net> 3094fb91ccSMark Prins * 3194fb91ccSMark Prins * @phpcs:disable Squiz.Classes.ValidClassName.NotPascalCase 32a9441f7dSMark C. Prins */ 339fe665eaSgithub-actions[bot]class action_plugin_spatialhelper extends ActionPlugin 34bdfa1066SMark Prins{ 35bd120a73SMark C. Prins /** 36bd120a73SMark C. Prins * Register for events. 37bd120a73SMark C. Prins * 38157ba6c0Sgithub-actions[bot] * @param EventHandler $controller 3978ebf9c0SMark Prins * DokuWiki's event controller object. 40bd120a73SMark C. Prins */ 4178ebf9c0SMark Prins final public function register(EventHandler $controller): void 42bdfa1066SMark Prins { 437c452997SMark C. Prins // listen for page add / delete events 44bd120a73SMark C. Prins // http://www.dokuwiki.org/devel:event:indexer_page_add 45817f8be5SMark Prins $controller->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, 'handleIndexerPageAdd'); 46817f8be5SMark Prins $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'removeFromIndex'); 47a9441f7dSMark C. Prins 48bd120a73SMark C. Prins // http://www.dokuwiki.org/devel:event:sitemap_generate 49817f8be5SMark Prins $controller->register_hook('SITEMAP_GENERATE', 'BEFORE', $this, 'handleSitemapGenerateBefore'); 507c452997SMark C. Prins // using after will only trigger us if a sitemap was actually created 51817f8be5SMark Prins $controller->register_hook('SITEMAP_GENERATE', 'AFTER', $this, 'handleSitemapGenerateAfter'); 527c452997SMark C. Prins 53a9441f7dSMark C. Prins // handle actions we know of 549fe665eaSgithub-actions[bot] $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleActionActPreprocess', []); 55f8fde0daSMark C. Prins // handle HTML eg. /dokuwiki/doku.php?id=start&do=findnearby&geohash=u15vk4 5637f78197SMark Prins $controller->register_hook( 579fe665eaSgithub-actions[bot] 'TPL_ACT_UNKNOWN', 589fe665eaSgithub-actions[bot] 'BEFORE', 599fe665eaSgithub-actions[bot] $this, 609fe665eaSgithub-actions[bot] 'findnearby', 619fe665eaSgithub-actions[bot] ['format' => 'HTML'] 6237f78197SMark Prins ); 63f8fde0daSMark C. Prins // handles AJAX/json eg: jQuery.post("/dokuwiki/lib/exe/ajax.php?id=start&call=findnearby&geohash=u15vk4"); 6437f78197SMark Prins $controller->register_hook( 659fe665eaSgithub-actions[bot] 'AJAX_CALL_UNKNOWN', 669fe665eaSgithub-actions[bot] 'BEFORE', 679fe665eaSgithub-actions[bot] $this, 689fe665eaSgithub-actions[bot] 'findnearby', 699fe665eaSgithub-actions[bot] ['format' => 'JSON'] 7037f78197SMark Prins ); 717c452997SMark C. Prins 72a9441f7dSMark C. Prins // listen for media uploads and deletes 739fe665eaSgithub-actions[bot] $controller->register_hook('MEDIA_UPLOAD_FINISH', 'BEFORE', $this, 'handleMediaUploaded', []); 749fe665eaSgithub-actions[bot] $controller->register_hook('MEDIA_DELETE_FILE', 'BEFORE', $this, 'handleMediaDeleted', []); 7502c45c98SMark C. Prins 76817f8be5SMark Prins $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handleMetaheaderOutput'); 774c9ad1fbSMark Prins $controller->register_hook('PLUGIN_POPULARITY_DATA_SETUP', 'AFTER', $this, 'popularity'); 78bd120a73SMark C. Prins } 79bd120a73SMark C. Prins 80bd120a73SMark C. Prins /** 81bd120a73SMark C. Prins * Update the spatial index for the page. 82a9441f7dSMark C. Prins * 83157ba6c0Sgithub-actions[bot] * @param Event $event 844ad8b75bSMark Prins * event object 85bd120a73SMark C. Prins */ 8678ebf9c0SMark Prins final public function handleIndexerPageAdd(Event $event): void 87bdfa1066SMark Prins { 887c452997SMark C. Prins // $event→data['page'] – the page id 897c452997SMark C. Prins // $event→data['body'] – empty, can be filled by additional content to index by your plugin 90817f8be5SMark Prins // $event→data['metadata'] – the metadata that shall be indexed. This is an array where the keys are the 91817f8be5SMark Prins // metadata indexes and the value a string or an array of strings with the values. 92817f8be5SMark Prins // title and relation_references will already be set. 939af1cdd4SMark C. Prins $id = $event->data ['page']; 944ad8b75bSMark Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 959fe665eaSgithub-actions[bot] $indexer->updateSpatialIndex($id); 96bd120a73SMark C. Prins } 97bd120a73SMark C. Prins 98bd120a73SMark C. Prins /** 9934fb1e15SMark C. Prins * Update the spatial index, removing the page. 100a9441f7dSMark C. Prins * 101157ba6c0Sgithub-actions[bot] * @param Event $event 1024ad8b75bSMark Prins * event object 10334fb1e15SMark C. Prins */ 10478ebf9c0SMark Prins final public function removeFromIndex(Event $event): void 105bdfa1066SMark Prins { 1067c452997SMark C. Prins // event data: 1077c452997SMark C. Prins // $data[0] – The raw arguments for io_saveFile as an array. Do not change file path. 1087c452997SMark C. Prins // $data[0][0] – the file path. 1097c452997SMark C. Prins // $data[0][1] – the content to be saved, and may be modified. 1107c452997SMark C. Prins // $data[1] – ns: The colon separated namespace path minus the trailing page name. (false if root ns) 1117c452997SMark C. Prins // $data[2] – page_name: The wiki page name. 1127c452997SMark C. Prins // $data[3] – rev: The page revision, false for current wiki pages. 1137c452997SMark C. Prins 11478ebf9c0SMark Prins Logger::debug("Event data in removeFromIndex.", $event->data); 11534fb1e15SMark C. Prins if (@file_exists($event->data [0] [0])) { 11634fb1e15SMark C. Prins // file not new 11734fb1e15SMark C. Prins if (!$event->data [0] [1]) { 11834fb1e15SMark C. Prins // file is empty, page is being deleted 11934fb1e15SMark C. Prins if (empty($event->data [1])) { 12034fb1e15SMark C. Prins // root namespace 12134fb1e15SMark C. Prins $id = $event->data [2]; 12234fb1e15SMark C. Prins } else { 12334fb1e15SMark C. Prins $id = $event->data [1] . ":" . $event->data [2]; 12434fb1e15SMark C. Prins } 1254ad8b75bSMark Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 12694fb91ccSMark Prins $indexer?->deleteFromIndex($id); 12734fb1e15SMark C. Prins } 12834fb1e15SMark C. Prins } 12934fb1e15SMark C. Prins } 13034fb1e15SMark C. Prins 13134fb1e15SMark C. Prins /** 13202c45c98SMark C. Prins * Add a new SitemapItem object that points to the KML of public geocoded pages. 13302c45c98SMark C. Prins * 134157ba6c0Sgithub-actions[bot] * @param Event $event 13502c45c98SMark C. Prins */ 13678ebf9c0SMark Prins final public function handleSitemapGenerateBefore(Event $event): void 137bdfa1066SMark Prins { 13800e20e07SMark C. Prins $path = mediaFN($this->getConf('media_kml')); 13902c45c98SMark C. Prins $lastmod = @filemtime($path); 140e48b49c1SMark Prins $event->data ['items'] [] = new Item(ml($this->getConf('media_kml'), '', true, '&', true), $lastmod); 14102c45c98SMark C. Prins } 14202c45c98SMark C. Prins 14302c45c98SMark C. Prins /** 144a9441f7dSMark C. Prins * Create a spatial sitemap or attach the geo/kml map to the sitemap. 145a9441f7dSMark C. Prins * 1464ad8b75bSMark Prins * event object, not used 147bd120a73SMark C. Prins */ 14894fb91ccSMark Prins final public function handleSitemapGenerateAfter(): bool 149bdfa1066SMark Prins { 150817f8be5SMark Prins // $event→data['items']: Array of SitemapItem instances, the array of sitemap items that already 151817f8be5SMark Prins // contains all public pages of the wiki 1527c452997SMark C. Prins // $event→data['sitemap']: The path of the file the sitemap will be saved to. 1539fe665eaSgithub-actions[bot] if (($helper = plugin_load('helper', 'spatialhelper_sitemap')) !== null) { 154f2601b07SMark C. Prins $kml = $helper->createKMLSitemap($this->getConf('media_kml')); 155f2601b07SMark C. Prins $rss = $helper->createGeoRSSSitemap($this->getConf('media_georss')); 15602c45c98SMark C. Prins 15796c9e758SMark Prins if (!empty($this->getConf('sitemap_namespaces'))) { 158*36843668Sgithub-actions[bot] $namespaces = array_map(trim(...), explode("\n", $this->getConf('sitemap_namespaces'))); 15996c9e758SMark Prins foreach ($namespaces as $namespace) { 16096c9e758SMark Prins $kmlN = $helper->createKMLSitemap($namespace . $this->getConf('media_kml')); 16196c9e758SMark Prins $rssN = $helper->createGeoRSSSitemap($namespace . $this->getConf('media_georss')); 16278ebf9c0SMark Prins Logger::debug( 16378ebf9c0SMark Prins "handleSitemapGenerateAfter, created KML / GeoRSS sitemap in $namespace, succes: ", 16478ebf9c0SMark Prins $kmlN && $rssN 165817f8be5SMark Prins ); 16696c9e758SMark Prins } 16796c9e758SMark Prins } 16802c45c98SMark C. Prins return $kml && $rss; 16902c45c98SMark C. Prins } 17078ebf9c0SMark Prins return false; 1719af1cdd4SMark C. Prins } 1729af1cdd4SMark C. Prins 1739af1cdd4SMark C. Prins /** 1749af1cdd4SMark C. Prins * trap findnearby action. 17578ebf9c0SMark Prins * This additional handler is required as described at: https://www.dokuwiki.org/devel:event:tpl_act_unknown 176a9441f7dSMark C. Prins * 177157ba6c0Sgithub-actions[bot] * @param Event $event 1784ad8b75bSMark Prins * event object 1799af1cdd4SMark C. Prins */ 18078ebf9c0SMark Prins final public function handleActionActPreprocess(Event $event): void 181bdfa1066SMark Prins { 1824ad8b75bSMark Prins if ($event->data !== 'findnearby') { 183a9441f7dSMark C. Prins return; 1845fe9bc3cSScrutinizer Auto-Fixer } 1859af1cdd4SMark C. Prins $event->preventDefault(); 1869af1cdd4SMark C. Prins } 1879af1cdd4SMark C. Prins 1889af1cdd4SMark C. Prins /** 1899af1cdd4SMark C. Prins * handle findnearby action. 190a9441f7dSMark C. Prins * 191157ba6c0Sgithub-actions[bot] * @param Event $event 1924ad8b75bSMark Prins * event object 19378ebf9c0SMark Prins * @param array $param 194e4020312SMark C. Prins * associative array with keys 1959bb9b388SMark C. Prins * 'format'=> HTML | JSON 19678ebf9c0SMark Prins * @throws JsonException if anything goes wrong with JSON encoding 1979af1cdd4SMark C. Prins */ 19878ebf9c0SMark Prins final public function findnearby(Event $event, array $param): void 199bdfa1066SMark Prins { 2004ad8b75bSMark Prins if ($event->data !== 'findnearby') { 201a9441f7dSMark C. Prins return; 2025fe9bc3cSScrutinizer Auto-Fixer } 2039af1cdd4SMark C. Prins $event->preventDefault(); 2049fe665eaSgithub-actions[bot] $results = []; 2057c452997SMark C. Prins global $INPUT; 2069fe665eaSgithub-actions[bot] if (($helper = plugin_load('helper', 'spatialhelper_search')) !== null) { 207fd140697SMark C. Prins if ($INPUT->has('lat') && $INPUT->has('lon')) { 2087c452997SMark C. Prins $results = $helper->findNearbyLatLon($INPUT->param('lat'), $INPUT->param('lon')); 209fd140697SMark C. Prins } elseif ($INPUT->has('geohash')) { 210fd140697SMark C. Prins $results = $helper->findNearby($INPUT->str('geohash')); 2117c452997SMark C. Prins } else { 2129fe665eaSgithub-actions[bot] $results = ['error' => hsc($this->getLang('invalidinput'))]; 2139af1cdd4SMark C. Prins } 2149af1cdd4SMark C. Prins } 2159af1cdd4SMark C. Prins 2163e83b370SMark C. Prins $showMedia = $INPUT->bool('showMedia', true); 2173e83b370SMark C. Prins 218*36843668Sgithub-actions[bot] match ($param['format']) { 219*36843668Sgithub-actions[bot] 'JSON' => $this->printJSON($results), 220*36843668Sgithub-actions[bot] default => $this->printHTML($results, $showMedia), 221*36843668Sgithub-actions[bot] }; 2223e83b370SMark C. Prins } 2233e83b370SMark C. Prins 2243e83b370SMark C. Prins /** 2253e83b370SMark C. Prins * Print seachresults as HTML lists. 2263e83b370SMark C. Prins * 2273e83b370SMark C. Prins * @param array $searchresults 22878ebf9c0SMark Prins * @throws JsonException if anything goes wrong with JSON encoding 2293e83b370SMark C. Prins */ 230bdfa1066SMark Prins private function printJSON(array $searchresults): void 231bdfa1066SMark Prins { 2323e83b370SMark C. Prins header('Content-Type: application/json'); 23378ebf9c0SMark Prins echo json_encode($searchresults, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT); 2343e83b370SMark C. Prins } 2353e83b370SMark C. Prins 2363e83b370SMark C. Prins /** 2373e83b370SMark C. Prins * Print seachresults as HTML lists. 2383e83b370SMark C. Prins * 2393e83b370SMark C. Prins * @param array $searchresults 2404ad8b75bSMark Prins * @param bool $showMedia 2413e83b370SMark C. Prins */ 242bdfa1066SMark Prins private function printHTML(array $searchresults, bool $showMedia = true): void 243bdfa1066SMark Prins { 2443e83b370SMark C. Prins $pages = (array)($searchresults ['pages']); 2453e83b370SMark C. Prins $media = (array)$searchresults ['media']; 246594a0ef1SMark C. Prins $lat = (float)$searchresults ['lat']; 247594a0ef1SMark C. Prins $lon = (float)$searchresults ['lon']; 2483e83b370SMark C. Prins $geohash = (string)$searchresults ['geohash']; 2493e83b370SMark C. Prins 2503e83b370SMark C. Prins if (isset($searchresults ['error'])) { 2519fe665eaSgithub-actions[bot] echo '<div class="level1"><p>' . hsc($searchresults ['error']) . '</p></div>'; 2523e83b370SMark C. Prins return; 2533e83b370SMark C. Prins } 2543e83b370SMark C. Prins 25594fb91ccSMark Prins // print the HTML list 2569fe665eaSgithub-actions[bot] echo '<h1>' . $this->getLang('results_header') . '</h1>' . DOKU_LF; 2579fe665eaSgithub-actions[bot] echo '<div class="level1">' . DOKU_LF; 2589fe665eaSgithub-actions[bot] if ($pages !== []) { 2597c452997SMark C. Prins $pagelist = '<ol>' . DOKU_LF; 2607c452997SMark C. Prins foreach ($pages as $page) { 26137f78197SMark Prins $pagelist .= '<li>' . html_wikilink( 2629fe665eaSgithub-actions[bot] ':' . $page ['id'], 2639fe665eaSgithub-actions[bot] useHeading('navigation') ? null : 26437f78197SMark Prins noNS($page ['id']) 26537f78197SMark Prins ) . ' (' . $this->getLang('results_distance_prefix') 266817f8be5SMark Prins . $page ['distance'] . ' m) ' . $page ['description'] . '</li>' . DOKU_LF; 2677c452997SMark C. Prins } 2687c452997SMark C. Prins $pagelist .= '</ol>' . DOKU_LF; 2697c452997SMark C. Prins 2709fe665eaSgithub-actions[bot] echo '<h2>' . $this->getLang('results_pages') . hsc( 27137f78197SMark Prins ' lat;lon: ' . $lat . ';' . $lon 27237f78197SMark Prins . ' (geohash: ' . $geohash . ')' 27337f78197SMark Prins ) . '</h2>'; 2749fe665eaSgithub-actions[bot] echo '<div class="level2">' . DOKU_LF; 2759fe665eaSgithub-actions[bot] echo $pagelist; 2769fe665eaSgithub-actions[bot] echo '</div>' . DOKU_LF; 2779af1cdd4SMark C. Prins } else { 2789fe665eaSgithub-actions[bot] echo '<p>' . hsc($this->getLang('nothingfound')) . '</p>'; 2799af1cdd4SMark C. Prins } 280e4020312SMark C. Prins 2819fe665eaSgithub-actions[bot] if ($media !== [] && $showMedia) { 2827c452997SMark C. Prins $pagelist = '<ol>' . DOKU_LF; 2837c452997SMark C. Prins foreach ($media as $m) { 2849fe665eaSgithub-actions[bot] $opts = []; 28578ebf9c0SMark Prins $link = ml($m ['id'], $opts, false); 2869bb9b388SMark C. Prins $opts ['w'] = '100'; 2877c452997SMark C. Prins $src = ml($m ['id'], $opts); 28878ebf9c0SMark Prins $pagelist .= '<li><a href="' . $link . '"><img src="' . $src . '" alt=""></a> (' 28978ebf9c0SMark Prins . $this->getLang('results_distance_prefix') . $m ['distance'] . ' m) ' 290817f8be5SMark Prins . '</li>' . DOKU_LF; 291bd120a73SMark C. Prins } 2927c452997SMark C. Prins $pagelist .= '</ol>' . DOKU_LF; 2937c452997SMark C. Prins 2949fe665eaSgithub-actions[bot] echo '<h2>' . $this->getLang('results_media') . hsc( 29537f78197SMark Prins ' lat;lon: ' . $lat . ';' . $lon 29637f78197SMark Prins . ' (geohash: ' . $geohash . ')' 29737f78197SMark Prins ) . '</h2>' . DOKU_LF; 2989fe665eaSgithub-actions[bot] echo '<div class="level2">' . DOKU_LF; 2999fe665eaSgithub-actions[bot] echo $pagelist; 3009fe665eaSgithub-actions[bot] echo '</div>' . DOKU_LF; 3017c452997SMark C. Prins } 3029fe665eaSgithub-actions[bot] echo '<p>' . $this->getLang('results_precision') . $searchresults ['precision'] . ' m. '; 303594a0ef1SMark C. Prins if (strlen($geohash) > 1) { 30437f78197SMark Prins $url = wl( 3059fe665eaSgithub-actions[bot] getID(), 3069fe665eaSgithub-actions[bot] ['do' => 'findnearby', 'geohash' => substr($geohash, 0, -1)] 30737f78197SMark Prins ); 3089fe665eaSgithub-actions[bot] echo '<a href="' . $url . '" class="findnearby">' . $this->getLang('search_largerarea') . '</a>.</p>' 309817f8be5SMark Prins . DOKU_LF; 310594a0ef1SMark C. Prins } 3119fe665eaSgithub-actions[bot] echo '</div>' . DOKU_LF; 3127c452997SMark C. Prins } 3133e83b370SMark C. Prins 3147c452997SMark C. Prins /** 3157c452997SMark C. Prins * add media to spatial index. 3167c452997SMark C. Prins * 317157ba6c0Sgithub-actions[bot] * @param Event $event 318a9441f7dSMark C. Prins */ 31978ebf9c0SMark Prins final public function handleMediaUploaded(Event $event): void 320bdfa1066SMark Prins { 321639d6e38SMark Prins //data[0] path/to/new/media.file (normally read from $_FILES, potentially could come from elsewhere) 3227c452997SMark C. Prins //data[1] file name of the file being uploaded 3237c452997SMark C. Prins //data[2] future directory id of the file being uploaded 3247c452997SMark C. Prins //data[3] the mime type of the file being uploaded 3257c452997SMark C. Prins //data[4] true if the uploaded file exists already 3267c452997SMark C. Prins //data[5] (since 2011-02-06) the PHP function used to move the file to the correct location 32702c45c98SMark C. Prins 32878ebf9c0SMark Prins Logger::debug("handleMediaUploaded::event data", $event->data); 329a9441f7dSMark C. Prins 330a9441f7dSMark C. Prins // check the list of mimetypes 331a9441f7dSMark C. Prins // if it's a supported type call appropriate index function 332639d6e38SMark Prins if (str_contains($event->data [3], 'image/jpeg')) { 333a9441f7dSMark C. Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 33494fb91ccSMark Prins $indexer?->indexImage($event->data [2]); 335a9441f7dSMark C. Prins } 3367c452997SMark C. Prins // TODO add image/tiff 337a9441f7dSMark C. Prins // TODO kml, gpx, geojson... 338a9441f7dSMark C. Prins } 339a9441f7dSMark C. Prins 340a9441f7dSMark C. Prins /** 341a9441f7dSMark C. Prins * removes the media from the index. 342157ba6c0Sgithub-actions[bot] * @param Event $event event object with data 343a9441f7dSMark C. Prins */ 34478ebf9c0SMark Prins final public function handleMediaDeleted(Event $event): void 345bdfa1066SMark Prins { 3467c452997SMark C. Prins // data['id'] ID data['unl'] unlink return code 3477c452997SMark C. Prins // data['del'] Namespace directory unlink return code 3487c452997SMark C. Prins // data['name'] file name data['path'] full path to the file 3497c452997SMark C. Prins // data['size'] file size 35002c45c98SMark C. Prins 3517c452997SMark C. Prins // remove the media id from the index 3524ad8b75bSMark Prins $indexer = plugin_load('helper', 'spatialhelper_index'); 35394fb91ccSMark Prins $indexer?->deleteFromIndex('media__' . $event->data ['id']); 354a9441f7dSMark C. Prins } 3557c452997SMark C. Prins 3567c452997SMark C. Prins /** 35702c45c98SMark C. Prins * add a link to the spatial sitemap files in the header. 35802c45c98SMark C. Prins * 359157ba6c0Sgithub-actions[bot] * @param Event $event the DokuWiki event. $event->data is a two-dimensional array of all meta headers. 36078ebf9c0SMark Prins * The keys are meta, link and script. 36102c45c98SMark C. Prins * 36202c45c98SMark C. Prins * @see http://www.dokuwiki.org/devel:event:tpl_metaheader_output 36302c45c98SMark C. Prins */ 36478ebf9c0SMark Prins final public function handleMetaheaderOutput(Event $event): void 365bdfa1066SMark Prins { 36602c45c98SMark C. Prins // TODO maybe test for exist 36778ebf9c0SMark Prins $event->data ["link"] [] = ["type" => "application/atom+xml", "rel" => "alternate", 36878ebf9c0SMark Prins "href" => ml($this->getConf('media_georss')), "title" => "Spatial ATOM Feed"]; 36978ebf9c0SMark Prins $event->data ["link"] [] = ["type" => "application/vnd.google-earth.kml+xml", "rel" => "alternate", 37078ebf9c0SMark Prins "href" => ml($this->getConf('media_kml')), "title" => "KML Sitemap"]; 37102c45c98SMark C. Prins } 37202c45c98SMark C. Prins 37302c45c98SMark C. Prins /** 3744c9ad1fbSMark Prins * Add spatialhelper popularity data. 3754c9ad1fbSMark Prins * 376157ba6c0Sgithub-actions[bot] * @param Event $event 3774c9ad1fbSMark Prins * the DokuWiki event 3784c9ad1fbSMark Prins */ 3799fe665eaSgithub-actions[bot] final public function popularity(Event $event): void 380bdfa1066SMark Prins { 381e2534c81SMark Prins $versionInfo = getVersionData(); 3824c9ad1fbSMark Prins $plugin_info = $this->getInfo(); 3834c9ad1fbSMark Prins $event->data['spatialhelper']['version'] = $plugin_info['date']; 384e2534c81SMark Prins $event->data['spatialhelper']['dwversion'] = $versionInfo['date']; 385e2534c81SMark Prins $event->data['spatialhelper']['combinedversion'] = $versionInfo['date'] . '_' . $plugin_info['date']; 3864c9ad1fbSMark Prins } 387bd120a73SMark C. Prins} 388