Passed
Push — master ( b03c4d...7cc0ae )
by Andreas
05:12
created

GridFieldMap   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 94
Duplicated Lines 0 %

Test Coverage

Coverage 84.78%

Importance

Changes 0
Metric Value
eloc 46
dl 0
loc 94
ccs 39
cts 46
cp 0.8478
rs 10
c 0
b 0
f 0
wmc 9

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getHTMLFragments() 0 29 2
A __construct() 0 3 1
A getManipulatedData() 0 3 1
A get_geojson_from_list() 0 30 5
1
<?php
2
3
namespace Smindel\GIS\Forms;
4
5
use SilverStripe\Core\Config\Configurable;
6
use SilverStripe\Forms\GridField\GridField;
7
use SilverStripe\Forms\GridField\GridField_HTMLProvider;
8
use SilverStripe\Forms\GridField\GridField_DataManipulator;
9
use SilverStripe\View\Requirements;
10
use SilverStripe\Core\Injector\Injectable;
11
use SilverStripe\Core\Config\Config;
12
use SilverStripe\ORM\SS_List;
13
use Smindel\GIS\GIS;
14
use proj4php\Proj4php;
15
use proj4php\Proj;
16
use proj4php\Point;
17
18
/**
19
 * GridFieldPaginator paginates the {@link GridField} list and adds controls
20
 * to the bottom of the {@link GridField}.
21
 */
22
class GridFieldMap implements GridField_HTMLProvider, GridField_DataManipulator
23
{
24
    use Injectable;
25
26
    use Configurable;
27
28
    protected $attribute;
29
30 1
    public function __construct($attribute = null)
31
    {
32 1
        $this->attribute = $attribute;
33 1
    }
34
35
    /**
36
     *
37
     * @param GridField $gridField
38
     * @return array
39
     */
40 1
    public function getHTMLFragments($gridField)
41
    {
42 1
        $srid = GIS::config()->default_srid;
43 1
        $proj = GIS::config()->projections[$srid];
44
45 1
        Requirements::javascript('smindel/silverstripe-gis: client/dist/js/leaflet.js');
46 1
        Requirements::javascript('smindel/silverstripe-gis: client/dist/js/leaflet.markercluster.js');
47 1
        Requirements::javascript('smindel/silverstripe-gis: client/dist/js/leaflet-search.js');
48 1
        Requirements::javascript('smindel/silverstripe-gis: client/dist/js/proj4.js');
49 1
        Requirements::customScript(sprintf('proj4.defs("EPSG:%s", "%s");', $srid, $proj), 'EPSG:' . $srid);
50 1
        Requirements::javascript('smindel/silverstripe-gis: client/dist/js/GridFieldMap.js');
51 1
        Requirements::css('smindel/silverstripe-gis: client/dist/css/leaflet.css');
52 1
        Requirements::css('smindel/silverstripe-gis: client/dist/css/MarkerCluster.css');
53 1
        Requirements::css('smindel/silverstripe-gis: client/dist/css/MarkerCluster.Default.css');
54 1
        Requirements::css('smindel/silverstripe-gis: client/dist/css/leaflet-search.css');
55
56 1
        $defaultLocation = Config::inst()->get(MapField::class, 'default_location');
57
58
        return array(
59 1
            'before' => sprintf(
60 1
                '<div class="grid-field-map" data-map-center="%s" data-list="%s" style="z-index:0;"></div>',
61 1
                GIS::create([$defaultLocation['lon'], $defaultLocation['lat']]),
62 1
                htmlentities(
63 1
                    self::get_geojson_from_list(
64 1
                        $gridField->getList(),
65 1
                        $this->attribute ?: GIS::of($gridField->getList()->dataClass())
0 ignored issues
show
Bug introduced by
The method dataClass() does not exist on SilverStripe\ORM\SS_List. It seems like you code against a sub-type of said class. However, the method does not exist in SilverStripe\ORM\Sortable or SilverStripe\ORM\Filterable or SilverStripe\ORM\Relation or SilverStripe\ORM\Limitable or SilverStripe\ORM\Relation or SilverStripe\ORM\Relation or SilverStripe\ORM\Relation. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

65
                        $this->attribute ?: GIS::of($gridField->getList()->/** @scrutinizer ignore-call */ dataClass())
Loading history...
66
                    ),
67 1
                    ENT_QUOTES,
68 1
                    'UTF-8'
69
                )
70
            ),
71
        );
72
    }
73
74 1
    public static function get_geojson_from_list($list, $geometryField = null)
75
    {
76 1
        $modelClass = $list->dataClass();
77
78 1
        $geometryField = $geometryField ?: GIS::of($modelClass);
79
80 1
        if (($srid = GIS::config()->default_srid) != 4326) {
81
            $projDef = GIS::config()->projections[$srid];
82
            $proj4 = new Proj4php();
83
            $proj4->addDef('EPSG:' . $srid, $projDef);
84
            $proj = new Proj('EPSG:' . $srid, $proj4);
0 ignored issues
show
Unused Code introduced by
The assignment to $proj is dead and can be removed.
Loading history...
85
        }
86
87 1
        $collection = [];
88
89 1
        foreach ($list as $item) {
90 1
            if (!$item->canView()) {
91
                continue;
92
            }
93
94 1
            $geo = GIS::create($item->$geometryField)->reproject(4326);
95
96 1
            $collection[$item->ID] = [
97 1
                $item->Title,
98 1
                $geo->type,
99 1
                $geo->coordinates,
100
            ];
101
        }
102
103 1
        return json_encode($collection);
104
    }
105
106
    /**
107
     * Manipulate the {@link DataList} as needed by this grid modifier.
108
     *
109
     * @param GridField $gridField
110
     * @param SS_List $dataList
111
     * @return \SilverStripe\ORM\DataList
112
     */
113
    public function getManipulatedData(GridField $gridField, SS_List $dataList)
114
    {
115
        return $dataList;
116
    }
117
}
118