<?php
namespace App\Controller;
use App\Repository\AppsRepository;
use App\Repository\CategoriesRepository;
use http\Encoding\Stream\Debrotli;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ErrorHandler\Debug;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
#[Route('/api')]
class ApiController extends AbstractController
{
private function checkToken($token,ManagerRegistry $doctrine){
// schauen, ob Token in der Datenbank
$entityManager = $doctrine->getManager();
$qb = $entityManager->createQueryBuilder();
$qb->select('a')
->from('App\Entity\Tokens', 'a')
->where('a.token = ?1')
->setParameter(1, $token);
$query = $qb->getQuery();
$result = $query->getResult();
if ($result){
return $result[0]->getApp()->getId();
} else {
return false;
}
}
private function checkCors($referer,ManagerRegistry $doctrine){
// schauen, ob Token in der Datenbank
$entityManager = $doctrine->getManager();
$qb = $entityManager->createQueryBuilder();
$qb->select('a')
->from('App\Entity\AllowedWebsites', 'a')
->where('a.website = ?1')
->setParameter(1, $referer);
$query = $qb->getQuery();
$result = $query->getResult();
if ($result){
return $result[0]->getWebsite();
} else {
return false;
}
}
private function getCats(ManagerRegistry $doctrine){
// schauen, ob Token in der Datenbank
$entityManager = $doctrine->getManager();
$qb = $entityManager->createQueryBuilder();
$qb->select('a')
->from('App\Entity\Categories', 'a');
$query = $qb->getQuery();
$result = $query->getResult();
$allcats = [];
foreach($result as $r){
$allcats[intval($r->getId())] = $r->getTitle();
}
if ($result){
return $allcats;
} else {
return false;
}
}
private function getPlzCentroid($plz,ManagerRegistry $doctrine){
// schauen, ob Token in der Datenbank
$entityManager = $doctrine->getManager();
$qb = $entityManager->createQueryBuilder();
$qb->select('p')
->from('App\Entity\Plz', 'p')
->where('p.plz = ?1')
->setParameter(1, $plz);
$query = $qb->getQuery();
$result = $query->getResult();
if ($result){
return $result[0]->getCentroid();
} else {
return false;
}
}
private function checkFormat($format){
if(!in_array($format,array('json','geojson'))){
return false;
}
return true;
}
#[Route('/', name: 'app_api')]
public function index(): Response
{
return $this->redirectToRoute('app_login');
}
#[Route('/{token}/getappsettings', name: 'app_settings')]
public function app_settings($token,ManagerRegistry $doctrine,AppsRepository $appsRepository, CategoriesRepository $categoriesRepository): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
$app = $appsRepository->findOneById($appId);
$user = $app->getUser();
$labels = $user->getLabelConfig();
$private = $user->getFormPrivateConfig();
$required = $user->getFormRequiredConfig();
$popup = $user->getFormPopupConfig();
$fields = $user->getFormConfig();
$mode = $app->isOrderSwitch()?array_reverse($app->getListMode()):$app->getListMode();
$colors = [
'clusterColor' => $app->getClusterColor(),
'clusterTextColor' => $app->getClusterTextColor(),
];
$publicFields = [];
foreach($fields as $field){
if($private[$field] == 0){
$publicFields[] = [
'name' => $field,
'label' => $labels[$field],
'required' => $required[$field],
'popup' => $popup[$field]
];
}
}
$categories = $app->getCategories();
$cats = [];
foreach($categories as $cat){
$cats[] = [
'id' => $cat->getId(),
'val' => $cat->getTitle(),
'markerColor' => $cat->getMarkerColor()
];
}
$settings = array(
'legendTitle' => $app->getLegendTitle(),
'initialCenterLat' => $app->getCenterLat(),
'initialCenterLon' => $app->getCenterLon(),
'initialZoom' => $app->getZoom(),
'minZoom' => $app->getMinzoom(),
'maxZoom' => $app->getMaxzoom(),
'mapWidth' => $app->getMapwidth(),
'mapHeight' => $app->getMapheight(),
'distanceSteps' => explode(',',$app->getDistanceSteps()),
'showCatFilter' => $app->isShowCatFilter(),
'showZipSearch' => $app->isShownZipSearch(),
'categories' => $cats,
'colors' => $colors,
'form' => $publicFields,
'listMode' => $mode
);
$response->setData($settings);
return $response;
}
#[Route('/{token}/distance/{lon}/{lat}/{radius}/{cats}/{format}',defaults:['radius'=>1000000,'cats'=>'all','format'=>'geojson'], name: 'app_distance')]
public function bydistance($token,$lon,$lat,ManagerRegistry $doctrine,Request $request,$radius=1000000,$cats="all",$format='geojson'): Response
{
//Fehler abfangen
if(!preg_match('#\d+,*#',$cats)){
$cats = 'all';
}
if($request->query->has('format')){
$format = $request->query->get('format');
}
$allcats = $this->getCats($doctrine);
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
if(!$this->checkFormat($format)){
$response->setData(array( 'error' => 'format error: supported formats are json and geojson (Feature Collection) ' ));
return $response;
}
$andWhere= '';
$orderBy='distance';
$orderDir='asc';
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$catsWhere = 'AND (';
if($cats != 'all'){
$all = explode(',',$cats);
$i = 0;
foreach ($all as $c){
if ($i >= 1){
$catsWhere .= ' OR ';
}
$catsWhere .= "FIND_IN_SET('" . $c ."', (select GROUP_CONCAT(categories_id SEPARATOR ',') from places_categories where places_id = id))";
$i++;
}
}
$catsWhere .= ') ';
$sql = "SELECT id,title,st_astext(coord) as latlon,ST_Distance(ST_GeomFromText(\"POINT($lat $lon)\", 4326), coord ) as distance,
ST_Distance(ST_GeomFromText(\"POINT($lat $lon)\", 4326), coord )/1000 as distancekm, $lon as requestedLon,$lat as requestedLat, ST_Longitude(coord) as lon, ST_Latitude(coord) as lat,
address, zip, city, email1, email2,phone1,phone2,facebook, linkedin,twitter,person1,person2,www,
(select GROUP_CONCAT(categories_id SEPARATOR ',') from places_categories where places_id = id) as cats
from places left join places_apps on places.id = places_apps.places_id
where places_apps.apps_id=:appid ";
if ($cats != 'all'){
$sql .= $catsWhere;
}
$sql .= "having distance < :radius $andWhere order by $orderBy $orderDir";
$stmt = $conn->prepare($sql);
//$stmt->bindValue(':lon', $lon, \DOCTRINE\DBAL\TYPES);
//$stmt->bindValue(':lat', $lat, \PDO::PARAM_DECIMAL);
$stmt->bindValue(':appid', $appId, "integer");
$stmt->bindValue(':radius', $radius, "integer");
//dd($stmt);
$items = $stmt->execute()->fetchAll();
if ($format === 'json'){
$response->setData($items );
} elseif($format === 'geojson'){
$fc = array(
"type"=> "FeatureCollection",
"features" => array()
);
foreach($items as $item){
$feature=array(
"type" => "Feature",
"geometry"=> array(
"type"=>"Point",
"coordinates"=>[$item['lon'],$item['lat']]
),
"properties"=>array()
);
foreach($item as $k=>$v){
$feature["properties"][$k] = $v;
}
$cats = explode(',',$feature['properties']['cats']);
$cay =[];
//dump($cats);
if (count($cats) > 0){
foreach($cats as $k => $v){
if ($v > 0){
$cay[] = array (
'id' => $v,
'name' => $allcats[$v]
);
}
}
}
$feature['properties']['catsArray'] = $cay;
$fc['features'][] = $feature;
}
//dd('hallo');
$response->setData($fc);
} else {
$response->setData(array( 'error' => 'program error' ));
}
return $response;
}
#[Route('/{token}/plzdistance/{plz}/{radius}/{cats}/{format}',defaults:['radius'=>1000000,'cats'=>'all','format'=>'geojson'], name: 'app_plz_distance')]
public function plzbydistance($token,$plz,ManagerRegistry $doctrine,Request $request,$radius=1000000,$cats="all",$format='geojson')
{
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$sql = "SELECT ST_Longitude(centroid) as lon, ST_Latitude(centroid) as lat
from plz
where plz=:plz ";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':plz', $plz, "string");
$items = $stmt->execute()->fetchAll();
$lon = $items[0]['lon'];
$lat = $items[0]['lat'];
return $this->bydistance($token,$lon,$lat,$doctrine,$request,$radius,$cats,$format);
}
#[Route('/{token}/cats', name: 'app_cats')]
public function getcats4app($token,ManagerRegistry $doctrine,Request $request,AppsRepository $appsRepository): Response
{
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
}
$app = $appsRepository->findOneById($appId);
$categories = $app->getCategories();
$return = [];
foreach($categories as $cat){
$return[] = [
'id' => $cat->getId(),
'val' => $cat->getTitle()
];
}
$response = new JsonResponse();
$response->setData($return);
return $response;
}
#[Route('/{token}/contains/{area}/{resolution}',defaults:['resolution'=>'low'], name: 'app_contains')]
public function areacontains($token,$area,$resolution,ManagerRegistry $doctrine,Request $request): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
$format = 'json'; // Default
$resolution = $resolution=='low'?'low':'middle';
$dbcol = $resolution=='low'?'geom200':'geom20';
if($request->query->has('format')){
$format = $request->query->get('format');
}
$response = new JsonResponse();
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$sql = "SELECT * FROM places WHERE ST_WITHIN(coord,(select $dbcol from area where id=:id))";
$sql = "SELECT id,title,st_astext(coord) as latlon, ST_Longitude(coord) as lon, ST_Latitude(coord) as lat,
address, zip, city, email1, email2,phone1,phone2,facebook, linkedin,twitter,person1,person2,www,
(select GROUP_CONCAT(categories_id SEPARATOR ',') from places_categories where places_id = id) as cats
from places left join places_apps on places.id = places_apps.places_id
where places_apps.apps_id=:appid and ST_WITHIN(coord,(select $dbcol from area where id=:id))";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':id', $area, "integer");
$stmt->bindValue(':appid', $appId, "integer");
$items = $stmt->execute()->fetchAll();
if ($format === 'json'){
$response->setData($items);
} elseif($format === 'geojson'){
$fc = array(
"type"=> "FeatureCollection",
"features" => array()
);
foreach($items as $item){
$feature=array(
"type" => "Feature",
"geometry"=> array(
"type"=>"Point",
"coordinates"=>[$item['lon'],$item['lat']]
),
"properties"=>array()
);
foreach($item as $k=>$v){
$feature["properties"][$k] = $v;
}
$cats = explode(',',$feature['properties']['cats']);
$feature['properties']['catsArray'] = $cats;
$fc['features'][] = $feature;
}
$response->setData($fc);
} else {
$response->setData(array( 'error' => 'program error' ));
}
return $response;
}
#[Route('/{token}/plzcontains/{plz}', name: 'app_plzcontains')]
public function plzcontains($token,$plz,ManagerRegistry $doctrine,Request $request): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
$format = 'json'; // Default
if($request->query->has('format')){
$format = $request->query->get('format');
}
$response = new JsonResponse();
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$sql = "SELECT * FROM places WHERE ST_WITHIN(coord,(select geom from plz where plz=:plz))";
$sql = "SELECT id,title,st_astext(coord) as latlon, ST_Longitude(coord) as lon, ST_Latitude(coord) as lat,
address, zip, city, email1, email2,phone1,phone2,facebook, linkedin,twitter,person1,person2,www,
(select GROUP_CONCAT(categories_id SEPARATOR ',') from places_categories where places_id = id) as cats
from places left join places_apps on places.id = places_apps.places_id
where places_apps.apps_id=:appid and ST_WITHIN(coord,(select geom from plz where plz=:plz))";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':plz', $plz, "string");
$stmt->bindValue(':appid', $appId, "integer");
$items = $stmt->execute()->fetchAll();
if ($format === 'json'){
$response->setData($items);
} elseif($format === 'geojson'){
$fc = array(
"type"=> "FeatureCollection",
"features" => array()
);
foreach($items as $item){
$feature=array(
"type" => "Feature",
"geometry"=> array(
"type"=>"Point",
"coordinates"=>[$item['lon'],$item['lat']]
),
"properties"=>array()
);
foreach($item as $k=>$v){
$feature["properties"][$k] = $v;
}
$cats = explode(',',$feature['properties']['cats']);
$feature['properties']['catsArray'] = $cats;
$fc['features'][] = $feature;
}
$response->setData($fc);
} else {
$response->setData(array( 'error' => 'program error' ));
}
return $response;
}
#[Route('/{token}/plzcentroid/{plz}/{radius}/{format}',defaults:['radius'=>50000], name: 'app_plzcentroid')]
public function plzcentroid($token,$plz,ManagerRegistry $doctrine,Request $request,$radius=50000,$format='geojson'): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
if($request->query->has('format')){
$format = $request->query->get('format');
}
$response = new JsonResponse();
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$plzCentroid = $this->getPlzCentroid(trim($plz),$doctrine);
$x = $plzCentroid->getX();
$y = $plzCentroid->getY();
$srid = $plzCentroid->getSrid()==null?4326:$plzCentroid->getSrid();
$plzCentroid = 'ST_GeomFromText("POINT(' .$x .' ' .$y.')", ' . $srid ;
$sql = "SELECT id,title,st_astext(coord) as latlon,ST_Distance($plzCentroid), coord ) as distance,
ST_Distance($plzCentroid), coord )/1000 as distancekm, $x as requestedLon, $y as requestedLat, ST_Longitude(coord) as lon, ST_Latitude(coord) as lat,
address, zip, city, email1, email2,phone1,phone2,facebook, linkedin,twitter,person1,person2,www,
(select GROUP_CONCAT(categories_id SEPARATOR ',') from places_categories where places_id = id) as cats
from places left join places_apps on places.id = places_apps.places_id
where places_apps.apps_id=:appid
having distance < :radius order by distance asc";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':appid', $appId, "integer");
$stmt->bindValue(':radius', $radius, "integer");
$items = $stmt->execute()->fetchAll();
if ($format === 'json'){
$response->setData($items);
} elseif($format === 'geojson'){
$fc = array(
"type"=> "FeatureCollection",
"features" => array()
);
foreach($items as $item){
$feature=array(
"type" => "Feature",
"geometry"=> array(
"type"=>"Point",
"coordinates"=>[$item['lon'],$item['lat']]
),
"properties"=>array()
);
foreach($item as $k=>$v){
$feature["properties"][$k] = $v;
}
$cats = explode(',',$feature['properties']['cats']);
$feature['properties']['catsArray'] = $cats;
$fc['features'][] = $feature;
}
$response->setData($fc);
} else {
$response->setData(array( 'error' => 'program error' ));
}
return $response;
}
#[Route('/{token}/plz4city/{city}',defaults:[], name: 'app_plzcity')]
public function plzcity($token,$city,ManagerRegistry $doctrine,Request $request): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
$format = 'json'; // Default
$response = new JsonResponse();
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$search = explode(' ',$city);
if(count($search)==1){
$regexp = $search[0].'.*';
}
if(count($search)==2){
$regexp = $search[0] .'.+'.$search[1].'.*';
} elseif(count($search)==3){
$regexp = $search[0] .'.+'.$search[1].'.+'.$search[2].'.*';
} elseif(count($search)==4){
$regexp = $search[0] .'.+'.$search[1].'.+'.$search[2].'.+'.$search[3].'.*';
} else {
$response->setData(array( 'error' => 'too much tokens for city' ));
}
$sql = 'select plz,name from plz_complete where REGEXP_LIKE(name,"^' . $regexp .'") order by name,plz asc';
//dd($sql);
$stmt = $conn->prepare($sql);
//$stmt->bindValue(':city', $city, "string");
$items = $stmt->execute()->fetchAll();
if ($format === 'json'){
$response->setData($items);
} else {
$response->setData(array( 'error' => 'program error' ));
}
return $response;
}
#[Route('/{token}/pointinfo/{lon}/{lat}', name: 'app_pointinfo')]
public function pointinfo($token,$lon,$lat,ManagerRegistry $doctrine,Request $request): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$sql = "SELECT maptype_id,title from area where ST_WITHIN(ST_GeomFromText(\"POINT($lat $lon)\", 4326),geom20)
UNION select 4,plz from plz where ST_WITHIN(ST_GeomFromText(\"POINT($lat $lon)\", 4326),geom) and LENGTH(plz) = 5";
$sql = "select distinct p.plz,p.title,c.landkreis,c.bundesland,c.bundesland_kurz from plz p left join plz_complete c on p.plz=c.plz where p.type=5 and ST_WITHIN(ST_GeomFromText(\"POINT($lat $lon)\", 4326),p.geom)";
$stmt = $conn->prepare($sql);
//$stmt->bindValue(':plz', $plz, "string");
//$stmt->bindValue(':appid', $appId, "integer");
$items = $stmt->execute()->fetchAll();
/*foreach($items as $item){
$ay['plz'] =
/*if($item['maptype_id']===1){
$ay['land']=$item['title'];
}
if($item['maptype_id']===2){
$ay['landkreis']=$item['title'];
}
if($item['maptype_id']===3){
$ay['gemeinde']=$item['title'];
}
if($item['maptype_id']===4){
$ay['plz']=$item['title'];
}
}*/
$response->setData($items[0]);
return $response;
}
#[Route('/{token}/city/{fragment}/{limit}',defaults:['limit'=>50000], name: 'app_city')]
public function city($token,$fragment,$limit,ManagerRegistry $doctrine,Request $request): Response
{
$referer = (string) $request->headers->get('referer'); // get the referer, it can be empty!
//$refererStr = u($referer);
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
// EntityManager holen
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$select = array();
// Erst die suchen die genau passen
$sql = "SELECT name,plz,landkreis FROM plz_complete where name = :cityexact group by plz order by name,plz COLLATE utf8mb4_german2_ci limit :limit ";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':cityexact', urldecode(trim($fragment)), "string");
$stmt->bindValue(':limit', $limit, "integer");
$items = $stmt->executeQuery()->fetchAll();
$check =[];
$final = array();
//if(count($items)>1 and strlen(urldecode(trim($fragment))) > 3){
if(count($items)>1){
foreach ($items as $item){
$check[$item['landkreis']][] = $item['plz'];
}
// jetzt entscheiden welche Stadt genommen wird (die, die am meisten PLZ hat)
foreach ($check as $k => $v) {
$ct[$k] = count($check[$k]);
}
arsort ($ct);
foreach ($ct as $k=>$v){
$first = $check[$k][0];
$last = $check[$k][$v - 1];
if ($first == $last){
$plzToShow = "(PLZ $first)";
} else {
$plzToShow = "(PLZ $first-$last)";
}
$replace=ucfirst($fragment);
$name = preg_replace('/(' . $fragment .')/i',"<mark>$replace</mark>",$fragment);
$final[] = array('name' => $name . ' (' . $k .')', 'plz' => $plzToShow);
}
}
// Jetzt die, die mit der Eingabe anfangen
$sql = "SELECT name,plz,landkreis FROM plz_complete where name like :city and name != :name group by landkreis,plz order by name,plz COLLATE utf8mb4_german2_ci limit :limit ";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':city',urldecode(trim($fragment)) ."%", "string");
$stmt->bindValue(':limit', $limit, "integer");
$stmt->bindValue(':name',urldecode(trim($fragment)),"string");
$items = $stmt->execute()->fetchAll();
$check =[];
foreach ($items as $item){
$check[$item['landkreis']][] = array('plz'=>$item['plz'],'ort'=>$item['name']);
}
$ct=[];
foreach ($check as $k => $v) {
$ct[$k] = array('anzahl'=>count($check[$k]),'ort'=>$v[0]['ort']);
}
arsort ($ct);
foreach ($ct as $k=>$v){
$first = $check[$k][0]['plz'];
$last = $check[$k][$v['anzahl'] - 1]['plz'];
$ort = $check[$k][0]['ort'];
if ($first == $last){
$plzToShow = "(PLZ $first)";
} else {
$plzToShow = "(PLZ $first-$last)";
}
$name = preg_replace('/(' . $fragment .')/i',"<mark>$1</mark>",$ort);
$final[] = array('name' => $name, 'plz' => $plzToShow);
}
/*$i=0;
foreach($items as $item){
//$select[$item['name']]['maxPLZ'] = null;
if(array_key_exists($item['name'],$select)){
$select[$item['name']]['maxPLZ']=$item['plz'];
$i++;
$select[$item['name']]['plzCnt']=$i;
} else {
$i=1;
$select[$item['name']]['name']=$item['name'];
$select[$item['name']]['minPLZ']=$item['plz'];
$select[$item['name']]['plzCnt']=$i;
}
}*/
// Jetzt der Rest
$sql = "SELECT name,plz,landkreis FROM plz_complete where name like :city and name not like :city2 and name != :name group by landkreis,plz order by name,plz COLLATE utf8mb4_german2_ci limit :limit ";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':city', '%' . urldecode(trim($fragment)) ."%", "string");
$stmt->bindValue(':city2', urldecode(trim($fragment)) ."%", "string");
$stmt->bindValue(':limit', $limit, "integer");
$stmt->bindValue(':name',urldecode(trim($fragment)),"string");
$items = $stmt->execute()->fetchAll();
$check =[];
foreach ($items as $item){
$check[$item['landkreis']][] = array('plz'=>$item['plz'],'ort'=>$item['name']);
}
$ct=[];
foreach ($check as $k => $v) {
$ct[$k] = array('anzahl'=>count($check[$k]),'ort'=>$v[0]['ort']);
}
arsort ($ct);
foreach ($ct as $k=>$v){
$first = $check[$k][0]['plz'];
$last = $check[$k][$v['anzahl'] - 1]['plz'];
$ort = $check[$k][0]['ort'];
if ($first == $last){
$plzToShow = "(PLZ $first)";
} else {
$plzToShow = "(PLZ $first-$last)";
}
$name = preg_replace('/(' . $fragment .')/i',"<mark>$1</mark>",$ort);
$final[] = array('name' => $name, 'plz' => $plzToShow);
}
$response->setData($final);
return $response;
}
#[Route('/{token}/cityplz/{city}/{minplz}/{maxplz}',defaults:['limit'=>50000,'minplz'=>0,'maxplz'=>100000], name: 'app_cityplz')]
public function cityplz($token,$city,$minplz,$maxplz,$limit,ManagerRegistry $doctrine,Request $request): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
if (preg_match('/\D+ \(.+\)/',urldecode(trim($city)))){
// Beispiel $city = "Frankfurt (Oder)"
$pattern = str_replace([' (',')'],['%','%'],urldecode(trim($city)));
$sql = "SELECT ST_AsGeoJSON(geom) geom,plz.plz FROM plz_complete complete left join plz on complete.plz = plz.plz where complete.name = :city and (cast(plz.plz as UNSIGNED)>=:plzmin and cast(plz.plz as UNSIGNED)<=:plzmax) COLLATE utf8mb4_german2_ci;";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':city', $pattern, "string");
$stmt->bindValue(':plzmin', $minplz, "integer");
$stmt->bindValue(':plzmax', $maxplz, "integer");
/*$sql = "SELECT ST_AsGeoJSON(geom) geom,plz FROM plz where title like :city and (cast(plz as UNSIGNED)>=:plzmin and cast(plz as UNSIGNED)<=:plzmax)";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':city', $pattern, "string");
$stmt->bindValue(':plzmin', $minplz, "integer");
$stmt->bindValue(':plzmax', $maxplz, "integer");*/
} else {
//$sql = "SELECT ST_AsGeoJSON(geom) geom,plz FROM plz where (title = :city or title like :city2 or title like :city3) and (cast(plz as UNSIGNED)>=:plzmin and cast(plz as UNSIGNED)<=:plzmax) ";
$sql = "SELECT ST_AsGeoJSON(geom) geom,plz.plz FROM plz_complete complete left join plz on complete.plz = plz.plz where (complete.name = :city or complete.name like :city2 or complete.name like :city3) and (cast(plz.plz as UNSIGNED)>=:plzmin and cast(plz.plz as UNSIGNED)<=:plzmax) COLLATE utf8mb4_german2_ci;";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':city', urldecode(trim($city)), "string");
$stmt->bindValue(':city2', urldecode(trim($city)) .' %', "string");
$stmt->bindValue(':city3', urldecode(trim($city)) .'-%', "string");
$stmt->bindValue(':plzmin', $minplz, "integer");
$stmt->bindValue(':plzmax', $maxplz, "integer");
}
$items = $stmt->execute()->fetchAll();
$fc = array(
"type"=> "FeatureCollection",
"features" => array()
);
foreach($items as $item){
$geomArray = json_decode($item['geom'],true);
$feature=array(
"type" => "Feature",
"geometry"=> array(
"type"=>$geomArray['type'],
"coordinates"=>$geomArray['coordinates']
),
"properties"=>array('plz'=>$item['plz'])
);
$fc['features'][] = $feature;
}
$response->setData($fc);
return $response;
}
#[Route('/{token}/autoplz/{fragment}',defaults:[], name: 'app_autoplz')]
public function autoplz($token,$fragment,ManagerRegistry $doctrine,Request $request): Response
{
$response = new JsonResponse();
if($this->checkToken($token,$doctrine)>0){
$appId = $this->checkToken($token,$doctrine);
} else {
$response->setData(array( 'error' => 'token error - please contact Webmaster' ));
return $response;
}
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$sql = "SELECT concat(plz,' ',title) plz FROM plz where plz like :plz and title IS NOT NULL order by plz";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':plz', urldecode(trim($fragment)) . '%', "string");
$items = $stmt->execute()->fetchAll();
$response->setData($items);
return $response;
}
#[Route('/city4plz/{plz}',defaults:[], name: 'app_city4plz')]
public function city4plz($plz,ManagerRegistry $doctrine,Request $request): Response
{
$response = new JsonResponse();
if($this->getUser()){
$entityManager = $doctrine->getManager();
$conn = $entityManager->getConnection();
$sql = "SELECT title FROM plz where plz = :plz and title IS NOT NULL order by plz";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':plz', urldecode(trim($plz)), "string");
$items = $stmt->execute()->fetchAll();
$response->setData($items);
} else {
$response->setData('unauthorized');
}
return $response;
}
//
}