Issues (18)

src/Api/SiteTreeDetails.php (1 issue)

1
<?php
2
3
namespace Sunnysideup\TemplateOverview\Api;
4
5
use SilverStripe\CMS\Model\RedirectorPage;
6
use SilverStripe\CMS\Model\SiteTree;
7
use SilverStripe\CMS\Model\VirtualPage;
8
use SilverStripe\Core\Config\Configurable;
9
use SilverStripe\Core\Extensible;
10
use SilverStripe\Core\Injector\Injectable;
11
use SilverStripe\ORM\ArrayList;
12
use SilverStripe\ORM\DB;
13
14
class SiteTreeDetails
15
{
16
    use Extensible;
17
    use Injectable;
18
    use Configurable;
19
20
    /**
21
     * @var bool
22
     */
23
    protected $showAll = false;
24
25
    /**
26
     * @var int
27
     */
28
    protected $counter = 0;
29
30
    protected $arrayOfAllClasses = [];
31
32
    private static $list_of_all_classes = [];
33
34
    private static $list_of_all_classes_counter = [];
35
36
    private static $classes_to_exclude = [
37
        SiteTree::class,
38
        RedirectorPage::class,
39
        VirtualPage::class,
40
    ];
41
42
    public function CountsPerClass(): array
43
    {
44
        $this->ListOfAllClasses();
45
46
        return self::$list_of_all_classes_counter;
47
    }
48
49
    public function ListOfAllClasses(): ArrayList
50
    {
51
        if (0 === count(self::$list_of_all_classes)) {
52
            $this->getArrayOfAllClasses();
53
54
            self::$list_of_all_classes = new ArrayList();
55
56
            foreach ($this->arrayOfAllClasses as $item) {
57
                self::$list_of_all_classes->push($item);
58
            }
59
        }
60
61
        return self::$list_of_all_classes;
0 ignored issues
show
Bug Best Practice introduced by
The expression return self::list_of_all_classes returns the type array which is incompatible with the type-hinted return SilverStripe\ORM\ArrayList.
Loading history...
62
    }
63
64
    public function ShowAll()
65
    {
66
        $this->showAll = true;
67
68
        return [];
69
    }
70
71
    protected function getClassList()
72
    {
73
        return SiteTree::page_type_classes();
74
    }
75
76
    protected function getArrayOfAllClasses()
77
    {
78
        $classes = $this->getClassList();
79
        foreach ($classes as $className) {
80
            if (! in_array($className, $this->config()->get('classes_to_exclude'), true)) {
81
                if ($this->showAll) {
82
                    $objects = $className::get()
83
                        ->filter(['ClassName' => $className])
84
                        ->sort(DB::get_conn()->random() . ' ASC')
85
                        ->limit(25)
86
                    ;
87
                    $count = 0;
88
                    if ($objects->exists()) {
89
                        foreach ($objects as $obj) {
90
                            ++$count;
91
                            $this->arrayOfAllClasses[$this->getIndexNumber($count)] = $obj;
92
                        }
93
                    }
94
95
                    self::$list_of_all_classes_counter[$className] = $count;
96
                } else {
97
                    $obj = $className::get()
98
                        ->filter(['ClassName' => $className])
99
                        ->sort(DB::get_conn()->random() . ' ASC')
100
                        ->limit(1)
101
                        ->first()
102
                    ;
103
                    if ($obj) {
104
                        $count = $className::get()->filter(['ClassName' => $obj->ClassName])->count();
105
                    } else {
106
                        $obj = $className::create();
107
                        $count = 0;
108
                    }
109
110
                    self::$list_of_all_classes_counter[$className] = $count;
111
                    $this->arrayOfAllClasses[$this->getIndexNumber($count)] = $obj;
112
                }
113
            }
114
        }
115
116
        //remove the hidden ancestors...
117
118
        ksort($this->arrayOfAllClasses);
119
120
        return $this->arrayOfAllClasses;
121
    }
122
123
    /**
124
     * @param int $count
125
     *
126
     * @return int
127
     */
128
    protected function getIndexNumber($count)
129
    {
130
        ++$this->counter;
131
132
        return (100000 * $count) + $this->counter;
133
    }
134
}
135