Completed
Pull Request — master (#335)
by
unknown
05:08
created

FormBuilder::addAsset()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 10
Ratio 100 %

Importance

Changes 0
Metric Value
dl 10
loc 10
c 0
b 0
f 0
rs 9.4285
cc 2
eloc 5
nc 2
nop 2
1
<?php namespace Anomaly\Streams\Platform\Ui\Form;
2
3
use Anomaly\Streams\Platform\Addon\FieldType\FieldType;
4
use Anomaly\Streams\Platform\Assignment\Contract\AssignmentInterface;
5
use Anomaly\Streams\Platform\Entry\Contract\EntryInterface;
6
use Anomaly\Streams\Platform\Field\Contract\FieldInterface;
7
use Anomaly\Streams\Platform\Model\EloquentModel;
8
use Anomaly\Streams\Platform\Stream\Contract\StreamInterface;
9
use Anomaly\Streams\Platform\Support\Collection;
10
use Anomaly\Streams\Platform\Traits\FiresCallbacks;
11
use Anomaly\Streams\Platform\Ui\Button\Contract\ButtonInterface;
12
use Anomaly\Streams\Platform\Ui\Form\Command\AddAssets;
13
use Anomaly\Streams\Platform\Ui\Form\Command\BuildForm;
14
use Anomaly\Streams\Platform\Ui\Form\Command\FlashFieldValues;
15
use Anomaly\Streams\Platform\Ui\Form\Command\FlashFormErrors;
16
use Anomaly\Streams\Platform\Ui\Form\Command\LoadForm;
17
use Anomaly\Streams\Platform\Ui\Form\Command\LoadFormValues;
18
use Anomaly\Streams\Platform\Ui\Form\Command\MakeForm;
19
use Anomaly\Streams\Platform\Ui\Form\Command\PopulateFields;
20
use Anomaly\Streams\Platform\Ui\Form\Command\PostForm;
21
use Anomaly\Streams\Platform\Ui\Form\Command\SaveForm;
22
use Anomaly\Streams\Platform\Ui\Form\Command\SetFormResponse;
23
use Anomaly\Streams\Platform\Ui\Form\Command\ValidateForm;
24
use Anomaly\Streams\Platform\Ui\Form\Component\Action\ActionCollection;
25
use Anomaly\Streams\Platform\Ui\Form\Component\Action\Contract\ActionInterface;
26
use Anomaly\Streams\Platform\Ui\Form\Contract\FormRepositoryInterface;
27
use Closure;
28
use Illuminate\Contracts\Support\MessageBag;
29
use Illuminate\Foundation\Bus\DispatchesJobs;
30
use Symfony\Component\HttpFoundation\Response;
31
32
/**
33
 * Class FormBuilder
34
 *
35
 * @link   http://pyrocms.com/
36
 * @author PyroCMS, Inc. <[email protected]>
37
 * @author Ryan Thompson <[email protected]>
38
 */
39
class FormBuilder
40
{
41
42
    use DispatchesJobs;
43
    use FiresCallbacks;
44
45
    /**
46
     * The ajax flag.
47
     *
48
     * @var bool
49
     */
50
    protected $ajax = false;
51
52
    /**
53
     * The form handler.
54
     *
55
     * @var null|string
56
     */
57
    protected $handler = null;
58
59
    /**
60
     * The form validator.
61
     *
62
     * @var null|string
63
     */
64
    protected $validator = null;
65
66
    /**
67
     * The form repository.
68
     *
69
     * @var null|FormRepositoryInterface
70
     */
71
    protected $repository = null;
72
73
    /**
74
     * The form model.
75
     *
76
     * @var null
77
     */
78
    protected $model = null;
79
80
    /**
81
     * The entry object.
82
     *
83
     * @var null|int
84
     */
85
    protected $entry = null;
86
87
    /**
88
     * The fields config.
89
     *
90
     * @var array|string
91
     */
92
    protected $fields = [];
93
94
    /**
95
     * Fields to skip.
96
     *
97
     * @var array|string
98
     */
99
    protected $skips = [];
100
101
    /**
102
     * The actions config.
103
     *
104
     * @var array|string
105
     */
106
    protected $actions = [];
107
108
    /**
109
     * The buttons config.
110
     *
111
     * @var array|string
112
     */
113
    protected $buttons = [];
114
115
    /**
116
     * The form options.
117
     *
118
     * @var array
119
     */
120
    protected $options = [];
121
122
    /**
123
     * The form sections.
124
     *
125
     * @var array
126
     */
127
    protected $sections = [];
128
129
    /**
130
     * The form assets.
131
     *
132
     * @var array
133
     */
134
    protected $assets = [];
135
136
    /**
137
     * The save flag.
138
     *
139
     * @var bool
140
     */
141
    protected $save = true;
142
143
    /**
144
     * The read only flag.
145
     *
146
     * @var bool
147
     */
148
    protected $readOnly = false;
149
150
    /**
151
     * The form object.
152
     *
153
     * @var Form
154
     */
155
    protected $form;
156
157
    /**
158
     * Crate a new FormBuilder instance.
159
     *
160
     * @param Form $form
161
     */
162
    public function __construct(Form $form)
163
    {
164
        $this->form = $form;
165
    }
166
167
    /**
168
     * Build the form.
169
     *
170
     * @param  null $entry
171
     * @return $this
172
     */
173
    public function build($entry = null)
174
    {
175
        if ($entry) {
176
            $this->entry = $entry;
177
        }
178
179
        $this->fire('ready', ['builder' => $this]);
180
181
        $this->dispatch(new BuildForm($this));
182
183
        $this->fire('built', ['builder' => $this]);
184
185
        return $this;
186
    }
187
188
    /**
189
     * Make the form.
190
     *
191
     * @param  null $entry
192
     * @return $this
193
     */
194
    public function make($entry = null)
195
    {
196
        $this->build($entry);
197
        $this->post();
198
199
        $this->fire('make', ['builder' => $this]);
200
201
        if ($this->getFormResponse() === null) {
202
            $this->dispatch(new LoadForm($this));
203
            $this->dispatch(new AddAssets($this));
204
            $this->dispatch(new MakeForm($this));
205
        }
206
207
        return $this;
208
    }
209
210
    /**
211
     * Handle the form post.
212
     *
213
     * @param  null $entry
214
     * @return $this
215
     * @throws \Exception
216
     */
217
    public function handle($entry = null)
218
    {
219
        if (!app('request')->isMethod('post')) {
220
            throw new \Exception('The handle method must be used with a POST request.');
221
        }
222
223
        $this->build($entry);
224
        $this->post();
225
226
        return $this;
227
    }
228
229
    /**
230
     * Trigger post operations
231
     * for the form.
232
     *
233
     * @return $this
234
     */
235
    public function post()
236
    {
237
        if (app('request')->isMethod('post')) {
238
            $this->fire('post', ['builder' => $this]);
239
240
            if ($this->hasPostData()) {
241
                $this->dispatch(new PostForm($this));
242
            }
243
        } else {
244
            $this->dispatch(new PopulateFields($this));
245
        }
246
247
        return $this;
248
    }
249
250
    /**
251
     * Validate the form.
252
     *
253
     * @return $this
254
     */
255
    public function validate()
256
    {
257
        $this->dispatch(new LoadFormValues($this));
258
        $this->dispatch(new ValidateForm($this));
259
260
        return $this;
261
    }
262
263
    /**
264
     * Flash form information to be
265
     * used in conjunction with redirect
266
     * type responses (not self handling).
267
     */
268
    public function flash()
269
    {
270
        $this->dispatch(new FlashFormErrors($this));
271
        $this->dispatch(new FlashFieldValues($this));
272
    }
273
274
    /**
275
     * Render the form.
276
     *
277
     * @param  null $entry
278
     * @return Response
279
     */
280
    public function render($entry = null)
281
    {
282
        $this->make($entry);
283
284
        if (!$this->form->getResponse()) {
285
            $this->dispatch(new SetFormResponse($this));
286
        }
287
288
        return $this->form->getResponse();
289
    }
290
291
    /**
292
     * Fire field events.
293
     *
294
     * @param       $trigger
295
     * @param array $payload
296
     */
297
    public function fireFieldEvents($trigger, array $payload = [])
298
    {
299
        /* @var FieldType $field */
300
        foreach ($this->getFormFields() as $field) {
301
            $field->fire($trigger, array_merge(['builder' => $this], $payload));
302
        }
303
    }
304
305
    /**
306
     * Save the form.
307
     */
308
    public function saveForm()
309
    {
310
        $this->dispatch(new SaveForm($this));
311
    }
312
313
    /**
314
     * Get the form object.
315
     *
316
     * @return Form
317
     */
318
    public function getForm()
319
    {
320
        return $this->form;
321
    }
322
323
    /**
324
     * Get the form presenter.
325
     *
326
     * @return FormPresenter
327
     */
328
    public function getFormPresenter()
329
    {
330
        return $this->form->getPresenter();
331
    }
332
333
    /**
334
     * Get the ajax flag.
335
     *
336
     * @return bool
337
     */
338
    public function isAjax()
339
    {
340
        return $this->ajax;
341
    }
342
343
    /**
344
     * Set the ajax flag.
345
     *
346
     * @param $ajax
347
     * @return $this
348
     */
349
    public function setAjax($ajax)
350
    {
351
        $this->ajax = $ajax;
352
353
        return $this;
354
    }
355
356
    /**
357
     * Get the handler.
358
     *
359
     * @return null|string
360
     */
361
    public function getHandler()
362
    {
363
        return $this->handler;
364
    }
365
366
    /**
367
     * Set the handler.
368
     *
369
     * @param $handler
370
     * @return $this
371
     */
372
    public function setHandler($handler)
373
    {
374
        $this->handler = $handler;
375
376
        return $this;
377
    }
378
379
    /**
380
     * Get the validator.
381
     *
382
     * @return null|string
383
     */
384
    public function getValidator()
385
    {
386
        return $this->validator;
387
    }
388
389
    /**
390
     * Set the validator.
391
     *
392
     * @param $validator
393
     * @return $this
394
     */
395
    public function setValidator($validator)
396
    {
397
        $this->validator = $validator;
398
399
        return $this;
400
    }
401
402
    /**
403
     * Get the repository.
404
     *
405
     * @return FormRepositoryInterface|null
406
     */
407
    public function getRepository()
408
    {
409
        return $this->repository;
410
    }
411
412
    /**
413
     * Set the form repository.
414
     *
415
     * @param  FormRepositoryInterface $repository
416
     * @return $this
417
     */
418
    public function setRepository(FormRepositoryInterface $repository)
419
    {
420
        $this->repository = $repository;
421
422
        return $this;
423
    }
424
425
    /**
426
     * Set the form model.
427
     *
428
     * @param  $model
429
     * @return $this
430
     */
431
    public function setModel($model)
432
    {
433
        $this->model = $model;
434
435
        return $this;
436
    }
437
438
    /**
439
     * Get the form model.
440
     *
441
     * @return null
442
     */
443
    public function getModel()
444
    {
445
        return $this->model;
446
    }
447
448
    /**
449
     * Set the entry object.
450
     *
451
     * @param  $entry
452
     * @return $this
453
     */
454
    public function setEntry($entry)
455
    {
456
        $this->entry = $entry;
457
458
        return $this;
459
    }
460
461
    /**
462
     * Get the entry object.
463
     *
464
     * @return null|EntryInterface|FieldInterface|mixed
465
     */
466
    public function getEntry()
467
    {
468
        return $this->entry;
469
    }
470
471
    /**
472
     * Set the fields.
473
     *
474
     * @param  $fields
475
     * @return $this
476
     */
477
    public function setFields($fields)
478
    {
479
        $this->fields = $fields;
480
481
        return $this;
482
    }
483
484
    /**
485
     * Get the fields.
486
     *
487
     * @return array
488
     */
489
    public function getFields()
490
    {
491
        return $this->fields;
492
    }
493
494
    /**
495
     * Add a field.
496
     *
497
     * @param   $field
498
     */
499
    public function addField($field)
500
    {
501
        $this->fields[array_get($field, 'field')] = $field;
502
    }
503
504
    /**
505
     * Add fields.
506
     *
507
     * @param array $fields
508
     */
509
    public function addFields(array $fields)
510
    {
511
        $this->fields = array_merge($this->fields, $fields);
512
    }
513
514
    /**
515
     * Get the skipped fields.
516
     *
517
     * @return array
518
     */
519
    public function getSkips()
520
    {
521
        return $this->skips;
522
    }
523
524
    /**
525
     * Set the skipped fields.
526
     *
527
     * @param $skips
528
     * @return $this
529
     */
530
    public function setSkips($skips)
531
    {
532
        $this->skips = $skips;
533
534
        return $this;
535
    }
536
537
    /**
538
     * Merge in skips.
539
     *
540
     * @param  array|string $skips
541
     * @return $this
542
     */
543
    public function mergeSkips($skips) {
544
        $this->skips = array_merge($this->getSkips(), $skips);
545
546
        return $this;
547
    }
548
549
    /**
550
     * Add a skipped field.
551
     *
552
     * @param $fieldSlug
553
     * @return $this
554
     */
555
    public function skipField($fieldSlug)
556
    {
557
        $this->skips[] = $fieldSlug;
558
559
        return $this;
560
    }
561
562
    /**
563
     * Set the actions config.
564
     *
565
     * @param  $actions
566
     * @return $this
567
     */
568
    public function setActions($actions)
569
    {
570
        $this->actions = $actions;
571
572
        return $this;
573
    }
574
575
    /**
576
     * Add an action.
577
     *
578
     * @param        $slug
579
     * @param  array $definition
580
     * @return $this
581
     */
582
    public function addAction($slug, array $definition = [])
583
    {
584
        if ($definition) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $definition of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
585
            $this->actions[$slug] = $definition;
586
        } else {
587
            $this->actions[] = $slug;
588
        }
589
590
        return $this;
591
    }
592
593
    /**
594
     * Get the actions config.
595
     *
596
     * @return array
597
     */
598
    public function getActions()
599
    {
600
        return $this->actions;
601
    }
602
603
    /**
604
     * Set the buttons config.
605
     *
606
     * @param  $buttons
607
     * @return $this
608
     */
609
    public function setButtons($buttons)
610
    {
611
        $this->buttons = $buttons;
612
613
        return $this;
614
    }
615
616
    /**
617
     * Get the buttons config.
618
     *
619
     * @return array
620
     */
621
    public function getButtons()
622
    {
623
        return $this->buttons;
624
    }
625
626
    /**
627
     * The the options.
628
     *
629
     * @return array
630
     */
631
    public function getOptions()
632
    {
633
        return $this->options;
634
    }
635
636
    /**
637
     * Set the options.
638
     *
639
     * @param  array|string $options
640
     * @return $this
641
     */
642
    public function setOptions($options)
643
    {
644
        $this->options = $options;
0 ignored issues
show
Documentation Bug introduced by
It seems like $options can also be of type string. However, the property $options is declared as type array. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
645
646
        return $this;
647
    }
648
649
    /**
650
     * Merge in options.
651
     *
652
     * @param  array|string $options
653
     * @return $this
654
     */
655
    public function mergeOptions($options)
656
    {
657
        $this->options = array_merge($this->options, $options);
658
659
        return $this;
660
    }
661
662
    /**
663
     * Get the sections.
664
     *
665
     * @return array
666
     */
667
    public function getSections()
668
    {
669
        return $this->sections;
670
    }
671
672
    /**
673
     * Set the sections.
674
     *
675
     * @param  array|Closure $sections
676
     * @return $this
677
     */
678
    public function setSections($sections)
679
    {
680
        $this->sections = $sections;
0 ignored issues
show
Documentation Bug introduced by
It seems like $sections can also be of type object<Closure>. However, the property $sections is declared as type array. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
681
682
        return $this;
683
    }
684
685
    /**
686
     * Add a section.
687
     *
688
     * @param        $slug
689
     * @param  array $section
690
     * @return $this
691
     */
692
    public function addSection($slug, array $section)
693
    {
694
        array_set($this->sections, $slug, $section);
695
696
        return $this;
697
    }
698
699
    /**
700
     * Add a section tab.
701
     *
702
     * @param        $section
703
     * @param        $slug
704
     * @param  array $tab
705
     * @return $this
706
     */
707
    public function addSectionTab($section, $slug, array $tab)
708
    {
709
        array_set($this->sections, "{$section}.tabs.{$slug}", $tab);
710
711
        return $this;
712
    }
713
714
    /**
715
     * Get an option value.
716
     *
717
     * @param        $key
718
     * @param  null  $default
719
     * @return mixed
720
     */
721
    public function getOption($key, $default = null)
722
    {
723
        return array_get($this->options, $key, $default);
724
    }
725
726
    /**
727
     * Set an option value.
728
     *
729
     * @param $key
730
     * @param $value
731
     * @return $this
732
     */
733
    public function setOption($key, $value)
734
    {
735
        array_set($this->options, $key, $value);
736
737
        return $this;
738
    }
739
740
    /**
741
     * Get the assets.
742
     *
743
     * @return array
744
     */
745
    public function getAssets()
746
    {
747
        return $this->assets;
748
    }
749
750
    /**
751
     * Set the assets.
752
     *
753
     * @param $assets
754
     * @return $this
755
     */
756
    public function setAssets($assets)
757
    {
758
        $this->assets = $assets;
759
760
        return $this;
761
    }
762
763
    /**
764
     * Add an asset.
765
     *
766
     * @param $collection
767
     * @param $asset
768
     * @return $this
769
     */
770 View Code Duplication
    public function addAsset($collection, $asset)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
771
    {
772
        if (!isset($this->assets[$collection])) {
773
            $this->assets[$collection] = [];
774
        }
775
776
        $this->assets[$collection][] = $asset;
777
778
        return $this;
779
    }
780
781
    /**
782
     * Get the form's stream.
783
     *
784
     * @return StreamInterface|null
785
     */
786
    public function getFormStream()
787
    {
788
        return $this->form->getStream();
789
    }
790
791
    /**
792
     * Get a form option value.
793
     *
794
     * @param        $key
795
     * @param  null  $default
796
     * @return mixed
797
     */
798
    public function getFormOption($key, $default = null)
799
    {
800
        return $this->form->getOption($key, $default);
801
    }
802
803
    /**
804
     * Set a form option value.
805
     *
806
     * @param $key
807
     * @param $value
808
     * @return $this
809
     */
810
    public function setFormOption($key, $value)
811
    {
812
        $this->form->setOption($key, $value);
813
814
        return $this;
815
    }
816
817
    /**
818
     * Get the form options.
819
     *
820
     * @return \Anomaly\Streams\Platform\Support\Collection
821
     */
822
    public function getFormOptions()
823
    {
824
        return $this->form->getOptions();
825
    }
826
827
    /**
828
     * Get the form model.
829
     *
830
     * @return \Anomaly\Streams\Platform\Entry\EntryModel|EloquentModel|null
831
     */
832
    public function getFormModel()
833
    {
834
        return $this->form->getModel();
835
    }
836
837
    /**
838
     * Get the form entry.
839
     *
840
     * @return EloquentModel|EntryInterface|FieldInterface|AssignmentInterface
841
     */
842
    public function getFormEntry()
843
    {
844
        return $this->form->getEntry();
845
    }
846
847
    /**
848
     * Return the form entry's ID.
849
     *
850
     * @return int|mixed|null
851
     */
852
    public function getFormEntryId()
853
    {
854
        $entry = $this->getFormEntry();
855
856
        if (!$entry instanceof EloquentModel) {
857
            return null;
858
        }
859
860
        return $entry->getId();
861
    }
862
863
    /**
864
     * Get the contextual entry ID.
865
     *
866
     * @return int|null
867
     */
868
    public function getContextualId()
869
    {
870
        return $this->getFormEntryId();
871
    }
872
873
    /**
874
     * Get the form mode.
875
     *
876
     * @return null|string
877
     */
878
    public function getFormMode()
879
    {
880
        return $this->form->getMode();
881
    }
882
883
    /**
884
     * Set the form mode.
885
     *
886
     * @param $mode
887
     * @return $this
888
     */
889
    public function setFormMode($mode)
890
    {
891
        $this->form->setMode($mode);
892
893
        return $this;
894
    }
895
896
    /**
897
     * Get a form value.
898
     *
899
     * @param        $key
900
     * @param  null  $default
901
     * @return mixed
902
     */
903
    public function getFormValue($key, $default = null)
904
    {
905
        return $this->form->getValue($key, $default);
906
    }
907
908
    /**
909
     * Set a form value.
910
     *
911
     * @param $key
912
     * @param $value
913
     * @return $this
914
     */
915
    public function setFormValue($key, $value)
916
    {
917
        $this->form->setValue($key, $value);
918
919
        return $this;
920
    }
921
922
    /**
923
     * Get the form values.
924
     *
925
     * @return \Anomaly\Streams\Platform\Support\Collection
926
     */
927
    public function getFormValues()
928
    {
929
        return $this->form->getValues();
930
    }
931
932
    /**
933
     * Reset the form.
934
     *
935
     * @return $this
936
     */
937
    public function resetForm()
938
    {
939
        $this->form
940
            ->resetFields()
941
            ->setValues(new Collection());
942
943
        return $this;
944
    }
945
946
    /**
947
     * Get the form input.
948
     *
949
     * @return array
950
     */
951
    public function getFormInput()
952
    {
953
        $values = $this->getFormValues();
954
955
        return $values->all();
956
    }
957
958
    /**
959
     * Get the form data.
960
     *
961
     * @return \Anomaly\Streams\Platform\Support\Collection
962
     */
963
    public function getFormData()
964
    {
965
        return $this->form->getData();
966
    }
967
968
    /**
969
     * Add form data.
970
     *
971
     * @param $key
972
     * @param $value
973
     * @return $this
974
     */
975
    public function addFormData($key, $value)
976
    {
977
        $this->form->addData($key, $value);
978
979
        return $this;
980
    }
981
982
    /**
983
     * Ge the form response.
984
     *
985
     * @return null|Response
986
     */
987
    public function getFormResponse()
988
    {
989
        return $this->form->getResponse();
990
    }
991
992
    /**
993
     * Set the form response.
994
     *
995
     * @param  null|false|Response $response
996
     * @return $this
997
     */
998
    public function setFormResponse(Response $response)
999
    {
1000
        $this->form->setResponse($response);
1001
1002
        return $this;
1003
    }
1004
1005
    /**
1006
     * Get the form content.
1007
     *
1008
     * @return null|string
1009
     */
1010
    public function getFormContent()
1011
    {
1012
        return $this->form->getContent();
1013
    }
1014
1015
    /**
1016
     * Get the form fields.
1017
     *
1018
     * @return Component\Field\FieldCollection
1019
     */
1020
    public function getFormFields()
1021
    {
1022
        return $this->form->getFields();
1023
    }
1024
1025
    /**
1026
     * Get the enabled form fields.
1027
     *
1028
     * @return Component\Field\FieldCollection
1029
     */
1030
    public function getEnabledFormFields()
1031
    {
1032
        return $this->form->getEnabledFields();
1033
    }
1034
1035
    /**
1036
     * Get the form field.
1037
     *
1038
     * @param $fieldSlug
1039
     * @return FieldType
1040
     */
1041
    public function getFormField($fieldSlug)
1042
    {
1043
        return $this->form->getField($fieldSlug);
1044
    }
1045
1046
    /**
1047
     * Get the form attribute map.
1048
     *
1049
     * @return FieldType
1050
     */
1051
    public function getFormFieldFromAttribute($attribute)
1052
    {
1053
        /* @var FieldType $field */
1054
        foreach ($this->form->getFields() as $field) {
1055
            if ($field->getInputName() == $attribute) {
1056
                return $field;
1057
            }
1058
        }
1059
1060
        return null;
1061
    }
1062
1063
    /**
1064
     * Disable a form field.
1065
     *
1066
     * @param $fieldSlug
1067
     * @return FieldType
1068
     */
1069
    public function disableFormField($fieldSlug)
1070
    {
1071
        return $this->form->disableField($fieldSlug);
1072
    }
1073
1074
    /**
1075
     * Get the form field slugs.
1076
     *
1077
     * @param  null $prefix
1078
     * @return array
1079
     */
1080
    public function getFormFieldSlugs($prefix = null)
1081
    {
1082
        $fields = $this->form->getFields();
1083
1084
        return array_map(
1085
            function ($slug) use ($prefix) {
1086
                return $prefix . $slug;
1087
            },
1088
            array_unique($fields->pluck('field')->all())
1089
        );
1090
    }
1091
1092
    /**
1093
     * Get the form field names.
1094
     *
1095
     * @return array
1096
     */
1097
    public function getFormFieldNames()
1098
    {
1099
        $fields = $this->form->getFields();
1100
1101
        return $fields->pluck('field_name')->all();
1102
    }
1103
1104
    /**
1105
     * Add a form field.
1106
     *
1107
     * @param  FieldType $field
1108
     * @return $this
1109
     */
1110
    public function addFormField(FieldType $field)
1111
    {
1112
        $this->form->addField($field);
1113
1114
        return $this;
1115
    }
1116
1117
    /**
1118
     * Set the form errors.
1119
     *
1120
     * @param  MessageBag $errors
1121
     * @return $this
1122
     */
1123
    public function setFormErrors(MessageBag $errors)
1124
    {
1125
        $this->form->setErrors($errors);
0 ignored issues
show
Compatibility introduced by
$errors of type object<Illuminate\Contracts\Support\MessageBag> is not a sub-type of object<Illuminate\Support\MessageBag>. It seems like you assume a concrete implementation of the interface Illuminate\Contracts\Support\MessageBag to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
1126
1127
        return $this;
1128
    }
1129
1130
    /**
1131
     * Get the form errors.
1132
     *
1133
     * @return null|MessageBag
1134
     */
1135
    public function getFormErrors()
1136
    {
1137
        return $this->form->getErrors();
1138
    }
1139
1140
    /**
1141
     * Add an error to the form.
1142
     *
1143
     * @param $field
1144
     * @param $message
1145
     * @return $this
1146
     */
1147
    public function addFormError($field, $message)
1148
    {
1149
        $errors = $this->getFormErrors();
1150
1151
        $errors->add($field, $message);
1152
1153
        return $this;
1154
    }
1155
1156
    /**
1157
     * Return whether the form has errors or not.
1158
     *
1159
     * @return bool
1160
     */
1161
    public function hasFormErrors()
1162
    {
1163
        $errors = $this->form->getErrors();
1164
1165
        return !$errors->isEmpty();
1166
    }
1167
1168
    /**
1169
     * Return whether the field has an error or not.
1170
     *
1171
     * @param $fieldName
1172
     * @return bool
1173
     */
1174
    public function hasFormError($fieldName)
1175
    {
1176
        return $this->form->hasError($fieldName);
1177
    }
1178
1179
    /**
1180
     * Get the form actions.
1181
     *
1182
     * @return ActionCollection
1183
     */
1184
    public function getFormActions()
1185
    {
1186
        return $this->form->getActions();
1187
    }
1188
1189
    /**
1190
     * Get the active form action.
1191
     *
1192
     * @return null|ActionInterface
1193
     */
1194
    public function getActiveFormAction()
1195
    {
1196
        if (!$actions = $this->form->getActions()) {
1197
            return null;
1198
        }
1199
1200
        if (!$active = $actions->active()) {
1201
            return null;
1202
        }
1203
1204
        return $active;
1205
    }
1206
1207
    /**
1208
     * Add a form button.
1209
     *
1210
     * @param  ButtonInterface $button
1211
     * @return $this
1212
     */
1213
    public function addFormButton(ButtonInterface $button)
1214
    {
1215
        $this->form->addButton($button);
1216
1217
        return $this;
1218
    }
1219
1220
    /**
1221
     * Add a form section.
1222
     *
1223
     * @param        $slug
1224
     * @param  array $section
1225
     * @return $this
1226
     */
1227
    public function addFormSection($slug, array $section)
1228
    {
1229
        $this->form->addSection($slug, $section);
1230
1231
        return $this;
1232
    }
1233
1234
    /**
1235
     * Set the form entry.
1236
     *
1237
     * @param $entry
1238
     * @return $this
1239
     */
1240
    public function setFormEntry($entry)
1241
    {
1242
        $this->form->setEntry($entry);
1243
1244
        return $this;
1245
    }
1246
1247
    /**
1248
     * Get a request value.
1249
     *
1250
     * @param        $key
1251
     * @param  null  $default
1252
     * @return mixed
1253
     */
1254
    public function getRequestValue($key, $default = null)
0 ignored issues
show
Coding Style introduced by
getRequestValue uses the super-global variable $_REQUEST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
1255
    {
1256
        return array_get($_REQUEST, $this->getOption('prefix') . $key, $default);
1257
    }
1258
1259
    /**
1260
     * Get a post value.
1261
     *
1262
     * @param        $key
1263
     * @param  null  $default
1264
     * @return mixed
1265
     */
1266
    public function getPostValue($key, $default = null)
0 ignored issues
show
Coding Style introduced by
getPostValue uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
1267
    {
1268
        return array_get($_POST, $this->getOption('prefix') . $key, $default);
1269
    }
1270
1271
    /**
1272
     * Return a post key flag.
1273
     *
1274
     * @param        $key
1275
     * @param  null  $default
0 ignored issues
show
Bug introduced by
There is no parameter named $default. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
1276
     * @return mixed
1277
     */
1278
    public function hasPostedInput($key)
0 ignored issues
show
Coding Style introduced by
hasPostedInput uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
1279
    {
1280
        return isset($_POST[$this->getOption('prefix') . $key]);
1281
    }
1282
1283
    /**
1284
     * Return whether any post data exists.
1285
     *
1286
     * @return bool
1287
     */
1288
    public function hasPostData()
1289
    {
1290
        /* @var FieldType $field */
1291
        foreach ($this->getFormFields() as $field) {
1292
            if ($field->hasPostedInput()) {
1293
                return true;
1294
            }
1295
        }
1296
1297
        return false;
1298
    }
1299
1300
    /**
1301
     * Set the save flag.
1302
     *
1303
     * @param  bool $save
1304
     * @return $this
1305
     */
1306
    public function setSave($save)
1307
    {
1308
        $this->save = $save;
1309
1310
        return $this;
1311
    }
1312
1313
    /**
1314
     * Return the save flag.
1315
     *
1316
     * @return bool
1317
     */
1318
    public function canSave()
1319
    {
1320
        return $this->save;
1321
    }
1322
1323
    /**
1324
     * Set the read only flag.
1325
     *
1326
     * @param $readOnly
1327
     * @return $this
1328
     */
1329
    public function setReadOnly($readOnly)
1330
    {
1331
        $this->readOnly = $readOnly;
1332
1333
        return $this;
1334
    }
1335
1336
    /**
1337
     * Return the read only flag.
1338
     *
1339
     * @return bool
1340
     */
1341
    public function isReadOnly()
1342
    {
1343
        return $this->readOnly;
1344
    }
1345
}
1346