Completed
Push — master ( b28e00...ed55c8 )
by Vojta
01:45
created

Letters::onRun()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php namespace VojtaSvoboda\Brands\Components;
2
3
use Cms\Classes\ComponentBase;
4
use Cms\Classes\Page;
5
use VojtaSvoboda\Brands\Models\Brand as Model;
6
7
class Letters extends ComponentBase
8
{
9
    public $letters;
10
11
    public function componentDetails()
12
    {
13
        return [
14
            'name' => 'Brand letters',
15
            'description' => 'Show all starting letters to filtrate brands.',
16
        ];
17
    }
18
19
    public function defineProperties()
20
    {
21
        return [
22
            'brandsPage' => [
23
                'title' => 'Brands page',
24
                'description' => 'Page for showing brands',
25
                'type' => 'dropdown',
26
                'default' => 'brands',
27
            ],
28
        ];
29
    }
30
31
    public function onRun()
32
    {
33
        $this->page['letters'] = $this->letters = $this->getBrandLetters();
34
    }
35
36
    /**
37
     * Get sorted list of brand letters.
38
     *
39
     * @return array
40
     */
41
    public function getBrandLetters()
42
    {
43
        // get unique letters
44
        $letters = [];
45
        Model::all()->each(function($brand) use (&$letters)
46
        {
47
            // get letter
48
            $letter = mb_strtolower(mb_substr($brand->name, 0, 1));
49
50
            // init array when doesn't exists
51
            if (!isset($letters[$letter])) {
52
                $letters[$letter] = [
53
                    'name' => $letter,
54
                    'count' => 0,
55
                    'url' => $this->controller->pageUrl($this->property('brandsPage'), [
56
                        'letter' => $letter,
57
                    ]),
58
                ];
59
            }
60
            $letters[$letter]['count']++;
61
        });
62
63
        // sort them
64
        usort($letters, function($a, $b) {
65
            if ($a['name'] == $b['name']) {
66
                return 0;
67
            }
68
69
            return $a['name'] > $b['name'] ? 1 : -1;
70
        });
71
72
        return $letters;
73
    }
74
75
    /**
76
     * Get options for the dropdown where the link to the brand page can be selected.
77
     *
78
     * @return array
79
     */
80
    public function getBrandsPageOptions()
81
    {
82
        return Page::sortBy('baseFileName')->lists('baseFileName', 'baseFileName');
83
    }
84
}
85