"0.6", // "generator"=> "openstreetmap-cgimap 2.0.1 (2557185 spike-08.openstreetmap.org)", // "copyright"=> "OpenStreetMap and contributors", // "attribution"=> "http://www.openstreetmap.org/copyright", // "license"=> "http://opendatacommons.org/licenses/odbl/1-0/", // "elements"=> [ // [ // "type"=> "node", // "id"=> 12855459190, // "lat"=> 49.6504926, // "lon"=> -1.5722526, // "timestamp"=> "2025-05-22T13:15:45Z", // "version"=> 1, // "changeset"=> 166613142, // "user"=> "tykayn", // "uid"=> 2962129, // "tags"=> [ // "name"=> "Harry le potier", // "tourism"=> "artwork" // ] // ] // ] ]; // Récupérer les vraies données OSM $client = new \GuzzleHttp\Client(); try { $response = $client->get($object_id); $xml = simplexml_load_string($response->getBody()->getContents()); $json = json_encode($xml); $osm_object_data = json_decode($json, true); } catch (\Exception $e) { // En cas d'erreur, on garde les données de test $this->addFlash('warning', 'Impossible de récupérer les données OSM. Utilisation des données de test.'); } // var_dump($osm_object_data['node']); // die(); // convertir les tags en clés et valeurs $osm_object_data['tags_converted'] = []; // var_dump($osm_object_data['node']['tag']); foreach ($osm_object_data['node']['tag'] as $attribute) { // var_dump($attribute['@attributes']['k']); // die(); $osm_object_data['node']['tags_converted'][$attribute['@attributes']['k']] = $attribute['@attributes']['v']; } // var_dump($osm_object_data['node']['tags_converted']); // die(); return $osm_object_data['node']; } #[Route('/', name: 'app_public_index')] public function index(): Response { $commerce = $this->get_osm_object_data(); return $this->render('public/index.html.twig', [ 'controller_name' => 'PublicController', 'commerce' => $commerce, 'mapbox_token' => $this->mapbox_token, 'maptiler_token' => $this->maptiler_token, ]); } #[Route('/modify/{osm_object_id}/{version}/{changesetID}', name: 'app_public_submit')] public function submit($osm_object_id, $version, $changesetID): Response { // Récupérer les données POST $request = Request::createFromGlobals(); // Vérifier si des données ont été soumises if ($request->isMethod('POST')) { $status = "non modifié"; // Récupérer tous les tags du formulaire $tags = []; foreach ($request->request->all() as $key => $value) { if (strpos($key, 'commerce_tag_value__') === 0) { $tagKey = str_replace('commerce_tag_value__', '', $key); if (!empty($value)) { $tags[$tagKey] = $value; } } } // Récupérer le token OSM depuis les variables d'environnement $osm_api_token = $_ENV['APP_OSM_BEARER']; try { $client = new Client(); // 1. Créer un nouveau changeset $changesetXml = new \SimpleXMLElement(''); $changeset = $changesetXml->addChild('changeset'); $tag = $changeset->addChild('tag'); $tag->addAttribute('k', 'created_by'); $tag->addAttribute('v', 'OSM Mon Commerce Web Editor'); $tag = $changeset->addChild('tag'); $tag->addAttribute('k', 'comment'); $tag->addAttribute('v', 'Modification des tags via l\'interface web'); $changesetResponse = $client->put('https://api.openstreetmap.org/api/0.6/changeset/create', [ 'body' => $changesetXml->asXML(), 'headers' => [ 'Authorization' => 'Bearer ' . $osm_api_token, 'Content-Type' => 'application/xml' ] ]); $newChangesetId = $changesetResponse->getBody()->getContents(); // 2. Modifier le nœud avec le nouveau changeset $xml = new \SimpleXMLElement(''); $node = $xml->addChild('node'); $node->addAttribute('id', $osm_object_id); $node->addAttribute('version', $version); $node->addAttribute('changeset', $newChangesetId); $node->addAttribute('lat', '49.6504926'); $node->addAttribute('lon', '-1.5722526'); // Ajouter les tags foreach ($tags as $key => $value) { if (!empty($key) && !empty($value)) { $tag = $node->addChild('tag'); $tag->addAttribute('k', htmlspecialchars($key, ENT_XML1)); $tag->addAttribute('v', htmlspecialchars($value, ENT_XML1)); } } // Debug du XML généré $xmlString = $xml->asXML(); var_dump($xmlString); $response = $client->put('https://api.openstreetmap.org/api/0.6/node/' . $osm_object_id, [ 'body' => $xmlString, 'headers' => [ 'Authorization' => 'Bearer ' . $osm_api_token, 'Content-Type' => 'application/xml' ] ]); // 3. Fermer le changeset $client->put('https://api.openstreetmap.org/api/0.6/changeset/' . $newChangesetId . '/close', [ 'headers' => [ 'Authorization' => 'Bearer ' . $osm_api_token ] ]); if ($response->getStatusCode() === 200) { $status = "Les tags ont été mis à jour avec succès"; } else { $status = "Erreur lors de la mise à jour des tags"; } } catch (\Exception $e) { $status = "Erreur lors de la communication avec l'API OSM: " . $e->getMessage(); // Debug de la réponse en cas d'erreur if (method_exists($e, 'getResponse')) { var_dump($e->getResponse()->getBody()->getContents()); } } } // après envoi on récupère les données $commerce = $this->get_osm_object_data($osm_object_id); return $this->render('public/view.html.twig', [ 'controller_name' => 'PublicController', 'commerce' => $commerce, 'status' => $status, 'mapbox_token' => $this->mapbox_token, 'maptiler_token' => $this->maptiler_token, ]); } #[Route('/request_email_to_modify/{osm_object_id}', name: 'app_public_request_email')] public function request_email($osm_object_id): Response { // TODO envoyer un email return $this->render('public/request_email.html.twig', [ 'controller_name' => 'PublicController', 'commerce_id' => $osm_object_id, ]); } }