Completed
Push — master ( 5c4b87...207d41 )
by Yaro
06:22
created

ColumnsAndFieldsTrait::getAllFieldObjects()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
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 4
    public function addColumn($column)
17
    {
18 4
        $this->columns[] = $column;
19 4
    }
20
21 49
    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 49
        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 3
    public function getColumnsAsFields()
32
    {
33 3
        $columns = [];
34 3
        foreach ($this->getColumns() as $column) {
35 2
            if (!is_object($column)) {
36 2
                $column = $this->getFieldByName($column) ?: $this->makeDefaultColumnField($column);
37
            }
38
39 2
            if ($column) {
40 2
                $columns[] = $column;
41
            }
42
        }
43
44 3
        return $columns ?: $this->getFields();
45
    }
46
47
    /**
48
     * Get list of columns that initialized as field object.
49
     *
50
     * @return array
51
     */
52 47
    public function getColumnsWithoutRelatedField()
53
    {
54 47
        $columns = [];
55 47
        foreach ($this->getColumns() as $column) {
56
            if (is_object($column)) {
57
                $columns[] = $column;
58
            }
59
        }
60
61 47
        return $columns;
62
    }
63
64 47
    public function getAllFieldObjects()
65
    {
66 47
        $fieldsAndColumns = array_merge(
67 47
            $this->getFieldsWithoutMarkup(),
68 47
            $this->getColumnsWithoutRelatedField()
69
        );
70
71 47
        return $fieldsAndColumns;
72
    }
73
74
    /**
75
     * @param $name
76
     * @return null|AbstractField
77
     */
78 3
    public function getFieldByName($name)
79
    {
80 3
        $fields = $this->getFieldsWithoutMarkup();
81 3
        foreach ($fields as $field) {
82 3
            if ($field->name() === $name) {
83 2
                return $field;
84
            }
85
        }
86
87 1
        return null;
88
    }
89
90 46
    public function addField(AbstractField $field)
91
    {
92 46
        $this->fields[] = $field;
93 46
    }
94
95 48
    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 48
        return $this->fields;
98
    }
99
100 47
    public function getFieldsWithoutMarkup(): array
101
    {
102 47
        $fields = [];
103 47
        foreach ($this->getFields() as $field) {
104 46
            $this->extractField($field, $fields);
105
        }
106
107 47
        return $fields;
108
    }
109
110 46
    private function extractField(AbstractField $field, &$fields)
111
    {
112 46
        if (!$field->isMarkupRow()) {
113 46
            $fields[] = $field;
114 46
            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 1
    private function makeDefaultColumnField($column)
135
    {
136 1
        return Text::make($column);
137
    }
138
}
139