Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 03c02899

Přidáno uživatelem Jakub Vašta před asi 4 roky(ů)

Re #7933
+ základní funkcionalita formulářů v aplikaci - viz. Symfony forms

Zobrazit rozdíly:

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&ndash;1:00</option>
35
                <option value="1">1:00&ndash;2:00</option>
36
                <option value="2">2:00&ndash;3:00</option>
37
                <option value="3">3:00&ndash;4:00</option>
38
                <option value="4">4:00&ndash;5:00</option>
39
                <option value="5">5:00&ndash;6:00</option>
40
                <option value="6">6:00&ndash;7:00</option>
41
                <option value="7">7:00&ndash;8:00</option>
42
                <option value="8">8:00&ndash;9:00</option>
43
                <option value="9">9:00&ndash;10:00</option>
44
                <option value="10">10:00&ndash;11:00</option>
45
                <option value="11">11:00&ndash;12:00</option>
46
                <option value="12">12:00&ndash;13:00</option>
47
                <option value="13">13:00&ndash;14:00</option>
48
                <option value="14">14:00&ndash;15:00</option>
49
                <option value="15">15:00&ndash;16:00</option>
50
                <option value="16">16:00&ndash;17:00</option>
51
                <option value="17">17:00&ndash;18:00</option>
52
                <option value="18">18:00&ndash;19:00</option>
53
                <option value="19">19:00&ndash;20:00</option>
54
                <option value="20">20:00&ndash;21:00</option>
55
                <option value="21">21:00&ndash;22:00</option>
56
                <option value="22">22:00&ndash;23:00</option>
57
                <option value="23">23:00&ndash;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&nbsp;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