Completed
Pull Request — master (#1350)
by
unknown
03:01
created

Form::__construct()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 4
nop 1
dl 0
loc 12
rs 9.4285
c 0
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 72 and the first side effect is on line 50.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
3
namespace Encore\Admin\Widgets;
4
5
use Encore\Admin\Form\Field;
6
use Illuminate\Contracts\Support\Arrayable;
7
use Illuminate\Contracts\Support\Renderable;
8
9
/**
10
 * Class Form.
11
 *
12
 * @method Field\Text           text($name, $label = '')
13
 * @method Field\Password       password($name, $label = '')
14
 * @method Field\Checkbox       checkbox($name, $label = '')
15
 * @method Field\Radio          radio($name, $label = '')
16
 * @method Field\Select         select($name, $label = '')
17
 * @method Field\MultipleSelect multipleSelect($name, $label = '')
18
 * @method Field\Textarea       textarea($name, $label = '')
19
 * @method Field\Hidden         hidden($name, $label = '')
20
 * @method Field\Id             id($name, $label = '')
21
 * @method Field\Ip             ip($name, $label = '')
22
 * @method Field\Url            url($name, $label = '')
23
 * @method Field\Color          color($name, $label = '')
24
 * @method Field\Email          email($name, $label = '')
25
 * @method Field\Mobile         mobile($name, $label = '')
26
 * @method Field\Slider         slider($name, $label = '')
27
 * @method Field\Map            map($latitude, $longitude, $label = '')
28
 * @method Field\Editor         editor($name, $label = '')
29
 * @method Field\File           file($name, $label = '')
30
 * @method Field\Image          image($name, $label = '')
31
 * @method Field\Date           date($name, $label = '')
32
 * @method Field\Datetime       datetime($name, $label = '')
33
 * @method Field\Time           time($name, $label = '')
34
 * @method Field\DateRange      dateRange($start, $end, $label = '')
35
 * @method Field\DateTimeRange  dateTimeRange($start, $end, $label = '')
36
 * @method Field\TimeRange      timeRange($start, $end, $label = '')
37
 * @method Field\Number         number($name, $label = '')
38
 * @method Field\Currency       currency($name, $label = '')
39
 * @method Field\Json           json($name, $label = '')
40
 * @method Field\SwitchField    switch ($name, $label = '')
41
 * @method Field\Display        display($name, $label = '')
42
 * @method Field\Rate           rate($name, $label = '')
43
 * @method Field\Divide         divide()
44
 * @method Field\Decimal        decimal($column, $label = '')
45
 * @method Field\Html           html($html)
46
 * @method Field\Tags           tags($column, $label = '')
47
 * @method Field\Icon           icon($column, $label = '')
48
 * @method \App\Admin\Extensions\Form\Script script($script, $arguments)
49
 */
50
class Form implements Renderable
0 ignored issues
show
Bug introduced by
Possible parse error: class missing opening or closing brace
Loading history...
51
{
52
    /**
53
     * @var Field[]
54
     */
55
    protected $fields = [];
56
57
    /**
58
     * @var array
59
     */
60
    protected $data = [];
61
62
    /**
63
     * @var array
64
     */
65
    protected $attributes = [];
66
67
    /**
68
     * Form constructor.
69
     *
70
     * @param array $data
71
     */
72
    public function __construct($data = [])
73
    {
74
        if ($data instanceof Arrayable) {
75
            $data = $data->toArray();
76
        }
77
78
        if (!empty($data)) {
79
            $this->data = $data;
80
        }
81
82
        $this->initFormAttributes();
83
    }
84
85
    /**
86
     * Initialize the form attributes.
87
     */
88
    protected function initFormAttributes()
89
    {
90
        $this->attributes = [
91
            'method'         => 'POST',
92
            'action'         => '',
93
            'class'          => 'form-horizontal',
94
            'accept-charset' => 'UTF-8',
95
            'pjax-container' => true,
96
            'fieldWidth'     => 8,
97
            'labelWidth'     => 2,
98
        ];
99
    }
100
101
    /**
102
     * Action uri of the form.
103
     *
104
     * @param string $action
105
     *
106
     * @return $this
107
     */
108
    public function action($action)
109
    {
110
        return $this->attribute('action', $action);
111
    }
112
113
    /**
114
     * Method of the form.
115
     *
116
     * @param string $method
117
     *
118
     * @return $this
119
     */
120
    public function method($method = 'POST')
121
    {
122
        return $this->attribute('method', strtoupper($method));
123
    }
124
125
    /**
126
     * Add form attributes.
127
     *
128
     * @param string|array $attr
129
     * @param string       $value
130
     *
131
     * @return $this
132
     */
133
    public function attribute($attr, $value = '')
134
    {
135
        if (is_array($attr)) {
136
            foreach ($attr as $key => $value) {
137
                $this->attribute($key, $value);
138
            }
139
        } else {
140
            $this->attributes[$attr] = $value;
141
        }
142
143
        return $this;
144
    }
145
146
    /**
147
     * Disable Pjax.
148
     *
149
     * @return $this
150
     */
151
    public function disablePjax()
152
    {
153
        array_forget($this->attributes, 'pjax-container');
154
155
        return $this;
156
    }
157
158
    /**
159
     * Set field and label width in current form.
160
     *
161
     * @param int $fieldWidth
162
     * @param int $labelWidth
163
     *
164
     * @return $this
165
     */
166
    public function setWidth($fieldWidth = 8, $labelWidth = 2)
167
    {
168
        collect($this->fields)->each(function ($field) use ($fieldWidth, $labelWidth) {
169
            /* @var Field $field */
170
            $field->setWidth($fieldWidth, $labelWidth);
171
        });
172
        $this->attributes['fieldWidth'] = $fieldWidth;
173
        $this->attributes['labelWidth'] = $labelWidth;
174
175
        return $this;
176
    }
177
178
    /**
179
     * Find field class with given name.
180
     *
181
     * @param string $method
182
     *
183
     * @return bool|string
184
     */
185
    public static function findFieldClass($method)
186
    {
187
        $class = array_get(\Encore\Admin\Form::$availableFields, $method);
188
189
        if (class_exists($class)) {
190
            return $class;
191
        }
192
193
        return false;
194
    }
195
196
    /**
197
     * Add a form field to form.
198
     *
199
     * @param Field $field
200
     *
201
     * @return $this
202
     */
203
    protected function pushField(Field &$field)
204
    {
205
        array_push($this->fields, $field);
206
207
        return $this;
208
    }
209
210
    /**
211
     * Get variables for render form.
212
     *
213
     * @return array
214
     */
215
    protected function getVariables()
216
    {
217
        foreach ($this->fields as $field) {
218
            $field->fill($this->data);
219
        }
220
221
        return [
222
            'fields'     => $this->fields,
223
            'attributes' => $this->formatAttribute(),
224
<<<<<<< HEAD
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_SL, expecting ']'
Loading history...
225
            'fieldWidth' => $this->attributes['fieldWidth'],
226
            'labelWidth' => $this->attributes['labelWidth']
227
=======
228
            'method'     => $this->attributes['method'],
229
>>>>>>> 1.5
230
        ];
231
    }
232
233
    /**
234
     * Format form attributes form array to html.
235
     *
236
     * @param array $attributes
237
     *
238
     * @return string
239
     */
240
    public function formatAttribute($attributes = [])
241
    {
242
        $attributes = $attributes ?: $this->attributes;
243
244
        if ($this->hasFile()) {
245
            $attributes['enctype'] = 'multipart/form-data';
246
        }
247
248
        $html = [];
249
        foreach ($attributes as $key => $val) {
250
            $html[] = "$key=\"$val\"";
251
        }
252
253
        return implode(' ', $html) ?: '';
254
    }
255
256
    /**
257
     * Determine if form fields has files.
258
     *
259
     * @return bool
260
     */
261
    public function hasFile()
262
    {
263
        foreach ($this->fields as $field) {
264
            if ($field instanceof Field\File) {
265
                return true;
266
            }
267
        }
268
269
        return false;
270
    }
271
272
    /**
273
     * Generate a Field object and add to form builder if Field exists.
274
     *
275
     * @param string $method
276
     * @param array  $arguments
277
     *
278
     * @return Field|null
279
     */
280
    public function __call($method, $arguments)
281
    {
282
        if ($className = static::findFieldClass($method)) {
283
            $name = array_get($arguments, 0, '');
284
285
            $element = new $className($name, array_slice($arguments, 1));
286
287
            $this->pushField($element);
288
289
            return $element;
290
        }
291
    }
292
293
    /**
294
     * Render the form.
295
     *
296
     * @return string
297
     */
298
    public function render()
299
    {
300
        return view('admin::widgets.form', $this->getVariables())->render();
301
    }
302
303
    /**
304
     * Output as string.
305
     *
306
     * @return string
307
     */
308
    public function __toString()
309
    {
310
        return $this->render();
311
    }
312
}
313