Passed
Push — master ( 8e9e8c...5c7da6 )
by Fran
03:59
created

Form::fieldsOrder()   C

Complexity

Conditions 15
Paths 15

Size

Total Lines 19
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 15.0386

Importance

Changes 0
Metric Value
cc 15
eloc 17
c 0
b 0
f 0
nc 15
nop 1
dl 0
loc 19
ccs 17
cts 18
cp 0.9444
crap 15.0386
rs 5.9166

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
namespace PSFS\base\dto;
3
4
/**
5
 * Class Form
6
 * @package PSFS\base\dto
7
 */
8
class Form extends Dto
9
{
10
    /**
11
     * @var array fields
12
     */
13
    private $fields = [];
14
    public $actions = [];
15
16
    /**
17
     * @param Field $field
18
     */
19 1
    public function addField(Field $field)
20
    {
21 1
        $this->fields[$field->name] = $field;
22 1
    }
23
24
    /**
25
     * @param string $name
26
     * @return bool
27
     */
28 1
    public function fieldExists($name) {
29 1
        return array_key_exists($name, $this->fields);
30
    }
31
32
    /**
33
     * @return array
34
     */
35 1
    public function __toArray()
36
    {
37
        $array = [
38 1
            'fields' => [],
39
            'actions' => [],
40
        ];
41 1
        foreach ($this->fields as $field) {
42 1
            $array['fields'][] = $field->__toArray();
43
        }
44
        usort($array['fields'], function($fieldA, $fieldB) {
45
            if((bool)$fieldA['required'] !== (bool)$fieldB['required']) {
46
                if((bool)$fieldA['required']) {
47
                    return -1;
48
                } else {
49
                    return 1;
50
                }
51
            }
52
            $aOrder = Form::fieldsOrder($fieldA);
53
            $bOrder = Form::fieldsOrder($fieldB);
54
            if ($aOrder === $bOrder) {
55
                return strcmp($fieldA['name'], $fieldB['name']);
56
            }
57
            return ($aOrder < $bOrder) ? -1 : 1;
58 1
        });
59 1
        foreach($this->actions as $action) {
60
            $array['actions'][] = $action->__toArray();
61
        }
62 1
        return $array;
63
    }
64
65
    /**
66
     * @param array $field
67
     * @return int
68
     */
69 1
    public static function fieldsOrder(array $field) {
70 1
        switch ($field['type']) {
71 1
            case Field::TEXT_TYPE: $order = 1; break;
72 1
            case Field::PHONE_TYPE: $order = 1; break;
73 1
            case Field::URL_TYPE: $order = 1; break;
74 1
            case Field::CHECK_TYPE: $order = 2; break;
75 1
            case Field::RADIO_TYPE: $order = 2; break;
76 1
            case Field::COMBO_TYPE: $order = 2; break;
77 1
            case Field::TEXTAREA_TYPE: $order = 3; break;
78 1
            case Field::SEARCH_TYPE: $order = 1; break;
79 1
            case Field::HIDDEN_TYPE: $order = 0; break;
80 1
            case Field::NUMBER_TYPE: $order = 2; break;
81 1
            case Field::SWITCH_TYPE: $order = 2; break;
82 1
            case Field::PASSWORD_FIELD: $order = 1; break;
83 1
            case Field::DATE: $order = 4; break;
84 1
            case Field::TIMESTAMP: $order = 4; break;
85
            default: $order = 5; break;
86
        }
87 1
        return $order;
88
    }
89
}