Skip to content

Releases: pablop76/mod_pposmap

mod_pposmap 1.4.0

Choose a tag to compare

@pablop76 pablop76 released this 06 Sep 18:40

Leaflet jedzie razem z modułem

Do tej pory Leaflet i biblioteka klastrowania ładowały się z unpkg. Wystarczyło,
że ten serwer nie odpowie albo że witryna ma ostrzejszą politykę bezpieczeństwa
treści (CSP), a mapa nie rysowała się w ogóle. Teraz obie biblioteki są
w paczce — Leaflet 1.9.4 i leaflet.markercluster 1.5.3 — i moduł domyślnie
bierze je z własnego serwera.

Poza odpornością na awarie zmienia to jeszcze dwie rzeczy: adres odwiedzającego
nie trafia już do zewnętrznego dostawcy przy każdym wejściu na stronę, a paczka
działa bez wyjścia w świat. Dawny argument, że CDN jest szybszy, bo przeglądarka
ma bibliotekę w pamięci z innej witryny, przestał obowiązywać — od 2020 roku
przeglądarki dzielą tę pamięć osobno dla każdej witryny.

Wybór źródła: własny serwer albo CDN pod wskazanym adresem

W ustawieniach modułu (tryb Leaflet) doszło pole Źródło bibliotek. Domyślnie
jest „lokalnie". Po przełączeniu na CDN pokazuje się drugie pole z adresem
bazowym — domyślnie unpkg, ale układ ścieżek jest taki jak w npm, więc równie
dobrze wpisać można jsDelivr albo własne lustro.

Sumy kontrolne (SRI) zostają także przy własnym adresie. Pliki tych wersji są
bajt w bajt takie same na każdym lustrze, więc jeśli serwer poda co innego,
przeglądarka odmówi wykonania skryptu. Lepsza głośna odmowa niż cicho podmieniony
skrypt na cudzej stronie.

Żeby to działało, biblioteki w repozytorium są wyłączone z normalizacji końców
wierszy. Bez tego git przy zapisie zmieniał im bajty, plik przestawał być
identyczny z tym, co wydał autor, i suma kontrolna przestawała się zgadzać.

Mapbox bez zmian

Mapbox GL JS nadal idzie z api.mapbox.com. Tam zależności od cudzej usługi
i tak nie da się zerwać, bo biblioteka wymaga tokenu dostępowego.

Aktualizacja

Zgodna wstecz: żadne pole nie zostało usunięte ani przemianowane, ustawienia
i dodane punkty zostają nietknięte. Po aktualizacji moduł przestaje sam z siebie
odpytywać unpkg — domyślnym źródłem jest własny serwer.

mod_pposmap 1.3.0

Choose a tag to compare

@pablop76 pablop76 released this 12 Aug 21:02

Obsługa GeoJSON

Moduł wczytuje dane z pliku GeoJSON: wklejonego w panelu albo leżącego na serwerze. Obsługiwane są wszystkie typy geometrii wraz z GeometryCollection.

  • Punkty (Point, MultiPoint) zachowują się dokładnie jak dodane ręcznie: dostają pinezkę i dymek, trafiają na listę obok mapy i mogą wejść do danych strukturalnych.
  • Linie i obszary rysują się na mapie z konfigurowalnym kolorem, grubością i kryciem. Pokazują to, czego pinezka nie pokaże: obszar dojazdu, przebieg trasy, granicę gminy, strefę dostawy.
  • Działa u obu dostawców: Leaflet przez L.geoJSON, Mapbox przez źródło geojson z warstwami fill i line. Ten sam plik działa w obu trybach, nic nie trzeba konwertować.
  • Nazwy właściwości, z których czytany jest tytuł, opis, telefon, godziny, zdjęcie i pola adresowe, ustawia się w panelu. Domyślne pasują do eksportu z OpenStreetMap, a Moje Mapy Google używają name i description.
  • Właściwości standardu simplestyle-spec zapisane w samym pliku mają pierwszeństwo przed ustawieniami modułu.
  • Opcja dopasowania widoku do danych ustawia środek i przybliżenie tak, żeby zmieściły się wszystkie punkty i obszary.

Bezpieczeństwo i jakość danych: treść z pliku jest filtrowana po stronie PHP (tytuł przez strip_tags, opis w trybie safehtml), wczytywanie z pliku ogranicza się do katalogu witryny i rozszerzeń .geojson/.json, obiekt bez nazwy nie trafia do danych strukturalnych, a współrzędne poza zakresem są pomijane zamiast lądować w losowym miejscu świata.

Usuwanie wszystkich punktów naraz

Przycisk czyszczący całą listę punktów jednym kliknięciem, zamiast kasowania wiersz po wierszu. Zabezpieczenie przed przypadkowym usunięciem jest trzywarstwowe:

  1. pytanie potwierdzające podające liczbę punktów,
  2. przycisk Cofnij wstawiający wiersze z powrotem na ich pierwotne miejsca,
  3. nic nie trafia do bazy przed kliknięciem Zapisz, więc wyjście z modułu bez zapisywania przywraca stan.

Pozostałe

Obrazki i pinezki obsługują teraz adresy bezwzględne, bo właściwość ze zdjęciem w GeoJSON bywa pełnym adresem obcego serwera. Punkt bez tytułu i bez opisu nie tworzy już pustego wiersza na liście.

Aktualizacja jest zgodna wstecz: żadne pole nie zostało usunięte ani przemianowane, ustawienia i dodane punkty zostają nietknięte.

mod_pposmap 1.2.0

Choose a tag to compare

@pablop76 pablop76 released this 12 Aug 07:25

Wydanie funkcjonalne. Doszło 27 nowych ustawień, żadne nie zostało usunięte, więc aktualizacja jest zgodna wstecz: dotychczasowa konfiguracja i dodane punkty zostają nietknięte.

