From 248140d78a6c9e962e6db106052b8e02b443dcab Mon Sep 17 00:00:00 2001 From: Tykayn Date: Tue, 3 Jun 2025 16:19:07 +0200 Subject: [PATCH] up --- assets/styles/app.css | 12 +++++ src/Controller/AdminController.php | 55 +++++++++------------ src/Controller/PublicController.php | 2 +- src/Entity/Place.php | 32 +++++++++++- src/Service/Motocultrice.php | 48 +++++++----------- templates/admin/labourage_results.html.twig | 2 +- templates/admin/stats.html.twig | 14 +++--- 7 files changed, 92 insertions(+), 73 deletions(-) diff --git a/assets/styles/app.css b/assets/styles/app.css index 80256ea..51e4b55 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -31,4 +31,16 @@ table.js-sort-table th:hover { table.js-sort-table th:active { background-color: #e0e0e0; +} + +.maplibregl-popup-content { + overflow-y: auto; + min-width: 300px; + max-height: 400px; +} + +.maplibregl-popup-content h1, +.maplibregl-popup-content h2, +.maplibregl-popup-contenth3 { + font-size: 1rem; } \ No newline at end of file diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index a0439e6..75328af 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -209,50 +209,41 @@ final class AdminController extends AbstractController } // pour chaque résultat, vérifier que l'on a pas déjà un commerce avec le même osm_object_id - $results = array_filter($results, function($commerce) use ($osm_object_ids) { + $new_places_list = array_filter($results, function($commerce) use ($osm_object_ids) { return !in_array($commerce['id'], $osm_object_ids); }); + $existing_places_list = array_filter($results, function($commerce) use ($osm_object_ids) { + return in_array($commerce['id'], $osm_object_ids); + }); // on crée un commerce pour chaque résultat qui reste - foreach ($results as $result) { - $commerce = new Place(); + foreach ($new_places_list as $np) { + $new_place = new Place(); - if (isset($result['tags']['amenity'])) { - $commerce->setMainTag('amenity='.$result['tags']['amenity']); - } - if (isset($result['tags']['shop'])) { - $commerce->setMainTag('shop='.$result['tags']['shop']); - } - if (isset($result['tags']['tourism'])) { - $commerce->setMainTag('tourism='.$result['tags']['tourism']); - } - $commerce->setOsmId($result['id']) - ->setOsmKind($result['type']) - ->setName($result['name']) - ->setZipCode($zip_code) - ->setEmail($result['email']) + $new_place ->setUuidForUrl($this->motocultrice->uuid_create()) - ->setOptedOut(false) - ->setDead(false) - ->setModifiedDate(new \DateTime()) + ->setStats($stats) + ->setDead(false) + ->setOptedOut(false) ->setAskedHumainsSupport(false) ->setLastContactAttemptDate(null) - ->setStats($stats) - ->setNote($result['tags'] && isset($result['tags']['note']) ? isset($result['tags']['note']) : null) - ->setHasOpeningHours($result['tags'] && isset($result['tags']['opening_hours']) ? isset($result['tags']['opening_hours']) : null) - ->setHasAddress(($result['tags'] && isset($result['tags']['address']) || $result['tags'] && isset($result['tags']['contact:address'])) ? isset($result['tags']['address']) : null) - ->setHasWebsite($result['tags'] && isset($result['tags']['website']) ? $result['tags']['website'] : null) - ->setHasWheelchair($result['tags'] && isset($result['tags']['wheelchair']) ? $result['tags']['wheelchair'] : null) - ->setHasNote($result['tags'] && isset($result['tags']['note']) ? $result['tags']['note'] : null) - ->setNoteContent($result['tags'] && isset($result['tags']['note']) ? $result['tags']['note'] : null) - ; - $this->entityManager->persist($commerce); + ->update_place_from_overpass_data($new_place); + $this->entityManager->persist($new_place); + } + // Mise à jour des commerces existants avec les données Overpass + foreach ($commerces as $existing_places_list) { + foreach ($results as $result) { + if ($existing_places_list->getOsmId() == $result['id'] && $existing_places_list->getOsmKind() == $result['type']) { + $existing_places_list->update_place_from_overpass_data($result); + $this->entityManager->persist($existing_places_list); + break; + } + } } $this->entityManager->flush(); - $commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $zip_code]); $stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]); return $this->render('admin/labourage_results.html.twig', [ @@ -365,7 +356,7 @@ final class AdminController extends AbstractController $response->headers->set('Content-Type', 'text/csv'); $slug_name = str_replace(' ', '-', $stats->getName()); - + $response->headers->set('Content-Disposition', 'attachment; filename="osm-commerces-export_' . $zip_code . '_' . $slug_name . '_' . date('Y-m-d_H-i-s') . '.csv"'); return $response; diff --git a/src/Controller/PublicController.php b/src/Controller/PublicController.php index 6aa31f3..e4c04cc 100644 --- a/src/Controller/PublicController.php +++ b/src/Controller/PublicController.php @@ -100,7 +100,7 @@ class PublicController extends AbstractController $message = (new Email()) ->from('contact@osm-commerce.fr') ->to($destinataire) - ->subject('Votre lien de modification OpenStreetMap') + ->subject('Votre lien de modification Ope nStreetMap') ->text('Bonjour, nous sommes des bénévoles d\'OpenStreetMap France et nous vous proposons de modifier les informations de votre commerce. Voici votre lien unique de modification: ' . $this->generateUrl('app_public_edit', [ 'zipcode' => $zipCode, 'name' => $place_name, diff --git a/src/Entity/Place.php b/src/Entity/Place.php index 6f0f65b..63f9250 100644 --- a/src/Entity/Place.php +++ b/src/Entity/Place.php @@ -121,8 +121,38 @@ class Place return round($filled_fields / $total_fields * 100); } public function update_place_from_overpass_data(array $overpass_data) { - $overpass_data = $overpass_data['tags_converted'] ; + $tags_converted = $overpass_data['tags_converted'] ; + if (isset($tags_converted['amenity']) && $tags_converted['amenity'] != '') { + $this->setMainTag('amenity='.$tags_converted['amenity']); + } + if (isset($tags_converted['shop']) && $tags_converted['shop'] != '') { + $this->setMainTag('shop='.$tags_converted['shop']); + } + if (isset($tags_converted['tourism']) && $tags_converted['tourism'] != '') { + $this->setMainTag('tourism='.$tags_converted['tourism']); + } + if (isset($tags_converted['office']) && $tags_converted['office'] != '') { + $this->setMainTag('office='.$tags_converted['office']); + } + if (isset($tags_converted['healthcare']) && $tags_converted['healthcare'] != '') { + $this->setMainTag('healthcare='.$tags_converted['healthcare']); + } + + $this->setOsmId($overpass_data['id']) + ->setOsmKind($overpass_data['type']) + ->setName($overpass_data['name']) + ->setZipCode($overpass_data['postcode']) + ->setEmail($overpass_data['email']) + ->setNote($overpass_data['tags'] && isset($overpass_data['tags']['note']) ? isset($overpass_data['tags']['note']) : null) + ->setHasOpeningHours($overpass_data['tags'] && isset($overpass_data['tags']['opening_hours']) ? isset($overpass_data['tags']['opening_hours']) : null) + ->setHasAddress(($overpass_data['tags'] && isset($overpass_data['tags']['address']) || $overpass_data['tags'] && isset($overpass_data['tags']['contact:address'])) ? isset($overpass_data['tags']['address']) : null) + ->setHasWebsite($overpass_data['tags'] && isset($overpass_data['tags']['website']) ? $overpass_data['tags']['website'] : null) + ->setHasWheelchair($overpass_data['tags'] && isset($overpass_data['tags']['wheelchair']) ? $overpass_data['tags']['wheelchair'] : null) + ->setHasNote($overpass_data['tags'] && isset($overpass_data['tags']['note']) ? $overpass_data['tags']['note'] : null) + ->setNoteContent($overpass_data['tags'] && isset($overpass_data['tags']['note']) ? $overpass_data['tags']['note'] : null) + // ->setDisplayedDate(new \DateTime()) + ; // Remplir les clés attendues avec des valeurs par défaut si non définies $overpass_data = array_merge([ 'id' => '', diff --git a/src/Service/Motocultrice.php b/src/Service/Motocultrice.php index b031206..022bcd0 100644 --- a/src/Service/Motocultrice.php +++ b/src/Service/Motocultrice.php @@ -10,6 +10,14 @@ class Motocultrice private $overpassApiUrl = 'https://overpass-api.de/api/interpreter'; private $osmApiUrl = 'https://www.openstreetmap.org/api/0.6'; + public $overpass_base_places = ' + ( + nw["amenity"~"^(cafe|bar|restaurant|library|cinema|fast_food|post_office|marketplace|community_centre|theatre|bank|townhall)$"](area.searchArea); + nw["shop"](area.searchArea); + nw["healthcare"](area.searchArea); + nw["office"](area.searchArea); +); + '; // ne pas lister les tags qui utilisent des morceaux particuliers de formulaire pour éviter que les gens aient besoin de connaître le tag OSM public $excluded_tags_to_render = [ 'name', @@ -82,34 +90,17 @@ class Motocultrice public function get_export_query($zone) { return <<.france; -area["postal_code"="{$zone}"](area.france)->.searchArea; -( - nw["amenity"~"^(cafe|bar|restaurant|library|cinema|fast_food|post_office|marketplace|community_centre|theatre|bank|townhall)$"](area.searchArea); - nw["shop"](area.searchArea); - nw["healthcare"](area.searchArea); - nw["office"](area.searchArea); -); -out body; +{{geocodeArea:"{$zone}, France"}}->.searchArea; +{$this->overpass_base_places} +out skel qt; QUERY; } public function get_query_places($zone) { - return <<.france; -area["postal_code"="{$zone}"](area.france)->.searchArea; -( - - nw["amenity"~"^(cafe|bar|restaurant|library|cinema|fast_food|post_office|marketplace|community_centre|theatre|bank|townhall)$"](area.searchArea); - nw["shop"](area.searchArea); - nw["healthcare"](area.searchArea); - nw["office"](area.searchArea); -); -out body; ->; -out skel qt; -QUERY; + return '[out:json][timeout:25]; +area["postal_code"="'.$zone.'"]->.searchArea; +'.$this->overpass_base_places.' +out center tags;'; } private $more_tags = ['image', 'ref:FR:SIRET']; @@ -167,14 +158,9 @@ QUERY; } // Nettoyer et échapper la zone pour la requête - $zone = addslashes(trim($zone)); -// //area["postal_code"="{$zone}"]->.searchArea; + $zone = addslashes(trim($zone)); $query = $this->get_query_places($zone); - if($use_places_without_email_to_reference) { - $query = $this->get_query_places($zone); - } - try { $response = $this->client->request('POST', $this->overpassApiUrl, [ 'body' => ['data' => $query] @@ -212,7 +198,7 @@ QUERY; return $places; } catch (\Exception $e) { - var_dump($essai_query); + var_dump($query); var_dump($e->getMessage()); die(); throw new \Exception("Erreur lors de la requête Overpass : " . $e->getMessage()); diff --git a/templates/admin/labourage_results.html.twig b/templates/admin/labourage_results.html.twig index 7bce511..f270b2a 100644 --- a/templates/admin/labourage_results.html.twig +++ b/templates/admin/labourage_results.html.twig @@ -21,7 +21,7 @@

-commerces existants disposant d'un moyen de contact mail: {{ commerces|length }} +commerces existants déjà en base: {{ commerces|length }}

{# {{ dump(commerces[0]) }} #} diff --git a/templates/admin/stats.html.twig b/templates/admin/stats.html.twig index 3ad1bb7..b4476b0 100644 --- a/templates/admin/stats.html.twig +++ b/templates/admin/stats.html.twig @@ -101,6 +101,7 @@ out skel qt;`; }); map.on('load', () => { + console.log('map load...'); // Ajouter le contour administratif if (boundaryData.elements && boundaryData.elements.length > 0) { const boundary = boundaryData.elements[0]; @@ -137,13 +138,11 @@ out skel qt;`; console.log('map chargé',data.elements); data.elements.forEach(element => { - if(element.tags){ + // Cherche les coordonnées à la racine ou dans center + const lat = element.lat || (element.center && element.center.lat); + const lon = element.lon || (element.center && element.center.lon); - console.log('element', element.tags['name'] , element); - } - - if (element.lat && element.lon && element.tags && element.tags['name']) { - + if (lat && lon && element.tags && element.tags['name']) { const el = document.createElement('div'); el.className = 'marker'; let tagstable = ''; @@ -162,7 +161,7 @@ out skel qt;`; new maplibregl.Marker(el) - .setLngLat([element.lon, element.lat]) + .setLngLat([lon, lat]) .setPopup(new maplibregl.Popup({ offset: 25, anchor: 'bottom' @@ -193,6 +192,7 @@ out skel qt;`; } document.addEventListener('DOMContentLoaded', function() { + console.log('DOMContentLoaded'); const headers = document.querySelectorAll('th'); headers.forEach(header => { const text = header.textContent;
CléValeur