Passed
Push — master ( bec2a0...9c6a4b )
by Nicolaas
02:11
created

AllLinksModelAdmin::workOutLinksForModel()   B

Complexity

Conditions 9
Paths 21

Size

Total Lines 33
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 22
c 0
b 0
f 0
nc 21
nop 3
dl 0
loc 33
rs 8.0555
1
<?php
2
3
namespace Sunnysideup\TemplateOverview\Api\Providers;
4
use Sunnysideup\TemplateOverview\Api\AllLinksProviderBase;
5
use Sunnysideup\TemplateOverview\Api\AllLinks;
6
use SilverStripe\Admin\CMSMenu;
7
use SilverStripe\Admin\ModelAdmin;
8
use SilverStripe\Core\Config\Configurable;
9
10
use SilverStripe\Core\Injector\Injectable;
11
use SilverStripe\Core\Injector\Injector;
12
use SilverStripe\ORM\DataObject;
13
use SilverStripe\ORM\DB;
14
15
class AllLinksModelAdmin extends AllLinksProviderBase
16
{
17
18
    /**
19
     * List of alternative links for modeladmins
20
     * e.g. 'admin/archive' => 'CMSEditLinkForTestPurposesNOTINUSE'
21
     *
22
     * @var array
23
     */
24
    private static $model_admin_alternatives = [];
25
26
    public function getAllLinksInner(): array
27
    {
28
        $links = [];
29
        $modelAdmins = CMSMenu::get_cms_classes(ModelAdmin::class);
30
        if (! empty($modelAdmins)) {
31
            foreach ($modelAdmins as $modelAdmin) {
32
                $obj = Injector::inst()->get($modelAdmin);
33
                $modelAdminLink = '/' . $obj->Link();
34
                $modelAdminLinkArray = explode('?', $modelAdminLink);
35
                $modelAdminLink = $modelAdminLinkArray[0];
36
                //$extraVariablesLink = $modelAdminLinkArray[1];
37
                $links[] = $modelAdminLink;
38
                $modelsToAdd = $obj->getManagedModels();
39
                if ($modelsToAdd && count($modelsToAdd)) {
40
                    foreach ($modelsToAdd as $key => $model) {
41
                        if (is_array($model) || ! is_subclass_of($model, DataObject::class)) {
42
                            $model = $key;
43
                        }
44
                        if (! is_subclass_of($model, DataObject::class)) {
45
                            continue;
46
                        }
47
                        $links = array_merge(
48
                            $links,
49
                            $this->workOutLinksForModel($obj, $model, $modelAdminLink)
50
                        );
51
                    }
52
                }
53
            }
54
        }
55
56
        return $links;
57
    }
58
59
    protected function workOutLinksForModel($obj, $model, $modelAdminLink)
60
    {
61
        $links = [];
62
        $sanitizedModel = AllLinks::sanitise_class_name($model);
63
        $modelLink = $modelAdminLink . $sanitizedModel . '/';
64
        for ($i = 0; $i < $this->numberOfExamples; $i++) {
65
            $item = $model::get()
66
                ->sort(DB::get_conn()->random() . ' ASC')
67
                ->First();
68
            $exceptionMethod = '';
69
            foreach ($this->Config()->get('model_admin_alternatives') as $test => $method) {
70
                if (! $method) {
71
                    $method = 'do-not-use';
72
                }
73
                if (strpos($modelAdminLink, $test) !== false) {
74
                    $exceptionMethod = $method;
75
                }
76
            }
77
            if ($exceptionMethod) {
78
                if ($item && $item->hasMethod($exceptionMethod)) {
79
                    $links = array_merge($links, $item->{$exceptionMethod}($modelAdminLink));
80
                }
81
            } else {
82
                //needs to stay here for exception!
83
                $links[] = $modelLink;
84
                $links[] = $modelLink . 'EditForm/field/' . $sanitizedModel . '/item/new/';
85
                if ($item) {
86
                    $links[] = $modelLink . 'EditForm/field/' . $sanitizedModel . '/item/' . $item->ID . '/edit/';
87
                }
88
            }
89
        }
90
91
        return $links;
92
    }
93
}
94