Passed
Pull Request — master (#187)
by Jason
02:28
created

SlideImage::validate()   B

Complexity

Conditions 11
Paths 16

Size

Total Lines 31
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 11
eloc 15
nc 16
nop 0
dl 0
loc 31
rs 7.3166
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Dynamic\FlexSlider\Model;
4
5
use function GuzzleHttp\Psr7\parse_request;
6
use Sheadawson\Linkable\Forms\EmbeddedObjectField;
7
use Sheadawson\Linkable\Forms\LinkField;
8
use Sheadawson\Linkable\Models\EmbeddedObject;
9
use Sheadawson\Linkable\Models\Link;
10
use SilverStripe\AssetAdmin\Forms\UploadField;
11
use SilverStripe\Assets\Image;
12
use SilverStripe\CMS\Model\SiteTree;
13
use SilverStripe\Dev\Debug;
14
use SilverStripe\Forms\CompositeField;
15
use SilverStripe\Forms\DropdownField;
16
use SilverStripe\Forms\FieldList;
17
use SilverStripe\Forms\TreeDropdownField;
18
use SilverStripe\ORM\DataObject;
19
use SilverStripe\Security\Permission;
20
use SilverStripe\Security\PermissionProvider;
21
use UncleCheese\DisplayLogic\Forms\Wrapper;
22
23
/**
24
 * Class SlideImage
25
 * @package Dynamic\FlexSlider\Model
26
 * @property string $Name
27
 * @property string $Headline
28
 * @property string $Description
29
 * @property int $SortOrder
30
 * @property string $SlideType
31
 * @property int $ImageID
32
 * @property int $VideoID
33
 * @property int $PageID
34
 * @property int $PageLinkID
35
 * @property int $LinkID
36
 */
37
class SlideImage extends DataObject implements PermissionProvider
38
{
39
    /**
40
     * @var string
41
     */
42
    private static $singular_name = 'Slide';
0 ignored issues
show
introduced by
The private property $singular_name is not used, and could be removed.
Loading history...
43
44
    /**
45
     * @var string
46
     */
47
    private static $plural_name = 'Slides';
0 ignored issues
show
introduced by
The private property $plural_name is not used, and could be removed.
Loading history...
48
49
    /**
50
     * @var array
51
     */
52
    private static $db = [
0 ignored issues
show
introduced by
The private property $db is not used, and could be removed.
Loading history...
53
        'Name' => 'Varchar(255)',
54
        'Headline' => 'Varchar(255)',
55
        'Description' => 'Text',
56
        'SortOrder' => 'Int',
57
        'SlideType' => 'Varchar',
58
    ];
59
60
    /**
61
     * @var array
62
     */
63
    private static $has_one = [
0 ignored issues
show
introduced by
The private property $has_one is not used, and could be removed.
Loading history...
64
        'Image' => Image::class,
65
        'Video' => EmbeddedObject::class,
66
        'Page' => \Page::class,
67
        'PageLink' => SiteTree::class,
68
        'SlideLink' => Link::class,
69
    ];
70
71
    /**
72
     * @var array
73
     */
74
    private static $owns = [
0 ignored issues
show
introduced by
The private property $owns is not used, and could be removed.
Loading history...
75
        'Image',
76
    ];
77
78
    /**
79
     * @var string
80
     */
81
    private static $table_name = 'SlideImage';
0 ignored issues
show
introduced by
The private property $table_name is not used, and could be removed.
Loading history...
82
83
    /**
84
     * @var string
85
     */
86
    private static $default_sort = 'SortOrder';
0 ignored issues
show
introduced by
The private property $default_sort is not used, and could be removed.
Loading history...
87
88
    /**
89
     * Adds Publish button to SlideImage record
90
     *
91
     * @var bool
92
     */
93
    private static $versioned_gridfield_extensions = true;
0 ignored issues
show
introduced by
The private property $versioned_gridfield_extensions is not used, and could be removed.
Loading history...
94
95
    /**
96
     * @var array
97
     */
98
    private static $defaults = [
0 ignored issues
show
introduced by
The private property $defaults is not used, and could be removed.
Loading history...
99
        'SlideType' => 'Image',
100
    ];
101
102
    /**
103
     * @var array
104
     */
105
    private static $summary_fields = [
0 ignored issues
show
introduced by
The private property $summary_fields is not used, and could be removed.
Loading history...
106
        'Image.CMSThumbnail' => 'Image',
107
        'Name' => 'Name',
108
    ];
109
110
    /**
111
     * @var array
112
     */
113
    private static $searchable_fields = [
0 ignored issues
show
introduced by
The private property $searchable_fields is not used, and could be removed.
Loading history...
114
        'Name',
115
        'Headline',
116
        'Description',
117
    ];
118
119
    /**
120
     * @var int
121
     */
122
    private static $image_size_limit = 512000;
0 ignored issues
show
introduced by
The private property $image_size_limit is not used, and could be removed.
Loading history...
123
124
    /**
125
     * @var array
126
     */
127
    private static $slide_types = [
0 ignored issues
show
introduced by
The private property $slide_types is not used, and could be removed.
Loading history...
128
        'Image',
129
        'Video',
130
        'Text',
131
    ];
132
133
    /**
134
     * @param bool $includerelations
135
     * @return array
136
     */
137
    public function fieldLabels($includerelations = true)
138
    {
139
        $labels = parent::fieldLabels($includerelations);
140
141
        $labels['Name'] = _t(__CLASS__ . '.NAME', 'Name');
142
        $labels['Headline'] = _t(__CLASS__ . '.HEADLINE', 'Headline');
143
        $labels['Description'] = _t(__CLASS__ . '.DESCRIPTION', 'Description');
144
        $labels['SlideLinkID'] =  _t(__CLASS__ . '.PAGE_LINK', "Call to action link");
145
        $labels['Image'] = _t(__CLASS__ . '.IMAGE', 'Image');
146
        $labels['SlideType'] = _t(__CLASS__ . '.SlideType', 'Image or Video');
147
        $labels['Video'] = _t(__CLASS__ . '.VideoLabel', 'Video URL');
148
149
        return $labels;
150
    }
151
152
    /**
153
     * @return \SilverStripe\Forms\FieldList
154
     */
155
    public function getCMSFields()
156
    {
157
        $this->beforeUpdateCMSFields(function ($fields) {
158
            $fields->removeByName([
159
                'ShowSlide',
160
                'SortOrder',
161
                'PageID',
162
                'Image',
163
                'SlideType',
164
                'Video',
165
                'VideoID',
166
                'SlideLinkID',
167
            ]);
168
169
            // Name
170
            $fields->dataFieldByName('Name')
171
                ->setDescription(
172
                    _t(__CLASS__ . '.INTERNAL_USE', 'for internal reference only')
173
                );
174
175
            // Headline
176
            $fields->dataFieldByName('Headline')
177
                ->setDescription(
178
                    _t(__CLASS__ . '.USED_IN_TEMPLATE', 'optional, used in template')
179
                );
180
181
            // Description
182
            $fields->dataFieldByName('Description')
183
                ->setDescription(
184
                    _t(__CLASS__ . '.USED_IN_TEMPLATE', 'optional, used in template')
185
                );
186
187
            // Page link
188
            $fields->replaceField(
189
                'PageLinkID',
190
                LinkField::create('SlideLinkID', $this->fieldLabel('SlideLinkID'))
191
            );
192
193
            // Image
194
            $image = UploadField::create('Image', $this->fieldLabel('Image'))
195
                ->setFolderName('Uploads/SlideImages');
196
197
            $image->getValidator()->setAllowedExtensions(['jpg', 'jpeg', 'png', 'gif']);
198
199
            $fields->addFieldToTab(
200
                'Root.Main',
201
                CompositeField::create(FieldList::create(
202
                    DropdownField::create('SlideType', $this->fieldLabel('SlideType'))
203
                        ->setSource($this->getTypeSource()),
204
                    Wrapper::create(
205
                        $image
206
                    )->displayIf('SlideType')->isEqualTo('Image')->orIf('SlideType')->isEqualTo('Video')->end(),
207
                    Wrapper::create(
208
                        $videoField = EmbeddedObjectField::create('Video', $this->fieldLabel('Video'))
209
                            ->setDescription(_t(__CLASS__ . '.VideoDescription', 'Supported links: YouTube, Vimeo'))
210
                    )->displayIf('SlideType')->isEqualTo('Video')->end()
211
                ))->setName('MediaFields'),
212
                'Description'
213
            );
214
        });
215
216
        $fields = parent::getCMSFields();
217
218
        $this->extend('updateSlideImageFields', $fields);
219
220
        return $fields;
221
    }
222
223
    /**
224
     * @return \SilverStripe\ORM\ValidationResult
225
     */
226
    public function validate()
227
    {
228
        $result = parent::validate();
229
230
        if (!$this->Name) {
231
            $result->addError(
232
                _t(__CLASS__ . '.NAME_REQUIRED', 'A Name is required before you can save')
233
            );
234
        }
235
236
        $types = $this->getTypeSource();
237
238
        if (isset($types['Video']) && $this->SlideType == 'Video' && !$this->VideoID) {
239
            $result->addError(
240
                _t(__CLASS__ . '.VIDEO_REQUIRED', 'An Video Link is required before you can save')
241
            );
242
        }
243
244
        if (isset($types['Image']) && $this->SlideType == 'Image' && !$this->ImageID) {
245
            $result->addError(
246
                _t(__CLASS__ . '.IMAGE_REQUIRED', 'An Image is required before you can save')
247
            );
248
        }
249
250
        if (isset($types['Text']) && $this->SlideType == 'Text' && !$this->Description) {
251
            $result->addError(
252
                _t(__CLASS__ . '.DESCRIPTION_REQUIRED', 'A Description is required before you can save')
253
            );
254
        }
255
256
        return $result;
257
    }
258
259
    /**
260
     * @return array
261
     */
262
    public function providePermissions()
263
    {
264
        return [
265
            'Slide_EDIT' => 'Slide Edit',
266
            'Slide_DELETE' => 'Slide Delete',
267
            'Slide_CREATE' => 'Slide Create',
268
        ];
269
    }
270
271
    /**
272
     * @param null $member
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $member is correct as it would always require null to be passed?
Loading history...
273
     * @param array $context
274
     *
275
     * @return bool|int
276
     */
277
    public function canCreate($member = null, $context = [])
278
    {
279
        return Permission::check('Slide_CREATE', 'any', $member);
280
    }
281
282
    /**
283
     * @param null $member
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $member is correct as it would always require null to be passed?
Loading history...
284
     * @param array $context
285
     *
286
     * @return bool|int
287
     */
288
    public function canEdit($member = null, $context = [])
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

288
    public function canEdit($member = null, /** @scrutinizer ignore-unused */ $context = [])

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
289
    {
290
        return Permission::check('Slide_EDIT', 'any', $member);
291
    }
292
293
    /**
294
     * @param null $member
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $member is correct as it would always require null to be passed?
Loading history...
295
     * @param array $context
296
     *
297
     * @return bool|int
298
     */
299
    public function canDelete($member = null, $context = [])
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

299
    public function canDelete($member = null, /** @scrutinizer ignore-unused */ $context = [])

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
300
    {
301
        return Permission::check('Slide_DELETE', 'any', $member);
302
    }
303
304
    /**
305
     * @param null $member
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $member is correct as it would always require null to be passed?
Loading history...
306
     * @param array $context
307
     *
308
     * @return bool
309
     */
310
    public function canView($member = null, $context = [])
0 ignored issues
show
Unused Code introduced by
The parameter $context is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

310
    public function canView($member = null, /** @scrutinizer ignore-unused */ $context = [])

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
311
    {
312
        return true;
313
    }
314
315
    /**
316
     * @return array
317
     */
318
    public function getTypeSource()
319
    {
320
        $types = $this->config()->get('slide_types');
321
        asort($types);
322
        return array_combine($types, $types);
0 ignored issues
show
Bug Best Practice introduced by
The expression return array_combine($types, $types) could also return false which is incompatible with the documented return type array. Did you maybe forget to handle an error condition?

If the returned type also contains false, it is an indicator that maybe an error condition leading to the specific return statement remains unhandled.

Loading history...
323
    }
324
325
    /**
326
     * @param null $template
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $template is correct as it would always require null to be passed?
Loading history...
327
     * @param null $customFields
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $customFields is correct as it would always require null to be passed?
Loading history...
328
     * @return \SilverStripe\ORM\FieldType\DBHTMLText
329
     */
330
    public function renderWith($template = null, $customFields = null)
331
    {
332
        if ($template === null) {
0 ignored issues
show
introduced by
The condition $template === null is always true.
Loading history...
333
            $template = static::class;
334
            $template = ($this->SlideType) ? $template . "_{$this->SlideType}" : '';
335
        }
336
337
        return parent::renderWith($template);
338
    }
339
340
    /**
341
     * @return \SilverStripe\ORM\FieldType\DBHTMLText
342
     */
343
    public function forTemplate()
344
    {
345
        return $this->renderWith();
346
    }
347
}
348