Nowe funkcje

Serwer kafelków (tryb Leaflet). Można podmienić dostawcę kafelków na dowolnego, z kluczem API dopisanym jako parametr adresu, i ustawić własną atrybucję w rogu mapy. Doszły też limity przybliżenia obsługiwane przez dostawcę. Gotowe adresy siedmiu stylów wraz z pasującymi atrybucjami są w README.

Pinezki. Każdy punkt może mieć własną ikonę, niezależną od domyślnej. Do tego konfigurowalna szerokość, wysokość i punkt zaczepienia, czyli miejsce obrazka, które faktycznie wskazuje współrzędne.

Lista punktów. Własny napis na przycisku, własne klasy CSS przycisku i ustawiana szerokość kolumny.

Formatowanie opisu. W dymku na mapie działa proste formatowanie HTML: pogrubienie, kursywa, odnośnik, lista.

Zakładka „O module". Opis modułu, instrukcja startowa, wykaz zachowań wymagających wyjaśnienia oraz informacja o aktualizacjach.

Dane strukturalne (Schema.org)

Znacznik JSON-LD został przebudowany z ItemList na @graph z identyfikatorami @id.

  • Dane lokalne każdego punktu: ulica, kod pocztowy, miejscowość, kraj, telefon, adres podstrony i profile zewnętrzne (sameAs).
  • Godziny otwarcia jako openingHoursSpecification. Właściwość openingHours ma dziedzinę ograniczoną do LocalBusiness i CivicStructure, więc dla typów opisujących samo miejsce była nieprawidłowa.
  • Dziewięć typów punktów do wyboru, od Place po LodgingBusiness.
  • Powiązanie z organizacją prowadzącą stronę tylko po świadomym włączeniu opcji. Przy mapie cudzych firm takie powiązanie wprowadzałoby wyszukiwarkę w błąd.
  • Możliwość wypisywania znacznika tylko na wskazanych pozycjach menu, zamiast na każdej stronie, na której moduł jest widoczny.

Poprawki

Bezpieczeństwo. Pola tytułu, opisu i godzin otwarcia miały filter="raw", a ich zawartość trafiała do HTML bez escapowania. Opis przeszedł na safehtml, tytuł i godziny na string, a wartości wstawiane do znaczników są escapowane po stronie JavaScriptu.

Rozjazd listy z markerami. Punkt z pustymi współrzędnymi lądował na 0,0 zamiast zostać pominięty, przez co numeracja listy przestawała zgadzać się z pinezkami. Teraz taki wiersz jest odrzucany w jednym miejscu i nie trafia ani na mapę, ani na listę, ani do danych strukturalnych.

Rozpychanie strony. Mapa jako element flex bez min-width była rozpychana przez pasek atrybucji Leafletu, co dawało poziomy pasek przewijania całej strony.

Pamięć podręczna przeglądarki. joomla.asset.json tkwił na wersji 1.0.0 od pierwszego wydania, więc po każdej aktualizacji przeglądarki dalej serwowały stary custom.js i style.css. Numer jest teraz synchronizowany z wersją modułu.

Pozostałe. Poprawiony start modułu przy odroczonym ładowaniu JavaScriptu, uporządkowany układ listy punktów oraz usunięta zależność od UIkita: moduł ma własny, neutralny styl i nie wymaga żadnego frameworku CSS.

Uwagi do aktualizacji

Po aktualizacji odśwież stronę z pominięciem pamięci podręcznej (Ctrl+Shift+R).

Moduł przestał być spersonalizowany pod konkretne wdrożenie i nadaje się do ogólnego zastosowania.

v1.1.4

Choose a tag to compare

@pablop76 pablop76 released this 04 Jul 14:59

Aktualizacja creationDate na datę wydania (Joomla wyświetla tę wartość dosłownie z manifestu i nie robi tego automatycznie).

v1.1.3

Choose a tag to compare

@pablop76 pablop76 released this 04 Jul 14:48

Poprawka: notka z wersją/autorem przeniesiona z frontu (gdzie omyłkowo trafiła w 1.1.1) do panelu admina (ekran edycji modułu, fieldset „O module”). Usunięto ryzykowny kod ExtensionHelper z frontendu.

v1.1.2

Choose a tag to compare

@pablop76 pablop76 released this 04 Jul 14:26

Poprawka krytyczna: HTTP 500 na Joomla 6 spowodowany brakującym parametrem $clientId w ExtensionHelper::getExtensionRecord() (wprowadzone w 1.1.1 stopką z wersją modułu). Dodano zabezpieczenie try/catch.

v1.1.1

Choose a tag to compare

@pablop76 pablop76 released this 04 Jul 14:12

Poprawka krytyczna: klastrowanie w trybie Leaflet powodowało całkowite zniknięcie mapy (konflikt L.noConflict() z wtyczką leaflet.markercluster). Dodatkowo: stopka modułu z numerem wersji i danymi autora.

v1.1.0

Choose a tag to compare

@pablop76 pablop76 released this 04 Jul 13:47

Nowe funkcje: wsparcie wielu instancji modułu na stronie, dane strukturalne Schema.org (przełącznik), klastrowanie markerów (Leaflet.markercluster / Mapbox GL cluster), walidacja zakresów lat/lng, poprawki dostępności (przycisk listy punktów).

v1.0.1

Choose a tag to compare

@pablop76 pablop76 released this 04 Jul 13:09

Poprawki: ścieżki obrazków niezależne od podkatalogu instalacji, usunięty auto-obracający globus Mapbox, Mapbox GL JS/CSS z CDN zamiast zvendorowanego pliku, usunięty martwy kod, drobne refaktoryzacje.