Files
contao-leaflet-maps/src/Frontend/DataController.php

149 lines
3.6 KiB
PHP
Raw Normal View History

2015-01-07 10:33:10 +01:00
<?php
/**
2017-10-05 15:45:43 +02:00
* Leaflet maps for Contao CMS.
*
2016-10-11 10:40:15 +02:00
* @package contao-leaflet-maps
2015-01-07 10:33:10 +01:00
* @author David Molineus <david.molineus@netzmacht.de>
2017-10-11 15:00:48 +02:00
* @copyright 2014-2017 netzmacht David Molineus. All rights reserved.
2017-10-05 15:45:43 +02:00
* @license LGPL-3.0 https://github.com/netzmacht/contao-leaflet-maps/blob/master/LICENSE
2015-01-07 10:33:10 +01:00
* @filesource
*/
namespace Netzmacht\Contao\Leaflet\Frontend;
2015-01-07 10:33:10 +01:00
2015-01-27 00:02:17 +01:00
use Netzmacht\Contao\Leaflet\Filter\Filter;
2017-10-11 14:40:01 +02:00
use Netzmacht\Contao\Leaflet\Filter\FilterFactory;
2016-10-05 14:18:15 +02:00
use Netzmacht\Contao\Leaflet\MapProvider;
2015-01-07 10:33:10 +01:00
2015-01-12 19:03:29 +01:00
/**
* The data controller handles ajax request for sub data.
*
* @package Netzmacht\Contao\Leaflet\Frontend
*/
2015-01-07 10:33:10 +01:00
class DataController
{
/**
* The user input data.
2015-01-12 19:03:29 +01:00
*
* @var array
2015-01-07 10:33:10 +01:00
*/
private $input = [
'format' => 'geojson',
'type' => 'layer',
2015-01-27 00:02:17 +01:00
'id' => null,
'filter' => null,
'values' => null,
];
2016-10-06 08:26:57 +02:00
/**
2017-10-11 15:42:49 +02:00
* Debug mode.
2016-10-06 08:26:57 +02:00
*
* @var bool
*/
2017-10-11 15:42:49 +02:00
private $debugMode;
2015-01-07 10:33:10 +01:00
2017-10-11 14:40:01 +02:00
/**
* Filter factory.
*
* @var FilterFactory
*/
private $filterFactory;
2015-01-12 19:03:29 +01:00
/**
* Construct.
*
2017-10-11 14:40:01 +02:00
* @param FilterFactory $filterFactory Filter factory.
2017-10-11 15:42:49 +02:00
* @param bool $debugMode Debug mode.
2015-01-12 19:03:29 +01:00
*/
2017-10-11 15:42:49 +02:00
public function __construct(FilterFactory $filterFactory, $debugMode)
2015-01-07 10:33:10 +01:00
{
2017-10-11 15:42:49 +02:00
$this->debugMode = $debugMode;
2017-10-11 14:40:01 +02:00
$this->filterFactory = $filterFactory;
2015-01-07 10:33:10 +01:00
}
2015-01-12 19:03:29 +01:00
/**
* Execute the controller and create the data response.
*
2017-10-11 15:42:49 +02:00
* @param array $input The user input as array.
* @param MapProvider $mapProvider Map provider.
*
2015-01-12 19:03:29 +01:00
* @return void
* @throws \Exception If anything went wrong.
*/
2017-10-11 15:42:49 +02:00
public function execute(array $input, MapProvider $mapProvider)
2015-01-07 10:33:10 +01:00
{
$input = array_merge($this->input, $input);
2015-01-07 10:33:10 +01:00
try {
if ($input['filter']) {
2017-10-11 14:40:01 +02:00
$filter = $this->filterFactory->create($input['filter'], $input['values']);
2015-01-27 00:02:17 +01:00
} else {
$filter = null;
}
2017-10-11 15:42:49 +02:00
list($data, $error) = $this->loadData($mapProvider, $input['type'], $input['id'], $filter);
$this->encodeData($input['format'], $data);
2015-01-07 10:33:10 +01:00
} catch (\Exception $e) {
2017-10-11 15:42:49 +02:00
if ($this->debugMode) {
2015-01-15 15:30:16 +01:00
throw $e;
2015-01-07 10:33:10 +01:00
}
$error = true;
}
if ($error) {
header('HTTP/1.1 500 Internal Server Error');
}
}
/**
* Encode the data.
2015-01-12 19:03:29 +01:00
*
* @param string $format The requested format.
* @param mixed $data The given data.
*
* @return void
2015-01-07 10:33:10 +01:00
*/
public function encodeData($format, $data)
{
switch ($format) {
case 'geojson':
header('Content-Type: application/json');
echo json_encode($data, JSON_UNESCAPED_SLASHES);
break;
2015-01-12 19:03:29 +01:00
default:
// Blame the code sniffer.
2015-01-07 10:33:10 +01:00
}
}
/**
2015-01-12 19:03:29 +01:00
* Load the data.
*
2017-10-11 15:42:49 +02:00
* @param MapProvider $mapProvider Map provider.
* @param string $type The data type.
* @param mixed $dataId The data id.
* @param Filter $filter Optional request filter.
2015-01-07 10:33:10 +01:00
*
* @return array
*/
2017-10-11 15:42:49 +02:00
public function loadData(MapProvider $mapProvider, $type, $dataId, Filter $filter = null)
2015-01-07 10:33:10 +01:00
{
$error = false;
$data = null;
switch ($type) {
case 'layer':
2017-10-11 15:42:49 +02:00
$data = $mapProvider->getFeatureCollection($dataId, $filter);
2015-01-07 10:33:10 +01:00
break;
default:
$error = true;
return [$data, $error];
2015-01-07 10:33:10 +01:00
}
return [$data, $error];
2015-01-07 10:33:10 +01:00
}
}