Revize 03c02899
Přidáno uživatelem Jakub Vašta před téměř 5 roky(ů)
website/composer.json | ||
---|---|---|
15 | 15 |
"symfony/framework-bundle": "5.0.*", |
16 | 16 |
"symfony/twig-pack": "*", |
17 | 17 |
"symfony/yaml": "5.0.*", |
18 |
"symfony/asset": "*" |
|
18 |
"symfony/asset": "*", |
|
19 |
"symfony/form" : "*" |
|
19 | 20 |
}, |
20 | 21 |
"require-dev": { |
21 | 22 |
"friendsofphp/php-cs-fixer": "^2.16", |
website/config/services.yaml | ||
---|---|---|
29 | 29 |
# add more service definitions when explicit configuration is needed |
30 | 30 |
# please note that last definitions always *replace* previous ones |
31 | 31 |
|
32 |
App\OpenData\OpenDataManager: ~
|
|
32 |
App\OpenData\OpenDataManager: ~ |
|
33 | 33 |
App\OpenData\IOpenDataManager: '@App\OpenData\OpenDataManager' |
34 |
App\Form\Type\DataSetType: ~ |
website/public/js/zcu-heatmap.js | ||
---|---|---|
1 | 1 |
var map; |
2 |
var heatmapLayer = null; |
|
3 |
|
|
2 | 4 |
var startX = 49.7248; |
3 | 5 |
var startY = 13.3521; |
4 | 6 |
var startZoom = 17; |
... | ... | |
57 | 59 |
}, 400); |
58 | 60 |
} |
59 | 61 |
|
62 |
function showHeatmap(route, date) { |
|
60 | 63 |
|
61 |
function showHeatmap(route) { |
|
62 | 64 |
$.ajax({ |
63 | 65 |
type: "POST", |
64 |
url: route, |
|
66 |
url: route + date,
|
|
65 | 67 |
success: function(result) { |
66 | 68 |
drawHeatmap(result); |
67 | 69 |
} |
... | ... | |
70 | 72 |
|
71 | 73 |
|
72 | 74 |
function drawHeatmap(points) { |
75 |
|
|
76 |
// Todo still switched |
|
73 | 77 |
points = points.map(function (p) { return [p['y'], p['x'], p['number']]; }); |
78 |
if (heatmapLayer != null) { |
|
79 |
mymap.removeLayer(heatmapLayer); |
|
80 |
} |
|
81 |
heatmapLayer = L.heatLayer(points).addTo(mymap), draw = true; |
|
82 |
// var heat_01 = ... |
|
83 |
// on background map.addLayer(heat_01) -> map.removeLayer(heat_01); |
|
84 |
} |
|
74 | 85 |
|
75 |
L.heatLayer(points).addTo(map), draw = true; |
|
76 |
} |
|
86 |
function checkDataSetsAvailability(route) { |
|
87 |
|
|
88 |
var parts = $('#date').val().split('-'); |
|
89 |
|
|
90 |
$.ajax({ |
|
91 |
type: "POST", |
|
92 |
// Todo it might be good idea to change db collections format |
|
93 |
url: route + '/' + parts[2] + parts[1] + parts[0], |
|
94 |
success: function(result) { |
|
95 |
updateAvailableDataSets(result); |
|
96 |
} |
|
97 |
}); |
|
98 |
} |
|
99 |
|
|
100 |
function updateAvailableDataSets(available) { |
|
101 |
|
|
102 |
var options; |
|
103 |
for (i = 0; i < available.length; i++) { |
|
104 |
options += '<options value="' + i + '">' + available[i] + '</option>\n'; |
|
105 |
} |
|
106 |
|
|
107 |
$('#types').empty().append(options); |
|
108 |
|
|
109 |
} |
website/src/Controller/HeatmapController.php | ||
---|---|---|
2 | 2 |
|
3 | 3 |
namespace App\Controller; |
4 | 4 |
|
5 |
use App\Entity\DataSet; |
|
6 |
use App\Form\Type\DataSetType; |
|
5 | 7 |
use App\OpenData\IOpenDataManager; |
8 |
use Symfony\Component\HttpFoundation\Request; |
|
6 | 9 |
use Symfony\Component\Routing\Annotation\Route; |
7 | 10 |
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; |
8 | 11 |
|
... | ... | |
10 | 13 |
/** |
11 | 14 |
* @Route("/heatmap", name="heatmap") |
12 | 15 |
*/ |
13 |
public function index() { |
|
14 |
return $this->render('heatmap.html.twig'); |
|
16 |
public function index(Request $request) { |
|
17 |
$dataSet = new DataSet(); |
|
18 |
|
|
19 |
$form = $this->createForm(DataSetType::class, $dataSet); |
|
20 |
$form->handleRequest($request); |
|
21 |
|
|
22 |
// Todo validation |
|
23 |
// $form->isValid() |
|
24 |
$dataSet = $form->getData(); |
|
25 |
if ($form->isSubmitted()) { |
|
26 |
$dataSet = $form->getData(); |
|
27 |
// Todo do something |
|
28 |
} |
|
29 |
|
|
30 |
return $this->render( |
|
31 |
'heatmap.html.twig', |
|
32 |
[ |
|
33 |
'form' => $form->createView(), |
|
34 |
] |
|
35 |
); |
|
15 | 36 |
} |
16 | 37 |
|
17 | 38 |
/** |
... | ... | |
20 | 41 |
public function opendata(IOpenDataManager $manager, $collectionName) { |
21 | 42 |
return $this->json($manager->getCollectionDataByName($collectionName)); |
22 | 43 |
} |
44 |
|
|
45 |
/** |
|
46 |
* @Route("heatmap/available/{date}", name="available") |
|
47 |
*/ |
|
48 |
public function availableDatasets(IOpenDataManager $manager, $date = '01012020') { |
|
49 |
return $this->json($manager->getAvailableCollectionsByDay($date)); |
|
50 |
} |
|
23 | 51 |
} |
website/src/Entity/DataSet.php | ||
---|---|---|
1 |
<?php |
|
2 |
|
|
3 |
namespace App\Entity; |
|
4 |
|
|
5 |
//Todo some checks |
|
6 |
class DataSet { |
|
7 |
protected $time; |
|
8 |
protected $date; |
|
9 |
protected $type; |
|
10 |
|
|
11 |
public function setTime($time) { |
|
12 |
$this->time = $time; |
|
13 |
} |
|
14 |
|
|
15 |
public function getTime() { |
|
16 |
return $this->time; |
|
17 |
} |
|
18 |
|
|
19 |
public function setDate($date) { |
|
20 |
$this->date = $date; |
|
21 |
} |
|
22 |
|
|
23 |
public function getDate() { |
|
24 |
return $this->date; |
|
25 |
} |
|
26 |
|
|
27 |
public function setType($type) { |
|
28 |
$this->type = $type; |
|
29 |
} |
|
30 |
|
|
31 |
public function getType() { |
|
32 |
return $this->type; |
|
33 |
} |
|
34 |
} |
website/src/Form/DataSetType.php | ||
---|---|---|
1 |
<?php |
|
2 |
|
|
3 |
namespace App\Form\Type; |
|
4 |
|
|
5 |
use App\Utils\Utils; |
|
6 |
use App\Entity\DataSet; |
|
7 |
use App\OpenData\IOpenDataManager; |
|
8 |
use Symfony\Component\Form\FormView; |
|
9 |
use Symfony\Component\Form\AbstractType; |
|
10 |
use Symfony\Component\Form\FormInterface; |
|
11 |
use Symfony\Component\Form\FormBuilderInterface; |
|
12 |
use Symfony\Component\OptionsResolver\OptionsResolver; |
|
13 |
use Symfony\Component\Form\Extension\Core\Type\TextType; |
|
14 |
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; |
|
15 |
use Symfony\Component\Form\Extension\Core\Type\SubmitType; |
|
16 |
|
|
17 |
class DataSetType extends AbstractType { |
|
18 |
private $manager; |
|
19 |
|
|
20 |
public function __construct(IOpenDataManager $manager) { |
|
21 |
$this->manager = $manager; |
|
22 |
} |
|
23 |
|
|
24 |
public function buildForm(FormBuilderInterface $builder, array $options) { |
|
25 |
$builder |
|
26 |
->add('date', TextType::class) |
|
27 |
->add('time', ChoiceType::class, [ |
|
28 |
'choices' => [ |
|
29 |
'0:00-1:00' => 0, |
|
30 |
'1:00-2:00' => 1, |
|
31 |
'2:00-3:00' => 2, |
|
32 |
'3:00-4:00' => 3, |
|
33 |
'4:00-5:00' => 4, |
|
34 |
'5:00-6:00' => 5, |
|
35 |
'6:00-7:00' => 6, |
|
36 |
'7:00-8:00' => 7, |
|
37 |
'8:00-9:00' => 8, |
|
38 |
'9:00-10:00' => 9, |
|
39 |
'10:00-11:00' => 10, |
|
40 |
'11:00-12:00' => 11, |
|
41 |
'12:00-13:00' => 12, |
|
42 |
'13:00-14:00' => 13, |
|
43 |
'14:00-15:00' => 14, |
|
44 |
'15:00-16:00' => 15, |
|
45 |
'16:00-17:00' => 16, |
|
46 |
'17:00-18:00' => 17, |
|
47 |
'18:00-19:00' => 18, |
|
48 |
'19:00-20:00' => 19, |
|
49 |
'20:00-21:00' => 20, |
|
50 |
'21:00-22:00' => 21, |
|
51 |
'22:00-23:00' => 22, |
|
52 |
'23:00-0:00' => 23, |
|
53 |
], |
|
54 |
]) |
|
55 |
->add('type', ChoiceType::class, [ |
|
56 |
'choices' => Utils::prepareDatasetsNames($this->manager->getAvailableCollections()), |
|
57 |
]) |
|
58 |
->add('submit', SubmitType::class); |
|
59 |
} |
|
60 |
|
|
61 |
public function configureOptions(OptionsResolver $resolver) { |
|
62 |
$resolver->setDefaults([ |
|
63 |
'data_class' => DataSet::class, |
|
64 |
]); |
|
65 |
} |
|
66 |
|
|
67 |
// public function buildView(FormView $view, Forminterface $form, array $options) { |
|
68 |
|
|
69 |
// } |
|
70 |
} |
website/src/IOpenDataManager.php | ||
---|---|---|
4 | 4 |
|
5 | 5 |
interface IOpenDataManager { |
6 | 6 |
public function getCollectionDataByName($name); |
7 |
|
|
8 |
public function getAvailableCollections(); |
|
9 |
|
|
10 |
public function getAvailableCollectionsByDay($date); |
|
7 | 11 |
} |
website/src/OpenDataManager.php | ||
---|---|---|
25 | 25 |
|
26 | 26 |
return $openData->toArray(); |
27 | 27 |
} |
28 |
|
|
29 |
public function getAvailableCollections() { |
|
30 |
$openData = $this->manager->executeQuery('open-data-db.DATASETS', new Query([], ['projection' => ['name' => 1, '_id' => 0]])); |
|
31 |
|
|
32 |
$openData->setTypeMap([ |
|
33 |
'array' => 'array', |
|
34 |
'document' => 'array', |
|
35 |
'root' => 'array', |
|
36 |
]); |
|
37 |
|
|
38 |
return $openData->toArray(); |
|
39 |
} |
|
40 |
|
|
41 |
public function getAvailableCollectionsByDay($date) { |
|
42 |
$availableInDate = []; |
|
43 |
$available = $this->getAvailableCollections(); |
|
44 |
$index = 0; |
|
45 |
foreach ($available as $key => $value) { |
|
46 |
$openData = $this->manager->executeQuery('open-data-db.'.$value['name'].$date, new Query([], [])); |
|
47 |
|
|
48 |
$openData->setTypeMap([ |
|
49 |
'array' => 'array', |
|
50 |
'document' => 'array', |
|
51 |
'root' => 'array', |
|
52 |
]); |
|
53 |
|
|
54 |
if (false == empty($openData->toArray())) { |
|
55 |
$availableInDate[$value['name']] = $index++; |
|
56 |
} |
|
57 |
} |
|
58 |
|
|
59 |
return $availableInDate; |
|
60 |
} |
|
28 | 61 |
} |
website/src/Utils/Utils.php | ||
---|---|---|
1 |
<?php |
|
2 |
|
|
3 |
namespace App\Utils; |
|
4 |
|
|
5 |
class Utils { |
|
6 |
public static function prepareDatasetsNames($datasets) { |
|
7 |
$names; |
|
8 |
|
|
9 |
$index = 0; |
|
10 |
foreach ($datasets as $key => $value) { |
|
11 |
$names[$value['name']] = $index++; |
|
12 |
} |
|
13 |
|
|
14 |
return $names; |
|
15 |
} |
|
16 |
} |
website/templates/heatmap.html.twig | ||
---|---|---|
21 | 21 |
</button> |
22 | 22 |
|
23 | 23 |
<div class="collapse navbar-collapse" id="navigation"> |
24 |
<form method="get"> |
|
24 |
|
|
25 |
{{ form_start(form) }} |
|
26 |
|
|
25 | 27 |
<ul class="navbar-nav"> |
26 | 28 |
<li class="nav-item"> |
27 |
<label for="date">Vyberte datum</label> |
|
28 |
<input type="date" name="date" id="date" class="form-control" required> |
|
29 |
{{ form_label(form.date, 'Vyberte datum') }} |
|
30 |
{{ |
|
31 |
form_widget(form.date, |
|
32 |
{ |
|
33 |
'type' : 'date', |
|
34 |
'id' : 'date', |
|
35 |
'attr' : { |
|
36 |
'class' : 'form-control', |
|
37 |
'onChange' : 'checkDataSetsAvailability("' ~ path('available') ~ '")' |
|
38 |
} |
|
39 |
}) |
|
40 |
}} |
|
29 | 41 |
</li> |
30 | 42 |
|
31 | 43 |
<li class="nav-item"> |
32 |
<label for="hour">Vyberte čas</label> |
|
33 |
<select name="hour" id="hour" class="custom-select"> |
|
34 |
<option value="0">0:00–1:00</option> |
|
35 |
<option value="1">1:00–2:00</option> |
|
36 |
<option value="2">2:00–3:00</option> |
|
37 |
<option value="3">3:00–4:00</option> |
|
38 |
<option value="4">4:00–5:00</option> |
|
39 |
<option value="5">5:00–6:00</option> |
|
40 |
<option value="6">6:00–7:00</option> |
|
41 |
<option value="7">7:00–8:00</option> |
|
42 |
<option value="8">8:00–9:00</option> |
|
43 |
<option value="9">9:00–10:00</option> |
|
44 |
<option value="10">10:00–11:00</option> |
|
45 |
<option value="11">11:00–12:00</option> |
|
46 |
<option value="12">12:00–13:00</option> |
|
47 |
<option value="13">13:00–14:00</option> |
|
48 |
<option value="14">14:00–15:00</option> |
|
49 |
<option value="15">15:00–16:00</option> |
|
50 |
<option value="16">16:00–17:00</option> |
|
51 |
<option value="17">17:00–18:00</option> |
|
52 |
<option value="18">18:00–19:00</option> |
|
53 |
<option value="19">19:00–20:00</option> |
|
54 |
<option value="20">20:00–21:00</option> |
|
55 |
<option value="21">21:00–22:00</option> |
|
56 |
<option value="22">22:00–23:00</option> |
|
57 |
<option value="23">23:00–0:00</option> |
|
58 |
</select> |
|
44 |
{{ form_label(form.date, 'Vyberte čas') }} |
|
45 |
{{ |
|
46 |
form_widget(form.time, { |
|
47 |
'attr' : { |
|
48 |
'class' : "custom-select" |
|
49 |
} |
|
50 |
}) |
|
51 |
}} |
|
59 | 52 |
</li> |
60 | 53 |
|
61 | 54 |
<li class="nav-item"> |
62 |
<label for="dataset">Vybrané datové sady</label> |
|
63 |
<select name="dataset" id="dataset" class="custom-select"> |
|
64 |
<option value="internet">Wi-Fi a drátové připojení</option> |
|
65 |
<option value="jis">JIS snímače</option> |
|
66 |
<option value="scoobikes">Koloběžky</option> |
|
67 |
</select> |
|
55 |
{{ form_label(form.date, 'Vybrané datové sady') }} |
|
56 |
{{ |
|
57 |
form_widget(form.type, { |
|
58 |
'id' : 'types', |
|
59 |
'attr' : { |
|
60 |
'class' : "custom-select" |
|
61 |
} |
|
62 |
}) |
|
63 |
}} |
|
68 | 64 |
</li> |
69 | 65 |
|
70 | 66 |
<li class="nav-item"> |
71 |
<button class="btn btn-secondary" type="submit"> |
|
72 |
Potvrdit výběr |
|
73 |
</button> |
|
67 |
{{ |
|
68 |
form_widget(form.submit, |
|
69 |
{ |
|
70 |
'label' : 'Potvrdit výběr', |
|
71 |
'type' : 'submit', |
|
72 |
'attr' : { |
|
73 |
'class': 'btn btn-secondary' |
|
74 |
} |
|
75 |
}) |
|
76 |
}} |
|
74 | 77 |
</li> |
75 | 78 |
|
76 | 79 |
<li class="nav-item button"> |
77 | 80 |
<h2> |
78 | 81 |
<a href="{{ path('home') }}" class="nav-link">O projektu</a> |
79 | 82 |
</h2> |
80 |
</li> |
|
81 |
</ul> |
|
82 |
</form> |
|
83 |
</li> |
|
84 |
</ul> |
|
85 |
|
|
86 |
{{ form_end(form) }} |
|
87 |
|
|
83 | 88 |
</div> |
84 | 89 |
|
85 | 90 |
<a href="{{ path('home') }}" class="navbar-button"> |
... | ... | |
152 | 157 |
|
153 | 158 |
{% block javascripts %} |
154 | 159 |
|
155 |
<script src="{{ asset('js/jquery-3.4.1.min.js') }}"></script> |
|
156 |
<script src="{{ asset('js/bootstrap.min.js') }}"></script> |
|
157 |
<script src="{{ asset('js/leaflet.js') }}"></script> |
|
158 |
<script src="{{ asset('js/leaflet-heat.js') }}"></script> |
|
159 |
<script src="{{ asset('js/zcu-heatmap.js') }}"></script> |
|
160 |
<script> |
|
161 |
initMap(); |
|
162 |
showHeatmap("{{ path('opendata', {'collectionName':'open-data-db.KOLOBEZKY31102018'}) }}"); |
|
163 |
</script> |
|
160 |
<script src="{{ asset('js/jquery-3.4.1.min.js') }}"></script> |
|
161 |
<script src="{{ asset('js/bootstrap.min.js') }}"></script> |
|
162 |
<script src="{{ asset('js/leaflet.js') }}"></script> |
|
163 |
<script src="{{ asset('js/leaflet-heat.js') }}"></script> |
|
164 |
<script src="{{ asset('js/zcu-heatmap.js') }}"></script> |
|
165 |
<script> |
|
166 |
initMap(); |
|
167 |
showHeatmap("{{ path('opendata', {'collectionName':'open-data-db.'}) }}", 'KOLOBEZKY31102018'); |
|
168 |
</script> |
|
169 |
|
|
164 | 170 |
|
165 | 171 |
{% endblock %} |
Také k dispozici: Unified diff
Re #7933
+ základní funkcionalita formulářů v aplikaci - viz. Symfony forms