Przeglądaj źródła

Location form type

Guillermo Espinoza 7 lat temu
rodzic
commit
a585b4384e

+ 59 - 0
Controller/MapController.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace MapBundle\Controller;
+
+use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\JsonResponse;
+
+class MapController extends Controller
+{
+
+    /**
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function getMapListAction(Request $request)
+    {
+        $query = $request->query->get('q', '');
+        $choiceLoader = $this->get('map.map.choiceloader');
+        $choiceList = $choiceLoader->getChoicesList($query);
+        $list_values = [];
+        foreach ($choiceList as $label => $id) {
+            $list_values[] = [
+                'id' => $id,
+                'text' => $label
+            ];
+        }
+
+        $response = new JsonResponse();
+        $response->setData(['results' => $list_values]);
+
+        return $response;
+    }
+
+    /**
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function getMapAction(Request $request)
+    {
+        $id = $request->get('id', null);
+        $map = '';
+        if (!is_null($id)) {
+            $webservice = $this->get('webservice');
+            $map = $webservice->getArray('remote_get_map_url', array(
+                'id' => $id,
+            ));
+            if (isset($map[0])) {
+                $map = $map[0];
+            }
+        }
+
+        $response = new JsonResponse();
+        $response->setData($map);
+
+        return $response;
+    }
+
+}

+ 13 - 2
Entity/Location.php

@@ -30,8 +30,19 @@ class Location
      * @ORM\Column(type="integer", nullable=true)
      */
     private $mapId;
-
-
+    
+    
+    /**
+     * @return string
+     */
+    public function getData()
+    {
+        return array(
+            'mapId' => $this->mapId,
+            'extraData' => json_decode($this->extraData),
+        );
+    }
+    
     /**
      * Get id
      *

+ 0 - 1
EventListener/LocationListener.php

@@ -51,7 +51,6 @@ class LocationListener
             }
             $options = array(
                 'translation_domain' => 'MapBundle',
-                'class' => 'tab-map'
             );
             if (!$mapper->has('location')) {
                 $mapper

+ 4 - 1
Form/Type/LocationType.php

@@ -4,9 +4,11 @@ namespace MapBundle\Form\Type;
 
 use LeafletBundle\Form\Type\LeafletMapType;
 use MapBundle\Entity\Location;
+use MapBundle\Form\Type\RemoteMapType;
 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
+use Symfony\Component\Form\Extension\Core\Type\HiddenType;
 
 class LocationType extends AbstractType
 {
@@ -17,7 +19,8 @@ class LocationType extends AbstractType
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
         $builder
-                ->add('extraData')
+                ->add('mapId', RemoteMapType::class)
+                ->add('extraData', HiddenType::class)
                 ->add('map', LeafletMapType::class)
                 ;
     }

+ 9 - 0
Form/Type/RemoteMapType.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace MapBundle\Form\Type;
+
+use WebserviceBundle\Form\Type\RemoteClientType;
+
+class RemoteMapType extends RemoteClientType
+{
+}

+ 7 - 0
Resources/config/routing.yml

@@ -0,0 +1,7 @@
+ajax_map_list:
+    path:      /ajax_map_list
+    defaults:  { _controller: MapBundle:Map:getMapList }
+    
+ajax_map:
+    path:      /ajax_map
+    defaults:  { _controller: MapBundle:Map:getMap }    

+ 12 - 1
Resources/config/services.yml

@@ -6,6 +6,7 @@ twig:
         script_google_maps: 'https://maps.googleapis.com/maps/api/js?v=3&key=%googlemaps_api_key%'
     form_themes:
         - 'MapBundle:Form/Type:location_widget.html.twig'
+        - 'MapBundle:Form/Type:remote_map_widget.html.twig'
         - 'LeafletBundle:Form/Type:leaflet_map_widget.html.twig'
 
 services:
@@ -13,4 +14,14 @@ services:
        class: MapBundle\EventListener\LocationListener
        tags:
            - { name: kernel.event_listener, event: sonata.admin.event.configure.form, method: configureFormFields }
-           - { name: kernel.event_listener, event: sonata.admin.event.configure.show, method: configureShowFields }
+           - { name: kernel.event_listener, event: sonata.admin.event.configure.show, method: configureShowFields }          
+
+    map.map.choiceloader:
+       class: WebserviceBundle\Form\ChoiceList\Loader\ClientChoiceLoader
+       arguments: ["@webservice", "@base_tenancy.tenancy_service", "remote_get_map_url", false]
+           
+    map.form.type.remotemap:
+       class: MapBundle\Form\Type\RemoteMapType
+       arguments: ["@map.map.choiceloader"]
+       tags:
+           - { name: form.type }       

+ 2 - 1
Resources/translations/MapBundle.es.yml

@@ -3,4 +3,5 @@ Location: Ubicación
 form:
     label_location: Ubicación
 show:
-    label_location: Ubicación
+    label_location: Ubicación
+Map id: Mapa    

+ 1 - 0
Resources/views/Form/Type/location_widget.html.twig

@@ -1,5 +1,6 @@
 {% block location_widget %}
     {% spaceless %}
+        {{ form_row(form.mapId) }}
         {{ form_row(form.extraData) }}
         {{ form_row(form.map) }}
     {% endspaceless %}

+ 42 - 0
Resources/views/Form/Type/remote_map_widget.html.twig

@@ -0,0 +1,42 @@
+{% extends 'WebserviceBundle:Type:remote_client_widget.html.twig' %}
+
+{% block remote_map_widget %}
+    
+    {% set id = 'mapId' %}
+    {% set ajax_url = 'ajax_map_list' %}
+    {% set create = false %}
+    
+    {% block remote_client_widget %}
+    {{ parent() }}
+    {% endblock remote_client_widget %}
+
+<script type="text/javascript">
+
+// Busco por Ajax + REST en Mapas segun el id que se seleccione
+// Agrego un marcador si tiene cargado en el extraData lat y lng
+$('[id$="mapId"]').on('change', function() {
+    var id = $(this).val();
+    if (id) {
+        $.ajax({
+            type: 'POST',
+            url: '{{ path('ajax_map') }}',
+            data: {
+                id: id
+            },
+            success: function(data) {
+                if (data.extraData) {
+                    var extraData = JSON.parse(data.extraData);
+                    if (extraData.lat && extraData.lng) {
+                        loc = new L.latLng(extraData.lat, extraData.lng);
+                        drawMarker();
+                        setDataValue();
+                    }
+                }
+            }
+        });
+    }
+});
+
+</script>
+
+{% endblock remote_map_widget %}