mirror of
https://forge.chapril.org/tykayn/osm-commerces
synced 2025-06-20 01:44:42 +02:00
init symfony repo to modify a place without account
This commit is contained in:
commit
49ba369919
47 changed files with 11002 additions and 0 deletions
213
src/Controller/PublicController.php
Normal file
213
src/Controller/PublicController.php
Normal file
|
@ -0,0 +1,213 @@
|
|||
<?php
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use GuzzleHttp\Client;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
class PublicController extends AbstractController
|
||||
{
|
||||
private $mapbox_token = 'BVM2NRJuzQunWvXbTnzg';
|
||||
private $maptiler_token = 'BVM2NRJuzQunWvXbTnzg';
|
||||
|
||||
public function get_osm_object_data($osm_object_id = 12855459190)
|
||||
{
|
||||
|
||||
// TODO extraire ceci dans un service
|
||||
$object_id = "https://www.openstreetmap.org/api/0.6/node/".$osm_object_id;
|
||||
|
||||
$osm_object_data = [
|
||||
// "version"=> "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('<?xml version="1.0" encoding="UTF-8"?><osm version="0.6"></osm>');
|
||||
$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('<?xml version="1.0" encoding="UTF-8"?><osm version="0.6"></osm>');
|
||||
$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,
|
||||
]);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue