FormFieldExtension   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 277
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 54
c 1
b 0
f 0
dl 0
loc 277
rs 10
wmc 24

19 Methods

Rating   Name   Duplication   Size   Complexity  
A removeHolderDescriptionClass() 0 4 1
A addLeftLabelClass() 0 4 1
A getRightLabelClass() 0 3 1
A removeHolderClass() 0 4 1
A removeHolderValidationMessageClass() 0 4 1
A classHelper() 0 8 3
A getLeftLabelClass() 0 3 1
A getHolderClass() 0 26 4
A removeRightLabelClass() 0 4 1
A getMiddleColumnClass() 0 3 1
A getHolderDescriptionClass() 0 3 1
A addRightLabelClass() 0 4 1
A removeMiddleColumnClass() 0 4 1
A addHolderDescriptionClass() 0 4 1
A addMiddleColumnClass() 0 4 1
A addHolderClass() 0 4 1
A getHolderValidationMessageClass() 0 3 1
A addHolderValidationMessageClass() 0 4 1
A removeLeftLabelClass() 0 4 1
1
<?php
2
3
namespace AntonyThorpe\FormFieldAdditionalClasses;
4
5
use SilverStripe\Core\Extension;
6
7
class FormFieldExtension extends Extension
8
{
9
    /**
10
     * @var array CSS classes applied to the Field Holder template
11
     */
12
    protected $holderClass = ['field' => 'field'];
13
14
    /**
15
     * @var array CSS classes applied to the Field Holder template Validation Message
16
     */
17
    protected $holderValidationMessageClass = ['message' => 'message'];
18
19
    /**
20
     * @var array CSS classes applied to the Field Holder Description
21
     */
22
    protected $holderDescriptionClass = ['description' => 'description'];
23
24
    /**
25
     * @var array CSS classes applied to the Left Label
26
     */
27
    protected $leftLabelClass = ['left' => 'left'];
28
29
    /**
30
     * @var array CSS classes applied to the Right Label
31
     */
32
    protected $rightLabelClass = ['right' => 'right'];
33
34
    /**
35
     * @var array CSS classes applied to the Middle Column
36
     */
37
    protected $middleColumnClass = ['middleColumn' => 'middleColumn'];
38
39
    /**
40
     * Helper function to add/remove classes
41
     *
42
     * @param string $input CSS classes
43
     * @param string $variable protected static name
44
     * @param string $type Add/unset class
45
     */
46
    protected function classHelper($input, $variable, $type = 'add')
47
    {
48
        $classes = preg_split('/\s+/', $input);
49
        foreach ($classes as $class) {
50
            if ($type == 'add') {
51
                $this->$variable[$class] = $class;
52
            } else {
53
                unset($this->$variable[$class]);
54
            }
55
        }
56
    }
57
58
    /**
59
     * Add one or more CSS classes to the Field Holder template
60
     *
61
     * @param string $input CSS class or classes
62
     * @return $this
63
     */
64
    public function addHolderClass($input)
65
    {
66
        $this->classHelper($input, 'holderClass');
67
        return $this;
68
    }
69
70
    /**
71
     * Remove one or more CSS classes from the Field Holder template
72
     *
73
     * @param string $input CSS class or classes
74
     * @return $this
75
     */
76
    public function removeHolderClass($input)
77
    {
78
        $this->classHelper($input, 'holderClass', 'unset');
79
        return $this;
80
    }
81
82
    /**
83
     * Compiles all CSS-classes for the Field Holder
84
     * Optionally includes a "form-group--no-label" class if no title was set on the FormField
85
     *
86
     * @return string
87
     */
88
    public function getHolderClass()
89
    {
90
        $classes = [];
91
        $classes[] = $this->owner->Type();
92
93
        if (!empty($this->holderClass)) {
94
            $classes = array_merge(
95
                array_values($this->holderClass),
96
                $classes
97
            );
98
        }
99
100
        if (!$this->owner->Title()) {
101
            $classes[] = 'form-group--no-label';
102
        }
103
104
        // Allow custom styling of any element in the container based on validation errors,
105
        // e.g. red borders on input tags.
106
        //
107
        // CSS class needs to be different from the one rendered through.
108
        if ($this->owner->getMessage()) {
109
            $classes[] = $this->getHolderValidationMessageClass();
110
            $classes[] = $this->owner->getMessageType();
111
        }
112
113
        return implode(' ', $classes);
114
    }
115
116
    /**
117
     * Add one or more CSS classes to the Field Holder template for display when there is a Validation Message
118
     *
119
     * @param string $input CSS class or classes
120
     * @return $this
121
     */
122
    public function addHolderValidationMessageClass($input)
123
    {
124
        $this->classHelper($input, 'holderValidationMessageClass');
125
        return $this;
126
    }
127
128
    /**
129
     * Remove one or more CSS classes from the Field Holder template for display when there is a Validation Message
130
     *
131
     * @param string $input CSS class or classes
132
     * @return $this
133
     */
134
    public function removeHolderValidationMessageClass($input)
135
    {
136
        $this->classHelper($input, 'holderValidationMessageClass', 'unset');
137
        return $this;
138
    }
139
140
    /**
141
     * Get CSS validation classes used in the Field Holder Validation Message
142
     *
143
     * @return string
144
     */
145
    public function getHolderValidationMessageClass()
146
    {
147
        return implode(' ', $this->holderValidationMessageClass);
148
    }
149
150
    /**
151
     * Add one or more CSS classes to the Field Holder Description
152
     *
153
     * @param string $input CSS class or classes
154
     * @return $this
155
     */
156
    public function addHolderDescriptionClass($input)
157
    {
158
        $this->classHelper($input, 'holderDescriptionClass');
159
        return $this;
160
    }
161
162
    /**
163
     * Remove one or more CSS classes from the Field Holder Description
164
     *
165
     * @param string $input CSS class or classes
166
     * @return $this
167
     */
168
    public function removeHolderDescriptionClass($input)
169
    {
170
        $this->classHelper($input, 'holderDescriptionClass', 'unset');
171
        return $this;
172
    }
173
174
    /**
175
     * Get CSS validation classes used in the Field Holder template Description
176
     *
177
     * @return string
178
     */
179
    public function getHolderDescriptionClass()
180
    {
181
        return implode(' ', $this->holderDescriptionClass);
182
    }
183
184
    /**
185
     * Add one or more CSS classes to the Left Label
186
     *
187
     * @param string $input CSS class or classes
188
     * @return $this
189
     */
190
    public function addLeftLabelClass($input)
191
    {
192
        $this->classHelper($input, 'leftLabelClass');
193
        return $this;
194
    }
195
196
    /**
197
     * Remove one or more CSS classes from the Left Label
198
     *
199
     * @param string $input CSS class or classes
200
     * @return $this
201
     */
202
    public function removeLeftLabelClass($input)
203
    {
204
        $this->classHelper($input, 'leftLabelClass', 'unset');
205
        return $this;
206
    }
207
208
    /**
209
     * Get CSS classes for the Left Label
210
     *
211
     * @return string
212
     */
213
    public function getLeftLabelClass()
214
    {
215
        return implode(' ', $this->leftLabelClass);
216
    }
217
218
    /**
219
     * Add one or more CSS classes to the Right Label
220
     *
221
     * @param string $input CSS class or classes
222
     * @return $this
223
     */
224
    public function addRightLabelClass($input)
225
    {
226
        $this->classHelper($input, 'rightLabelClass');
227
        return $this;
228
    }
229
230
    /**
231
     * Remove one or more CSS classes from the Right Label
232
     *
233
     * @param string $input CSS class or classes
234
     * @return $this
235
     */
236
    public function removeRightLabelClass($input)
237
    {
238
        $this->classHelper($input, 'rightLabelClass', 'unset');
239
        return $this;
240
    }
241
242
    /**
243
     * Get CSS classes for the Right Label
244
     *
245
     * @return string
246
     */
247
    public function getRightLabelClass()
248
    {
249
        return implode(' ', $this->rightLabelClass);
250
    }
251
252
    /**
253
     * Add one or more CSS classes to the Middle Column
254
     *
255
     * @param string $input CSS class or classes
256
     * @return $this
257
     */
258
    public function addMiddleColumnClass($input)
259
    {
260
        $this->classHelper($input, 'middleColumnClass');
261
        return $this;
262
    }
263
264
    /**
265
     * Remove one or more CSS classes from the Middle Column
266
     *
267
     * @param string $input CSS class or classes
268
     * @return $this
269
     */
270
    public function removeMiddleColumnClass($input)
271
    {
272
        $this->classHelper($input, 'middleColumnClass', 'unset');
273
        return $this;
274
    }
275
276
    /**
277
     * Get CSS classes for the Middle Column
278
     *
279
     * @return string
280
     */
281
    public function getMiddleColumnClass()
282
    {
283
        return implode(' ', $this->middleColumnClass);
284
    }
285
}
286