Completed
Push — master ( f8f77e...d2a4ab )
by Jason
05:01
created

OptionItem::getCMSFields()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 154
Code Lines 101

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 154
ccs 0
cts 97
cp 0
rs 8.2857
cc 3
eloc 101
nc 4
nop 0
crap 12

How to fix   Long Method   

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\FoxyStripe\Model;
4
5
use Dynamic\FoxyStripe\Page\ProductPage;
6
use SilverStripe\Control\Session;
7
use SilverStripe\Forms\CheckboxField;
8
use SilverStripe\Forms\CurrencyField;
9
use SilverStripe\Forms\DropdownField;
10
use SilverStripe\Forms\FieldList;
11
use SilverStripe\Forms\HeaderField;
12
use SilverStripe\Forms\NumericField;
13
use SilverStripe\Forms\TextField;
14
use SilverStripe\ORM\DataObject;
15
use SilverStripe\ORM\ValidationResult;
16
use SilverStripe\Security\Permission;
17
18
/**
19
 * Class OptionItem.
20
 */
21
class OptionItem extends DataObject
22
{
23
    /**
24
     * @var array
25
     */
26
    private static $db = array(
0 ignored issues
show
introduced by
The private property $db is not used, and could be removed.
Loading history...
27
        'Title' => 'Text',
28
        'WeightModifier' => 'Int',
29
        'CodeModifier' => 'Text',
30
        'PriceModifier' => 'Currency',
31
        'WeightModifierAction' => "Enum('Add,Subtract,Set','Add')",
32
        'CodeModifierAction' => "Enum('Add,Subtract,Set','Add')",
33
        'PriceModifierAction' => "Enum('Add,Subtract,Set','Add')",
34
        'Available' => 'Boolean',
35
        'SortOrder' => 'Int',
36
    );
37
38
    /**
39
     * @var array
40
     */
41
    private static $has_one = array(
0 ignored issues
show
introduced by
The private property $has_one is not used, and could be removed.
Loading history...
42
        'Product' => ProductPage::class,
43
        'ProductOptionGroup' => OptionGroup::class,
44
    );
45
46
    /**
47
     * @var array
48
     */
49
    private static $belongs_many_many = array(
0 ignored issues
show
introduced by
The private property $belongs_many_many is not used, and could be removed.
Loading history...
50
        'OrderDetails' => OrderDetail::class,
51
    );
52
53
    /**
54
     * @var array
55
     */
56
    private static $defaults = array(
0 ignored issues
show
introduced by
The private property $defaults is not used, and could be removed.
Loading history...
57
        'Available' => true,
58
    );
59
60
    /**
61
     * @var array
62
     */
63
    private static $summary_fields = array(
0 ignored issues
show
introduced by
The private property $summary_fields is not used, and could be removed.
Loading history...
64
        'Title' => 'Title',
65
        'ProductOptionGroup.Title' => 'Group',
66
        'IsAvailable' => 'Available',
67
    );
68
69
    /**
70
     * @var array
71
     */
72
    private static $searchable_fields = [
0 ignored issues
show
introduced by
The private property $searchable_fields is not used, and could be removed.
Loading history...
73
        'Title' => [
74
            'title' => 'Title',
75
        ],
76
        'ProductOptionGroup.Title' => [
77
            'title' => 'Group',
78
        ],
79
    ];
80
81
    /**
82
     * @var string
83
     */
84
    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...
85
86
    /**
87
     * @var string
88
     */
89
    private static $table_name = 'FS_OptionItem';
0 ignored issues
show
introduced by
The private property $table_name is not used, and could be removed.
Loading history...
90
91
    /**
92
     * @return FieldList
93
     */
94
    public function getCMSFields()
95
    {
96
        $fields = parent::getCMSFields();
97
98
        $fields->removeByName([
99
            'OrderDetails',
100
            'SortOrder',
101
            'ProductID',
102
        ]);
103
104
        // set variables from Product
105
        $productID = ($this->ProductID != 0) ? $this->ProductID : Session::get('CMSMain.currentPage');
0 ignored issues
show
Bug Best Practice introduced by
The property ProductID does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The method SilverStripe\Control\Session::get() is not static, but was called statically. ( Ignorable by Annotation )

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

105
        $productID = ($this->ProductID != 0) ? $this->ProductID : Session::/** @scrutinizer ignore-call */ get('CMSMain.currentPage');
Loading history...
Bug Best Practice introduced by
It seems like you are loosely comparing $this->ProductID of type null|mixed to 0; this is ambiguous as not only 0 == 0 is true, but null == 0 is true, too. Consider using a strict comparison ===.
Loading history...
106
        $product = ProductPage::get()->byID($productID);
107
108
        $parentPrice = $product->obj('Price')->Nice();
109
        $parentWeight = $product->Weight;
110
        $parentCode = $product->Code;
111
112
        // ProductOptionGroup Dropdown field w/ add new
113
        $groups = function () {
114
            return OptionGroup::get()->map()->toArray();
115
        };
116
        $groupFields = singleton(OptionGroup::class)->getCMSFields();
117
        $groupField = DropdownField::create('ProductOptionGroupID', _t(
0 ignored issues
show
Bug introduced by
'ProductOptionGroupID' of type string is incompatible with the type array expected by parameter $args of SilverStripe\View\ViewableData::create(). ( Ignorable by Annotation )

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

117
        $groupField = DropdownField::create(/** @scrutinizer ignore-type */ 'ProductOptionGroupID', _t(
Loading history...
118
            'OptionItem.Group',
119
            'Group'
120
        ), $groups())
121
            ->setEmptyString('')
122
            ->setDescription(_t(
123
                'OptionItem.GroupDescription',
124
                'Name of this group of options. Managed in <a href="admin/settings">
125
                        Settings > FoxyStripe > Option Groups
126
                        </a>'
127
            ));
128
        if (class_exists('QuickAddNewExtension')) {
129
            $groupField->useAddNew('OptionGroup', $groups, $groupFields);
130
        }
131
132
        $fields->addFieldsToTab('Root.Main', array(
133
            TextField::create('Title')
134
                ->setTitle(_t('OptionItem.Title', 'Product Option Name')),
135
            CheckboxField::create('Available')
136
                ->setTitle(_t('OptionItem.Available', 'Available for purchase'))
137
                ->setDescription(_t(
138
                    'OptionItem.AvailableDescription',
139
                    'If unchecked, will disable this option in the drop down menu'
140
                )),
141
            $groupField,
142
        ));
143
144
        $fields->addFieldsToTab('Root.Modifiers', array(
145
            HeaderField::create('ModifyHD', _t(
146
                'OptionItem.ModifyHD',
147
                'Product Option Modifiers'
148
            ), 2),
0 ignored issues
show
Bug introduced by
2 of type integer is incompatible with the type array expected by parameter $args of SilverStripe\View\ViewableData::create(). ( Ignorable by Annotation )

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

148
            ), /** @scrutinizer ignore-type */ 2),
Loading history...
149
150
            // Weight Modifier Fields
151
            HeaderField::create('WeightHD', _t('OptionItem.WeightHD', 'Modify Weight'), 3),
152
            NumericField::create('WeightModifier')
153
                ->setTitle(_t('OptionItem.WeightModifier', 'Weight')),
154
            DropdownField::create(
155
                'WeightModifierAction',
156
                _t('OptionItem.WeightModifierAction', 'Weight Modification'),
157
                array(
158
                    'Add' => _t(
159
                        'OptionItem.WeightAdd',
160
                        'Add to Base Weight ({weight})',
161
                        'Add to weight',
162
                        array('weight' => $parentWeight)
163
                    ),
164
                    'Subtract' => _t(
165
                        'OptionItem.WeightSubtract',
166
                        'Subtract from Base Weight ({weight})',
167
                        'Subtract from weight',
168
                        array('weight' => $parentWeight)
169
                    ),
170
                    'Set' => _t('OptionItem.WeightSet', 'Set as a new Weight'),
171
                )
172
            )->setEmptyString('')
173
            ->setDescription(_t(
174
                'OptionItem.WeightDescription',
175
                'Does weight modify or replace base weight?'
176
            )),
177
178
            // Price Modifier FIelds
179
            HeaderField::create('PriceHD', _t('OptionItem.PriceHD', 'Modify Price'), 3),
180
            CurrencyField::create('PriceModifier')
181
                ->setTitle(_t('OptionItem.PriceModifier', 'Price')),
182
            DropdownField::create(
183
                'PriceModifierAction',
184
                _t('OptionItem.PriceModifierAction', 'Price Modification'),
185
                array(
186
                    'Add' => _t(
187
                        'OptionItem.PriceAdd',
188
                        'Add to Base Price ({price})',
189
                        'Add to price',
190
                        array('price' => $parentPrice)
191
                    ),
192
                    'Subtract' => _t(
193
                        'OptionItem.PriceSubtract',
194
                        'Subtract from Base Price ({price})',
195
                        'Subtract from price',
196
                        array('price' => $parentPrice)
197
                    ),
198
                    'Set' => _t('OptionItem.PriceSet', 'Set as a new Price'),
199
                )
200
            )->setEmptyString('')
201
            ->setDescription(_t('OptionItem.PriceDescription', 'Does price modify or replace base price?')),
202
203
            // Code Modifier Fields
204
            HeaderField::create('CodeHD', _t('OptionItem.CodeHD', 'Modify Code'), 3),
205
            TextField::create('CodeModifier')
206
                ->setTitle(_t('OptionItem.CodeModifier', 'Code')),
207
            DropdownField::create(
208
                'CodeModifierAction',
209
                _t('OptionItem.CodeModifierAction', 'Code Modification'),
210
                array(
211
                    'Add' => _t(
212
                        'OptionItem.CodeAdd',
213
                        'Add to Base Code ({code})',
214
                        'Add to code',
215
                        array('code' => $parentCode)
216
                    ),
217
                    'Subtract' => _t(
218
                        'OptionItem.CodeSubtract',
219
                        'Subtract from Base Code ({code})',
220
                        'Subtract from code',
221
                        array('code' => $parentCode)
222
                    ),
223
                    'Set' => _t('OptionItem.CodeSet', 'Set as a new Code'),
224
                )
225
            )->setEmptyString('')
226
            ->setDescription(_t('OptionItem.CodeDescription', 'Does code modify or replace base code?')),
227
        ));
228
229
        /*
0 ignored issues
show
Unused Code Comprehensibility introduced by
45% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
230
        // Cateogry Dropdown field w/ add new
231
        // removed until relevance determined
232
        $categories = function(){
233
            return ProductCategory::get()->map()->toArray();
234
        };
235
236
        // to do - have OptionItem category override set ProductPage category if selected: issue #155
237
        $categoryField = DropdownField::create('CategoryID', 'Category', $categories())
238
            ->setEmptyString('')
239
            ->setDescription('Categories can be managed in <a href="admin/settings">
240
                Settings > FoxyStripe > Categories
241
        </a>');
242
        if (class_exists('QuickAddNewExtension')) $categoryField->useAddNew('ProductCategory', $categories);
243
244
        $fields->insertAfter($categoryField, 'ProductOptionGroupID');
245
        */
246
247
        return $fields;
248
    }
249
250
    /**
251
     * @return ValidationResult
252
     */
253 4
    public function validate()
254
    {
255 4
        $result = parent::validate();
256
257 4
        if ($this->ProductOptionGroupID == 0) {
0 ignored issues
show
Bug Best Practice introduced by
The property ProductOptionGroupID does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
It seems like you are loosely comparing $this->ProductOptionGroupID of type null|mixed to 0; this is ambiguous as not only 0 == 0 is true, but null == 0 is true, too. Consider using a strict comparison ===.
Loading history...
258
            $result->addError('Must set a Group prior to saving');
259
        }
260
261 4
        return $result;
262
    }
263
264
    /**
265
     * @param $oma
266
     * @param bool $returnWithOnlyPlusMinus
267
     *
268
     * @return string
269
     */
270
    public static function getOptionModifierActionSymbol($oma, $returnWithOnlyPlusMinus = false)
271
    {
272
        switch ($oma) {
273
            case 'Subtract':
274
                $symbol = '-';
275
                break;
276
            case 'Set':
277
                $symbol = ($returnWithOnlyPlusMinus) ? '' : ':';
278
                break;
279
            default:
280
                $symbol = '+';
281
        }
282
283
        return $symbol;
284
    }
285
286
    /**
287
     * @return string
288
     */
289
    public function getWeightModifierWithSymbol()
290
    {
291
        return self::getOptionModifierActionSymbol($this->WeightModifierAction).$this->WeightModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property WeightModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property WeightModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
292
    }
293
294
    /**
295
     * @return string
296
     */
297
    public function getPriceModifierWithSymbol()
298
    {
299
        return self::getOptionModifierActionSymbol($this->PriceModifierAction).$this->PriceModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property PriceModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
300
    }
301
302
    /**
303
     * @return string
304
     */
305
    public function getCodeModifierWithSymbol()
306
    {
307
        return self::getOptionModifierActionSymbol($this->CodeModifierAction).$this->CodeModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property CodeModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property CodeModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
308
    }
309
310
    /**
311
     * @return mixed
312
     */
313
    public function getProductOptionGroupTitle()
314
    {
315
        return $this->ProductOptionGroup()->Title;
0 ignored issues
show
Bug introduced by
The method ProductOptionGroup() does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

315
        return $this->/** @scrutinizer ignore-call */ ProductOptionGroup()->Title;
Loading history...
316
    }
317
318
    /**
319
     * @return string
320
     */
321
    public function getGeneratedValue()
322
    {
323
        $modPrice = ($this->PriceModifier) ? (string) $this->PriceModifier : '0';
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
324
        $modPriceWithSymbol = self::getOptionModifierActionSymbol($this->PriceModifierAction).$modPrice;
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
325
        $modWeight = ($this->WeightModifier) ? (string) $this->WeightModifier : '0';
0 ignored issues
show
Bug Best Practice introduced by
The property WeightModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
326
        $modWeight = self::getOptionModifierActionSymbol($this->WeightModifierAction).$modWeight;
0 ignored issues
show
Bug Best Practice introduced by
The property WeightModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
327
        $modCode = self::getOptionModifierActionSymbol($this->CodeModifierAction).$this->CodeModifier;
0 ignored issues
show
Bug Best Practice introduced by
The property CodeModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property CodeModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
328
329
        return $this->Title.'{p'.$modPriceWithSymbol.'|w'.$modWeight.'|c'.$modCode.'}';
0 ignored issues
show
Bug Best Practice introduced by
The property Title does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
330
    }
331
332
    /**
333
     * @return mixed|string
334
     */
335
    public function getGeneratedTitle()
336
    {
337
        $modPrice = ($this->PriceModifier) ? (string) $this->PriceModifier : '0';
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifier does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
338
        $title = $this->Title;
0 ignored issues
show
Bug Best Practice introduced by
The property Title does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
339
        $title .= ($this->PriceModifier != 0) ?
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $this->PriceModifier of type null|mixed to 0; this is ambiguous as not only 0 == 0 is true, but null == 0 is true, too. Consider using a strict comparison ===.
Loading history...
340
            ': ('.self::getOptionModifierActionSymbol(
341
                $this->PriceModifierAction,
0 ignored issues
show
Bug Best Practice introduced by
The property PriceModifierAction does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
342
                $returnWithOnlyPlusMinus = true
343
            ).'$'.$modPrice.')' :
344
            '';
345
346
        return $title;
347
    }
348
349
    /**
350
     * @return bool
351
     */
352
    public function getAvailability()
353
    {
354
        $available = ($this->Available == 1) ? true : false;
0 ignored issues
show
Bug Best Practice introduced by
The property Available does not exist on Dynamic\FoxyStripe\Model\OptionItem. Since you implemented __get, consider adding a @property annotation.
Loading history...
355
356
        $this->extend('updateOptionAvailability', $available);
357
358
        return $available;
359
    }
360
361
    /**
362
     * @return string
363
     */
364
    public function getIsAvailable()
365
    {
366
        if ($this->getAvailability()) {
367
            return 'yes';
368
        }
369
370
        return 'no';
371
    }
372
373
    /**
374
     * @param bool $member
375
     *
376
     * @return bool
377
     */
378 49
    public function canView($member = false)
379
    {
380 49
        return true;
381
    }
382
383
    /**
384
     * @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...
385
     *
386
     * @return bool|int
387
     */
388
    public function canEdit($member = null)
389
    {
390
        return Permission::check('Product_CANCRUD');
391
    }
392
393
    /**
394
     * @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...
395
     *
396
     * @return bool|int
397
     */
398 1
    public function canDelete($member = null)
399
    {
400 1
        return Permission::check('Product_CANCRUD');
401
    }
402
403
    /**
404
     * @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...
405
     *
406
     * @return bool|int
407
     */
408
    public function canCreate($member = null, $context = [])
409
    {
410
        return Permission::check('Product_CANCRUD');
411
    }
412
}
413