Passed
Push — master ( 3e81f1...a4fafd )
by Leo
03:46
created

ModularCommonTrait::handleNoClassCase()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 8
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 12
rs 10
1
<?php
2
3
namespace Cita\Modular\Traits;
4
5
use SilverStripe\Forms\TextField;
6
use SilverStripe\Forms\LiteralField;
7
use SilverStripe\Forms\HeaderField;
8
use Symbiote\GridFieldExtensions\GridFieldAddNewMultiClass;
9
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
10
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
11
use SilverStripe\Forms\GridField\GridFieldDataColumns;
12
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
13
use SilverStripe\Forms\GridField\GridFieldDetailForm;
14
use SilverStripe\Forms\GridField\GridField;
15
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
16
use SilverStripe\Core\ClassInfo;
17
use Cita\Modular\Model\Block;
18
use Cita\Modular\Model\FlexBlock;
19
use SilverStripe\View\ViewableData;
20
use Cita\Modular\Form\BlockEditForm_ItemRequest;
21
22
trait ModularCommonTrait
23
{
24
    private function makeGridField(&$fields)
25
    {
26
        if (!$this->owner->exists()) {
27
            return;
28
        }
29
30
        $fields->removeByName(['ModularBlocks']);
31
32
        $classes = $this->filterBlockClasses(ClassInfo::subclassesFor(Block::class));
33
        $classes = array_values($classes);
34
35
        if (empty($classes)) {
36
            return $this->handleNoClassCase(&$fields);
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->handleNoClassCase($fields) targeting Cita\Modular\Traits\Modu...it::handleNoClassCase() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
37
        }
38
39
        $this->buildGridFieldConfig($fields, $classes);
40
    }
41
42
    private function buildGridFieldConfig(&$fields, $classes)
43
    {
44
        $fields->addFieldToTab(
45
            'Root.Main',
46
            GridField::create(
47
                'ModularBlocks',
48
                'Modular blocks',
49
                $this->owner->ModularBlocks(),
50
                $config = GridFieldConfig_RelationEditor::create()
51
            )->setDescription('The blocks you add on this page will be listed under the page\'s main content')
52
        );
53
54
        $this->buildGridFieldConfigTable($config, $classes);
55
56
        if ($this->owner instanceof FlexBlock) {
57
            $this->createInlineEditors($config);
58
        }
59
60
        $config
61
            ->getComponentByType(GridFieldDetailForm::class)
62
            ->setItemRequestClass(BlockEditForm_ItemRequest::class)
63
        ;
64
    }
65
66
    private function createInlineEditors(&$config)
67
    {
68
        $config->addComponent($this->makeEditableField('ColOffset', 'Offset - default'));
69
        $config->addComponent($this->makeEditableField('ColSize', 'Grid size - default'));
70
        $config->addComponent($this->makeEditableField('ColOffsetLg', 'Offset - lg'));
71
        $config->addComponent($this->makeEditableField('ColSizeLg', 'Grid size - lg'));
72
        $config->addComponent($this->makeEditableField('ColOffsetMd', 'Offset - md'));
73
        $config->addComponent($this->makeEditableField('ColSizeMd', 'Grid size - md'));
74
        $config->addComponent($this->makeEditableField('ColSizeSm', 'Grid size - sm'));
75
        $config->addComponent($this->makeEditableField('ColOffsetSm', 'Offset - sm'));
76
    }
77
78
    private function buildGridFieldConfigTable(&$config, $classes)
79
    {
80
        $multi = new GridFieldAddNewMultiClass();
81
        $multi = $multi->setClasses($classes);
82
83
        $config
84
            ->removeComponentsByType(GridFieldAddNewButton::class)
85
            ->addComponent($multi)
86
            ->addComponent(new GridFieldOrderableRows('SortOrder'));
87
88
        $dataColumns = $config->getComponentByType(GridFieldDataColumns::class);
89
90
        $dataFields = $this->owner instanceof FlexBlock ?
91
            [
92
                'Type' => 'Type',
93
                'Title' => 'Title',
94
            ] : [
95
                'showID' => 'Anchor',
96
                'Type' => 'Type',
97
                'Title' => 'Title',
98
                'BlockSummary' => 'Summary',
99
            ]
100
        ;
101
102
        $dataColumns->setDisplayFields($dataFields)->setFieldCasting([
103
            'Type' => 'HTMLText->RAW',
104
        ]);
105
    }
106
107
    private function handleNoClassCase(&$fields)
108
    {
109
        $fields->addFieldsToTab(
110
            'Root.Main',
111
            [
112
                HeaderField::create(
113
                    'ModularBlocksNotice',
114
                    'Modular blocks'
115
                ),
116
                LiteralField::create(
117
                    'ModularBlocks',
118
                    '<p class="alert alert-warning">No block type available for this page type</p>'
119
                ),
120
            ]
121
        );
122
    }
123
124
    private function makeEditableField($fieldName, $fieldTitle)
125
    {
126
        $field = new GridFieldEditableColumns();
127
        $field->setDisplayFields(array(
128
            $fieldName => [
129
                'title' => $fieldTitle,
130
                'field' => TextField::class
131
            ]
132
        ));
133
134
        return $field;
135
    }
136
137
    private function filterBlockClasses($classes)
138
    {
139
        if (!empty($this->owner->config()->allowed_modulars)) {
140
            $classes = [];
141
142
            foreach ($this->owner->config()->allowed_modulars as $modular) {
143
                $classes[strtolower($modular)] = $modular;
144
            }
145
        } elseif (!empty($this->owner->config()->disallowed_modulars)) {
146
            foreach ($this->owner->config()->disallowed_modulars as $modular) {
147
                unset($classes[strtolower($modular)]);
148
            }
149
        }
150
151
        unset($classes[strtolower(Block::class)]);
152
153
        if ($this->owner instanceof FlexBlock) {
154
            unset($classes[strtolower(FlexBlock::class)]);
155
        }
156
157
        return $classes;
158
    }
159
160
    public function getModulars()
161
    {
162
        return ViewableData::create()
163
            ->customise(['ModularBlocks' => $this->owner->ModularBlocks()])
164
            ->renderWith(
165
                $this->owner instanceof FlexBlock ?
166
                'Cita\\Modular\\FlexModularList' : 'Cita\\Modular\\ModularList'
167
            )
168
        ;
169
    }
170
}
171