Completed
Push — master ( ad2c0d...49711d )
by Yaro
10:29
created

ColumnsAndFieldsTrait::getColumnsAsFields()   A

Complexity

Conditions 6
Paths 14

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 0
cts 8
cp 0
rs 9.2222
c 0
b 0
f 0
cc 6
nc 14
nop 0
crap 42
1
<?php
2
3
namespace Yaro\Jarboe\Table\CrudTraits;
4
5
use Yaro\Jarboe\Table\Fields\AbstractField;
6
use Yaro\Jarboe\Table\Fields\Text;
7
8
trait ColumnsAndFieldsTrait
9
{
10
    private $fields = [];
11
    private $columns = [];
12
13
    /**
14
     * @param string|AbstractField $column
15
     */
16
    public function addColumn($column)
17
    {
18
        $this->columns[] = $column;
19
    }
20
21 13
    public function getColumns()
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
22
    {
23 13
        return $this->columns;
24
    }
25
26
    /**
27
     * Get columns as field objects, or fields if there are no columns.
28
     *
29
     * @return array
30
     */
31
    public function getColumnsAsFields()
32
    {
33
        $columns = [];
34
        foreach ($this->getColumns() as $column) {
35
            if (!is_object($column)) {
36
                $column = $this->getFieldByName($column) ?: $this->makeDefaultColumnField($column);
37
            }
38
39
            if ($column) {
40
                $columns[] = $column;
41
            }
42
        }
43
44
        return $columns ?: $this->getFields();
45
    }
46
47
    /**
48
     * Get list of columns that initialized as field object.
49
     *
50
     * @return array
51
     */
52 13
    public function getColumnsWithoutRelatedField()
53
    {
54 13
        $columns = [];
55 13
        foreach ($this->getColumns() as $column) {
56
            if (is_object($column)) {
57
                $columns[] = $column;
58
            }
59
        }
60
61 13
        return $columns;
62
    }
63
64 13
    public function getAllFieldObjects()
65
    {
66 13
        $fieldsAndColumns = array_merge(
67 13
            $this->getFieldsWithoutMarkup(),
68 13
            $this->getColumnsWithoutRelatedField()
69
        );
70
71 13
        return $fieldsAndColumns;
72
    }
73
74
    /**
75
     * @param $name
76
     * @return null|AbstractField
77
     */
78 1
    public function getFieldByName($name)
79
    {
80 1
        $fields = $this->getFieldsWithoutMarkup();
81 1
        foreach ($fields as $field) {
82 1
            if ($field->name() === $name) {
83 1
                return $field;
84
            }
85
        }
86
87
        return null;
88
    }
89
90 13
    public function addField(AbstractField $field)
91
    {
92 13
        $this->fields[] = $field;
93 13
    }
94
95 13
    public function getFields()
0 ignored issues
show
Documentation introduced by
The return type could not be reliably inferred; please add a @return annotation.

Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a @return annotation as described here.

Loading history...
96
    {
97 13
        return $this->fields;
98
    }
99
100 13
    public function getFieldsWithoutMarkup(): array
101
    {
102 13
        $fields = [];
103 13
        foreach ($this->getFields() as $field) {
104 13
            $this->extractField($field, $fields);
105
        }
106
107 13
        return $fields;
108
    }
109
110 13
    private function extractField(AbstractField $field, &$fields)
111
    {
112 13
        if (!$field->isMarkupRow()) {
113 13
            $fields[] = $field;
114 13
            return;
115
        }
116
117
        foreach ($field->getFields() as $field) {
118
            $this->extractField($field, $fields);
119
        }
120
    }
121
122
    public function hasAnyFieldFilter()
123
    {
124
        /** @var AbstractField $field */
125
        foreach ($this->getColumnsAsFields() as $field) {
126
            if (!$field->hidden('list') && $field->filter()) {
127
                return true;
128
            }
129
        }
130
131
        return false;
132
    }
133
134
    private function makeDefaultColumnField($column)
135
    {
136
        return Text::make($column);
137
    }
138
}
139