GridFieldMap   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Test Coverage

Coverage 92.68%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 41
c 1
b 0
f 0
dl 0
loc 87
ccs 38
cts 41
cp 0.9268
rs 10
wmc 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
A get_geojson_from_list() 0 23 4
A getManipulatedData() 0 3 1
A getHTMLFragments() 0 29 2
A __construct() 0 3 1
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
        $collection = [];
81
82 1
        foreach ($list as $item) {
83 1
            if (!$item->canView()) {
84
                continue;
85
            }
86
87 1
            $geo = GIS::create($item->$geometryField)->reproject(4326);
88
89 1
            $collection[$item->ID] = [
90 1
                $item->Title,
91 1
                $geo->type,
92 1
                $geo->coordinates,
93
            ];
94
        }
95
96 1
        return json_encode($collection);
97
    }
98
99
    /**
100
     * Manipulate the {@link DataList} as needed by this grid modifier.
101
     *
102
     * @param GridField $gridField
103
     * @param SS_List $dataList
104
     * @return \SilverStripe\ORM\DataList
105
     */
106
    public function getManipulatedData(GridField $gridField, SS_List $dataList)
107
    {
108
        return $dataList;
109
    }
110
}
111