Passed
Push — master ( 9fbd99...d3d25e )
by Matthew
07:55
created

LocatorControllerExtension   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Test Coverage

Coverage 26.09%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 89
ccs 12
cts 46
cp 0.2609
rs 10
wmc 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A categoriesString() 0 19 3
A onBeforeInit() 0 18 2
B customScript() 0 34 5
1
<?php
2
3
namespace Dynamic\Locator\React\Extensions;
4
5
use Dynamic\SilverStripeGeocoder\GoogleGeocoder;
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Core\Extension;
8
use SilverStripe\View\Requirements;
9
10
/**
11
 * Class LocatorControllerExtension
12
 * @package Dynamic\Locator\React\Extensions
13
 */
14
class LocatorControllerExtension extends Extension
15
{
16
17
    /**
18
     *
19
     */
20
    public function onBeforeInit()
21
    {
22
        // stops script from loading
23
        Requirements::block('jquery-locator');
24
25
        // require i18n translation stuff
26
        Requirements::javascript('silverstripe/admin: client/dist/js/i18n.js');
27
        Requirements::add_i18n_javascript('dynamic/silverstripe-locator-react: client/lang');
28
29
        // because we need another library when using autocomplete
30
        if ($this->owner->Autocomplete) {
31
            // google maps api key
32
            $key = Config::inst()->get(GoogleGeocoder::class, 'geocoder_api_key');
33
            Requirements::block("https://maps.google.com/maps/api/js?key={$key}");
34
            Requirements::javascript("https://maps.google.com/maps/api/js?key={$key}&libraries=places");
35
        }
36
37
        $this->customScript();
38
    }
39
40
    /**
41
     * Generates the custom script for settings
42
     */
43
    private function customScript()
44
    {
45
        $radii = $this->owner->getShowRadius() ? $this->owner->getRadii() : [];
46
        $radiiString = json_encode($radii);
47
48
        $categories = $this->owner->getCategories();
49
        $categoriesString = $this->owner->categoriesString($categories);
50
51
        $unit = $this->owner->Unit ?: 'm';
52
        $limit = $this->owner->getLimit();
53
        $defaultLat = $this->owner->DefaultLat;
54
        $defaultLng = $this->owner->DefaultLng;
55
        // otherwise this is 0 or 1
56
        $clusters = $this->owner->Clusters ? 'true' : 'false';
57
        $autocomplete = $this->owner->Autocomplete ? 'true' : 'false';
58
        $infoWindowTemplate = $this->owner->getInfoWindowTemplate();
59
        $listTemplate = $this->owner->getListTemplate();
60
61
        Requirements::customScript("
62
            window.dynamic_locator = {
63
                'radii': {$radiiString},
64
                'categories': {$categoriesString},
65
                'unit': '{$unit}',
66
                'limit': {$limit},
67
                'clusters': {$clusters},
68
                'infoWindowTemplatePath': '{$infoWindowTemplate}',
69
                'listTemplatePath': '{$listTemplate}',
70
                'defaultCenter': {
71
                    'lat': {$defaultLat},
72
                    'lng': {$defaultLng}
73
                },
74
                'autocomplete': {$autocomplete}
75
            };
76
        ", 'react-locator');
77
    }
78
79
    /**
80
     * @param $categories
81
     *
82
     * @return string
83
     */
84 1
    public function categoriesString($categories)
85
    {
86 1
        $string = '[';
87 1
        for ($i = 0; $i < $categories->count(); $i++) {
88 1
            $cat = $categories[$i];
89 1
            $ID = $cat->ID;
90 1
            $Name = $cat->Name;
91
            $string .= "{
92 1
                'ID': {$ID},
93 1
                'Name': '{$Name}'
94
            }";
95
96 1
            if ($i !== $categories->count() - 1) {
97 1
                $string .= ',';
98
            }
99
        }
100 1
        $string .= ']';
101
102 1
        return $string;
103
    }
104
}
105