TabsBuilder::add_many_tabs()   B
last analyzed

Complexity

Conditions 6
Paths 9

Size

Total Lines 42
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 8
Bugs 0 Features 1
Metric Value
cc 6
eloc 30
c 8
b 0
f 1
nc 9
nop 4
dl 0
loc 42
rs 8.8177
1
<?php
2
3
namespace Sunnysideup\ModelAdminManyTabs\Api;
4
5
use SilverStripe\CMS\Model\SiteTree;
6
use SilverStripe\Core\Injector\Injector;
7
use SilverStripe\Forms\Form;
8
use SilverStripe\Forms\GridField\GridField;
9
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
10
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
11
use SilverStripe\Forms\GridField\GridFieldDetailForm;
12
use SilverStripe\Forms\Tab;
13
use SilverStripe\Forms\TabSet;
14
use SilverStripe\Lumberjack\Forms\GridFieldConfig_Lumberjack;
15
16
class TabsBuilder
17
{
18
    /**
19
     * @param array $arrayOfTabs  contains: [
20
     *                            TabName => string,
21
     *                            Title => string,
22
     *                            List => DataList
23
     *                            AllowAddNew => bool (model must have CMSEditLink)
24
     *                            ]
25
     * @param int   $itemsPerPage - optional
26
     */
27
    public static function add_many_tabs(array $arrayOfTabs, Form $form, string $modelToReplace, $itemsPerPage = 100)
28
    {
29
        $modelToReplaceName = str_replace('\\', '-', $modelToReplace);
30
        $fields = $form->Fields();
31
        $fields->insertAfter(
32
            $modelToReplaceName,
33
            $parentTab = new TabSet(
34
                $modelToReplaceName . 'inner',
35
                []
36
            )
37
        );
38
        $fields->removeByName($modelToReplaceName);
39
        $singleton = Injector::inst()->get($modelToReplace);
40
        //important!
41
        foreach ($arrayOfTabs as $item) {
42
            if ($singleton instanceof SiteTree) {
43
                $config = GridFieldConfig_Lumberjack::create($itemsPerPage);
44
            } else {
45
                $config = GridFieldConfig_RecordEditor::create($itemsPerPage);
46
            }
47
            if (!(isset($item['AllowAddNew']) && $item['AllowAddNew'])) {
48
                $config->removeComponentsByType(GridFieldAddNewButton::class);
49
            }
50
            $gridField = new GridField(
51
                $item['TabName'],
52
                $item['Title'],
53
                $item['List'],
54
                $config
55
            );
56
            $count = $item['List']->count();
57
            $gridField->setForm($form);
58
            $parentTab->push(
59
                new Tab(
60
                    str_replace(' ', '', (string) $item['Title']),
61
                    $item['Title'] . ' (' . $count . ')',
62
                    $gridField
63
                )
64
            );
65
            /**  @var GridFieldDetailForm $editForm */
66
            $editForm = $gridField->getConfig()->getComponentByType(GridFieldDetailForm::class);
67
            if ($editForm) {
68
                $editForm->setRedirectMissingRecords(true);
69
            }
70
        }
71
    }
72
}
73