Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Test Setup Failed
Pull Request — master (#3981)
by Cristian
12:34
created

overwriteFieldNameFromDotNotationToArray()   B

Complexity

Conditions 7
Paths 2

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 7
nc 2
nop 1
dl 0
loc 14
rs 8.8333
c 0
b 0
f 0
1
<?php
2
3
namespace Backpack\CRUD\app\Library\CrudPanel\Traits;
4
5
use Illuminate\Support\Str;
6
7
trait FieldsProtectedMethods
8
{
9
    /**
10
     * If field has entity we want to get the relation type from it.
11
     *
12
     * @param  array  $field
13
     * @return array
14
     */
15
    public function makeSureFieldHasRelationType($field)
16
    {
17
        $field['relation_type'] = $field['relation_type'] ?? $this->inferRelationTypeFromRelationship($field);
0 ignored issues
show
Bug introduced by
It seems like inferRelationTypeFromRelationship() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

17
        $field['relation_type'] = $field['relation_type'] ?? $this->/** @scrutinizer ignore-call */ inferRelationTypeFromRelationship($field);
Loading history...
18
19
        return $field;
20
    }
21
22
    /**
23
     * If field has entity we want to make sure it also has a model for that relation.
24
     *
25
     * @param  array  $field
26
     * @return array
27
     */
28
    public function makeSureFieldHasModel($field)
29
    {
30
        $field['model'] = $field['model'] ?? $this->inferFieldModelFromRelationship($field);
0 ignored issues
show
Bug introduced by
It seems like inferFieldModelFromRelationship() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

30
        $field['model'] = $field['model'] ?? $this->/** @scrutinizer ignore-call */ inferFieldModelFromRelationship($field);
Loading history...
31
32
        return $field;
33
    }
34
35
    /**
36
     * Based on relation type we can guess if pivot is set.
37
     *
38
     * @param  array  $field
39
     * @return array
40
     */
41
    public function makeSureFieldHasPivot($field)
42
    {
43
        $field['pivot'] = $field['pivot'] ?? $this->guessIfFieldHasPivotFromRelationType($field['relation_type']);
0 ignored issues
show
Bug introduced by
It seems like guessIfFieldHasPivotFromRelationType() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

43
        $field['pivot'] = $field['pivot'] ?? $this->/** @scrutinizer ignore-call */ guessIfFieldHasPivotFromRelationType($field['relation_type']);
Loading history...
44
45
        return $field;
46
    }
47
48
    /**
49
     * Based on relation type we can try to guess if it is a multiple field.
50
     *
51
     * @param  array  $field
52
     * @return array
53
     */
54
    public function makeSureFieldHasMultiple($field)
55
    {
56
        if (isset($field['relation_type'])) {
57
            $field['multiple'] = $field['multiple'] ?? $this->guessIfFieldHasMultipleFromRelationType($field['relation_type']);
0 ignored issues
show
Bug introduced by
It seems like guessIfFieldHasMultipleFromRelationType() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

57
            $field['multiple'] = $field['multiple'] ?? $this->/** @scrutinizer ignore-call */ guessIfFieldHasMultipleFromRelationType($field['relation_type']);
Loading history...
58
        }
59
60
        return $field;
61
    }
62
63
    /**
64
     * In case field name is dot notation we want to convert it to a valid HTML array field name for validation purposes.
65
     *
66
     * @param  array  $field
67
     * @return array
68
     */
69
    public function overwriteFieldNameFromDotNotationToArray($field)
70
    {
71
        if (! is_array($field['name']) && strpos($field['name'], '.') !== false && isset($field['relation_type']) && in_array($field['relation_type'], ['HasOne', 'MorphOne'])) {
72
            $entity_array = explode('.', $field['name']);
73
            $name_string = '';
74
75
            foreach ($entity_array as $key => $array_entity) {
76
                $name_string .= ($key == 0) ? $array_entity : '['.$array_entity.']';
77
            }
78
79
            $field['name'] = $name_string;
80
        }
81
82
        return $field;
83
    }
84
85
    /**
86
     * If the field_definition_array array is a string, it means the programmer was lazy
87
     * and has only passed the name of the field. Turn that into a proper array.
88
     *
89
     * @param  string|array  $field  The field definition array (or string).
90
     * @return array
91
     */
92
    protected function makeSureFieldHasName($field)
93
    {
94
        if (is_string($field)) {
95
            return ['name' => $field];
96
        }
97
98
        if (is_array($field) && ! isset($field['name'])) {
99
            abort(500, 'All fields must have their name defined');
100
        }
101
102
        return $field;
103
    }
104
105
    /**
106
     * If entity is not present, but it looks like the field SHOULD be a relationship field,
107
     * try to determine the method on the model that defines the relationship, and pass it to
108
     * the field as 'entity'.
109
     *
110
     * @param  [type] $field [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
111
     * @return [type]        [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
112
     */
113
    protected function makeSureFieldHasEntity($field)
114
    {
115
        if (isset($field['entity'])) {
116
            return $field;
117
        }
118
119
        // if the name is an array it's definitely not a relationship
120
        if (is_array($field['name'])) {
121
            return $field;
122
        }
123
124
        //if the name is dot notation we are sure it's a relationship
125
        if (strpos($field['name'], '.') !== false) {
126
            $field['entity'] = $field['name'];
127
128
            return $field;
129
        }
130
131
        // if there's a method on the model with this name
132
        if (method_exists($this->model, $field['name'])) {
133
            $field['entity'] = $field['name'];
134
135
            return $field;
136
        }
137
138
        // if the name ends with _id and that method exists,
139
        // we can probably use it as an entity
140
        if (Str::endsWith($field['name'], '_id')) {
141
            $possibleMethodName = Str::replaceLast('_id', '', $field['name']);
142
143
            if (method_exists($this->model, $possibleMethodName)) {
144
                $field['entity'] = $possibleMethodName;
145
146
                return $field;
147
            }
148
        }
149
150
        return $field;
151
    }
152
153
    protected function makeSureFieldHasAttribute($field)
154
    {
155
        // if there's a model defined, but no attribute
156
        // guess an attribute using the identifiableAttribute functionality in CrudTrait
157
        if (isset($field['model']) && ! isset($field['attribute']) && method_exists($field['model'], 'identifiableAttribute')) {
158
            $field['attribute'] = call_user_func([(new $field['model']), 'identifiableAttribute']);
159
        }
160
161
        return $field;
162
    }
163
164
    /**
165
     * Set the label of a field, if it's missing, by capitalizing the name and replacing
166
     * underscores with spaces.
167
     *
168
     * @param  array  $field  Field definition array.
169
     * @return array Field definition array that contains label too.
170
     */
171
    protected function makeSureFieldHasLabel($field)
172
    {
173
        if (! isset($field['label'])) {
174
            $name = is_array($field['name']) ? $field['name'][0] : $field['name'];
175
            $name = str_replace('_id', '', $name);
176
            $field['label'] = mb_ucfirst(str_replace('_', ' ', $name));
177
        }
178
179
        return $field;
180
    }
181
182
    /**
183
     * Set the type of a field, if it's missing, by inferring it from the
184
     * db column type.
185
     *
186
     * @param  array  $field  Field definition array.
187
     * @return array Field definition array that contains type too.
188
     */
189
    protected function makeSureFieldHasType($field)
190
    {
191
        if (! isset($field['type'])) {
192
            $field['type'] = isset($field['relation_type']) ? $this->inferFieldTypeFromFieldRelation($field) : $this->inferFieldTypeFromDbColumnType($field['name']);
0 ignored issues
show
Bug introduced by
It seems like inferFieldTypeFromFieldRelation() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

192
            $field['type'] = isset($field['relation_type']) ? $this->/** @scrutinizer ignore-call */ inferFieldTypeFromFieldRelation($field) : $this->inferFieldTypeFromDbColumnType($field['name']);
Loading history...
Bug introduced by
It seems like inferFieldTypeFromDbColumnType() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

192
            $field['type'] = isset($field['relation_type']) ? $this->inferFieldTypeFromFieldRelation($field) : $this->/** @scrutinizer ignore-call */ inferFieldTypeFromDbColumnType($field['name']);
Loading history...
193
        }
194
195
        return $field;
196
    }
197
198
    /**
199
     * Enable the tabs functionality, if a field has a tab defined.
200
     *
201
     * @param  array  $field  Field definition array.
202
     * @return void
203
     */
204
    protected function enableTabsIfFieldUsesThem($field)
205
    {
206
        // if a tab was mentioned, we should enable it
207
        if (isset($field['tab'])) {
208
            if (! $this->tabsEnabled()) {
0 ignored issues
show
Bug introduced by
It seems like tabsEnabled() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

208
            if (! $this->/** @scrutinizer ignore-call */ tabsEnabled()) {
Loading history...
209
                $this->enableTabs();
0 ignored issues
show
Bug introduced by
The method enableTabs() does not exist on Backpack\CRUD\app\Librar...\FieldsProtectedMethods. Did you maybe mean enableTabsIfFieldUsesThem()? ( Ignorable by Annotation )

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

209
                $this->/** @scrutinizer ignore-call */ 
210
                       enableTabs();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
210
            }
211
        }
212
    }
213
214
    /**
215
     * Add a field to the current operation, using the Settings API.
216
     *
217
     * @param  array  $field  Field definition array.
218
     */
219
    protected function addFieldToOperationSettings($field)
220
    {
221
        $fieldKey = $this->getFieldKey($field);
222
223
        $allFields = $this->getOperationSetting('fields');
0 ignored issues
show
Bug introduced by
It seems like getOperationSetting() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

223
        /** @scrutinizer ignore-call */ 
224
        $allFields = $this->getOperationSetting('fields');
Loading history...
Unused Code introduced by
The assignment to $allFields is dead and can be removed.
Loading history...
224
        $allFields = array_merge($this->fields(), [$fieldKey => $field]);
0 ignored issues
show
Bug introduced by
It seems like fields() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

224
        $allFields = array_merge($this->/** @scrutinizer ignore-call */ fields(), [$fieldKey => $field]);
Loading history...
225
226
        $this->setOperationSetting('fields', $allFields);
0 ignored issues
show
Bug introduced by
It seems like setOperationSetting() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

226
        $this->/** @scrutinizer ignore-call */ 
227
               setOperationSetting('fields', $allFields);
Loading history...
227
    }
228
229
    /**
230
     * Get the string that should be used as an array key, for the attributive array
231
     * where the fields are stored for the current operation.
232
     *
233
     * The array key for the field should be:
234
     * - name (if the name is a string)
235
     * - name1_name2_name3 (if the name is an array)
236
     *
237
     * @param  array  $field  Field definition array.
238
     * @return string The string that should be used as array key.
239
     */
240
    protected function getFieldKey($field)
241
    {
242
        if (is_array($field['name'])) {
243
            return implode('_', $field['name']);
244
        }
245
246
        return $field['name'];
247
    }
248
}
249