Completed
Push — master ( 52471e...4da56f )
by Ryan
06:22
created

FormBuilder::addFormData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 2
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
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
     * Add a skipped field.
539
     *
540
     * @param $fieldSlug
541
     * @return $this
542
     */
543
    public function skipField($fieldSlug)
544
    {
545
        $this->skips[] = $fieldSlug;
546
547
        return $this;
548
    }
549
550
    /**
551
     * Set the actions config.
552
     *
553
     * @param  $actions
554
     * @return $this
555
     */
556
    public function setActions($actions)
557
    {
558
        $this->actions = $actions;
559
560
        return $this;
561
    }
562
563
    /**
564
     * Add an action.
565
     *
566
     * @param        $slug
567
     * @param  array $definition
568
     * @return $this
569
     */
570
    public function addAction($slug, array $definition = [])
571
    {
572
        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...
573
            $this->actions[$slug] = $definition;
574
        } else {
575
            $this->actions[] = $slug;
576
        }
577
578
        return $this;
579
    }
580
581
    /**
582
     * Get the actions config.
583
     *
584
     * @return array
585
     */
586
    public function getActions()
587
    {
588
        return $this->actions;
589
    }
590
591
    /**
592
     * Set the buttons config.
593
     *
594
     * @param  $buttons
595
     * @return $this
596
     */
597
    public function setButtons($buttons)
598
    {
599
        $this->buttons = $buttons;
600
601
        return $this;
602
    }
603
604
    /**
605
     * Get the buttons config.
606
     *
607
     * @return array
608
     */
609
    public function getButtons()
610
    {
611
        return $this->buttons;
612
    }
613
614
    /**
615
     * The the options.
616
     *
617
     * @return array
618
     */
619
    public function getOptions()
620
    {
621
        return $this->options;
622
    }
623
624
    /**
625
     * Set the options.
626
     *
627
     * @param  array|string $options
628
     * @return $this
629
     */
630
    public function setOptions($options)
631
    {
632
        $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...
633
634
        return $this;
635
    }
636
637
    /**
638
     * Merge in options.
639
     *
640
     * @param  array|string $options
641
     * @return $this
642
     */
643
    public function mergeOptions($options)
644
    {
645
        $this->options = array_merge($this->options, $options);
646
647
        return $this;
648
    }
649
650
    /**
651
     * Get the sections.
652
     *
653
     * @return array
654
     */
655
    public function getSections()
656
    {
657
        return $this->sections;
658
    }
659
660
    /**
661
     * Set the sections.
662
     *
663
     * @param  array|Closure $sections
664
     * @return $this
665
     */
666
    public function setSections($sections)
667
    {
668
        $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...
669
670
        return $this;
671
    }
672
673
    /**
674
     * Add a section.
675
     *
676
     * @param        $slug
677
     * @param  array $section
678
     * @return $this
679
     */
680
    public function addSection($slug, array $section)
681
    {
682
        array_set($this->sections, $slug, $section);
683
684
        return $this;
685
    }
686
687
    /**
688
     * Add a section tab.
689
     *
690
     * @param        $section
691
     * @param        $slug
692
     * @param  array $tab
693
     * @return $this
694
     */
695
    public function addSectionTab($section, $slug, array $tab)
696
    {
697
        array_set($this->sections, "{$section}.tabs.{$slug}", $tab);
698
699
        return $this;
700
    }
701
702
    /**
703
     * Get an option value.
704
     *
705
     * @param        $key
706
     * @param  null  $default
707
     * @return mixed
708
     */
709
    public function getOption($key, $default = null)
710
    {
711
        return array_get($this->options, $key, $default);
712
    }
713
714
    /**
715
     * Set an option value.
716
     *
717
     * @param $key
718
     * @param $value
719
     * @return $this
720
     */
721
    public function setOption($key, $value)
722
    {
723
        array_set($this->options, $key, $value);
724
725
        return $this;
726
    }
727
728
    /**
729
     * Get the assets.
730
     *
731
     * @return array
732
     */
733
    public function getAssets()
734
    {
735
        return $this->assets;
736
    }
737
738
    /**
739
     * Set the assets.
740
     *
741
     * @param $assets
742
     * @return $this
743
     */
744
    public function setAssets($assets)
745
    {
746
        $this->assets = $assets;
747
748
        return $this;
749
    }
750
751
    /**
752
     * Add an asset.
753
     *
754
     * @param $collection
755
     * @param $asset
756
     * @return $this
757
     */
758 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...
759
    {
760
        if (!isset($this->assets[$collection])) {
761
            $this->assets[$collection] = [];
762
        }
763
764
        $this->assets[$collection][] = $asset;
765
766
        return $this;
767
    }
768
769
    /**
770
     * Get the form's stream.
771
     *
772
     * @return StreamInterface|null
773
     */
774
    public function getFormStream()
775
    {
776
        return $this->form->getStream();
777
    }
778
779
    /**
780
     * Get a form option value.
781
     *
782
     * @param        $key
783
     * @param  null  $default
784
     * @return mixed
785
     */
786
    public function getFormOption($key, $default = null)
787
    {
788
        return $this->form->getOption($key, $default);
789
    }
790
791
    /**
792
     * Set a form option value.
793
     *
794
     * @param $key
795
     * @param $value
796
     * @return $this
797
     */
798
    public function setFormOption($key, $value)
799
    {
800
        $this->form->setOption($key, $value);
801
802
        return $this;
803
    }
804
805
    /**
806
     * Get the form options.
807
     *
808
     * @return \Anomaly\Streams\Platform\Support\Collection
809
     */
810
    public function getFormOptions()
811
    {
812
        return $this->form->getOptions();
813
    }
814
815
    /**
816
     * Get the form model.
817
     *
818
     * @return \Anomaly\Streams\Platform\Entry\EntryModel|EloquentModel|null
819
     */
820
    public function getFormModel()
821
    {
822
        return $this->form->getModel();
823
    }
824
825
    /**
826
     * Get the form entry.
827
     *
828
     * @return EloquentModel|EntryInterface|FieldInterface|AssignmentInterface
829
     */
830
    public function getFormEntry()
831
    {
832
        return $this->form->getEntry();
833
    }
834
835
    /**
836
     * Return the form entry's ID.
837
     *
838
     * @return int|mixed|null
839
     */
840
    public function getFormEntryId()
841
    {
842
        $entry = $this->getFormEntry();
843
844
        if (!$entry instanceof EloquentModel) {
845
            return null;
846
        }
847
848
        return $entry->getId();
849
    }
850
851
    /**
852
     * Get the contextual entry ID.
853
     *
854
     * @return int|null
855
     */
856
    public function getContextualId()
857
    {
858
        return $this->getFormEntryId();
859
    }
860
861
    /**
862
     * Get the form mode.
863
     *
864
     * @return null|string
865
     */
866
    public function getFormMode()
867
    {
868
        return $this->form->getMode();
869
    }
870
871
    /**
872
     * Set the form mode.
873
     *
874
     * @param $mode
875
     * @return $this
876
     */
877
    public function setFormMode($mode)
878
    {
879
        $this->form->setMode($mode);
880
881
        return $this;
882
    }
883
884
    /**
885
     * Get a form value.
886
     *
887
     * @param        $key
888
     * @param  null  $default
889
     * @return mixed
890
     */
891
    public function getFormValue($key, $default = null)
892
    {
893
        return $this->form->getValue($key, $default);
894
    }
895
896
    /**
897
     * Set a form value.
898
     *
899
     * @param $key
900
     * @param $value
901
     * @return $this
902
     */
903
    public function setFormValue($key, $value)
904
    {
905
        $this->form->setValue($key, $value);
906
907
        return $this;
908
    }
909
910
    /**
911
     * Get the form values.
912
     *
913
     * @return \Anomaly\Streams\Platform\Support\Collection
914
     */
915
    public function getFormValues()
916
    {
917
        return $this->form->getValues();
918
    }
919
920
    /**
921
     * Reset the form.
922
     *
923
     * @return $this
924
     */
925
    public function resetForm()
926
    {
927
        $this->form
928
            ->resetFields()
929
            ->setValues(new Collection());
930
931
        return $this;
932
    }
933
934
    /**
935
     * Get the form input.
936
     *
937
     * @return array
938
     */
939
    public function getFormInput()
940
    {
941
        $values = $this->getFormValues();
942
943
        return $values->all();
944
    }
945
946
    /**
947
     * Get the form data.
948
     *
949
     * @return \Anomaly\Streams\Platform\Support\Collection
950
     */
951
    public function getFormData()
952
    {
953
        return $this->form->getData();
954
    }
955
956
    /**
957
     * Add form data.
958
     *
959
     * @param $key
960
     * @param $value
961
     * @return $this
962
     */
963
    public function addFormData($key, $value)
964
    {
965
        $this->form->addData($key, $value);
966
967
        return $this;
968
    }
969
970
    /**
971
     * Ge the form response.
972
     *
973
     * @return null|Response
974
     */
975
    public function getFormResponse()
976
    {
977
        return $this->form->getResponse();
978
    }
979
980
    /**
981
     * Set the form response.
982
     *
983
     * @param  null|false|Response $response
984
     * @return $this
985
     */
986
    public function setFormResponse(Response $response)
987
    {
988
        $this->form->setResponse($response);
989
990
        return $this;
991
    }
992
993
    /**
994
     * Get the form content.
995
     *
996
     * @return null|string
997
     */
998
    public function getFormContent()
999
    {
1000
        return $this->form->getContent();
1001
    }
1002
1003
    /**
1004
     * Get the form fields.
1005
     *
1006
     * @return Component\Field\FieldCollection
1007
     */
1008
    public function getFormFields()
1009
    {
1010
        return $this->form->getFields();
1011
    }
1012
1013
    /**
1014
     * Get the enabled form fields.
1015
     *
1016
     * @return Component\Field\FieldCollection
1017
     */
1018
    public function getEnabledFormFields()
1019
    {
1020
        return $this->form->getEnabledFields();
1021
    }
1022
1023
    /**
1024
     * Get the form field.
1025
     *
1026
     * @param $fieldSlug
1027
     * @return FieldType
1028
     */
1029
    public function getFormField($fieldSlug)
1030
    {
1031
        return $this->form->getField($fieldSlug);
1032
    }
1033
1034
    /**
1035
     * Get the form attribute map.
1036
     *
1037
     * @return FieldType
1038
     */
1039
    public function getFormFieldFromAttribute($attribute)
1040
    {
1041
        /* @var FieldType $field */
1042
        foreach ($this->form->getFields() as $field) {
1043
            if ($field->getInputName() == $attribute) {
1044
                return $field;
1045
            }
1046
        }
1047
1048
        return null;
1049
    }
1050
1051
    /**
1052
     * Disable a form field.
1053
     *
1054
     * @param $fieldSlug
1055
     * @return FieldType
1056
     */
1057
    public function disableFormField($fieldSlug)
1058
    {
1059
        return $this->form->disableField($fieldSlug);
1060
    }
1061
1062
    /**
1063
     * Get the form field slugs.
1064
     *
1065
     * @param  null $prefix
1066
     * @return array
1067
     */
1068
    public function getFormFieldSlugs($prefix = null)
1069
    {
1070
        $fields = $this->form->getFields();
1071
1072
        return array_map(
1073
            function ($slug) use ($prefix) {
1074
                return $prefix . $slug;
1075
            },
1076
            array_unique($fields->pluck('field')->all())
1077
        );
1078
    }
1079
1080
    /**
1081
     * Get the form field names.
1082
     *
1083
     * @return array
1084
     */
1085
    public function getFormFieldNames()
1086
    {
1087
        $fields = $this->form->getFields();
1088
1089
        return $fields->pluck('field_name')->all();
1090
    }
1091
1092
    /**
1093
     * Add a form field.
1094
     *
1095
     * @param  FieldType $field
1096
     * @return $this
1097
     */
1098
    public function addFormField(FieldType $field)
1099
    {
1100
        $this->form->addField($field);
1101
1102
        return $this;
1103
    }
1104
1105
    /**
1106
     * Set the form errors.
1107
     *
1108
     * @param  MessageBag $errors
1109
     * @return $this
1110
     */
1111
    public function setFormErrors(MessageBag $errors)
1112
    {
1113
        $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...
1114
1115
        return $this;
1116
    }
1117
1118
    /**
1119
     * Get the form errors.
1120
     *
1121
     * @return null|MessageBag
1122
     */
1123
    public function getFormErrors()
1124
    {
1125
        return $this->form->getErrors();
1126
    }
1127
1128
    /**
1129
     * Add an error to the form.
1130
     *
1131
     * @param $field
1132
     * @param $message
1133
     * @return $this
1134
     */
1135
    public function addFormError($field, $message)
1136
    {
1137
        $errors = $this->getFormErrors();
1138
1139
        $errors->add($field, $message);
1140
1141
        return $this;
1142
    }
1143
1144
    /**
1145
     * Return whether the form has errors or not.
1146
     *
1147
     * @return bool
1148
     */
1149
    public function hasFormErrors()
1150
    {
1151
        $errors = $this->form->getErrors();
1152
1153
        return !$errors->isEmpty();
1154
    }
1155
1156
    /**
1157
     * Return whether the field has an error or not.
1158
     *
1159
     * @param $fieldName
1160
     * @return bool
1161
     */
1162
    public function hasFormError($fieldName)
1163
    {
1164
        return $this->form->hasError($fieldName);
1165
    }
1166
1167
    /**
1168
     * Get the form actions.
1169
     *
1170
     * @return ActionCollection
1171
     */
1172
    public function getFormActions()
1173
    {
1174
        return $this->form->getActions();
1175
    }
1176
1177
    /**
1178
     * Get the active form action.
1179
     *
1180
     * @return null|ActionInterface
1181
     */
1182
    public function getActiveFormAction()
1183
    {
1184
        if (!$actions = $this->form->getActions()) {
1185
            return null;
1186
        }
1187
1188
        if (!$active = $actions->active()) {
1189
            return null;
1190
        }
1191
1192
        return $active;
1193
    }
1194
1195
    /**
1196
     * Add a form button.
1197
     *
1198
     * @param  ButtonInterface $button
1199
     * @return $this
1200
     */
1201
    public function addFormButton(ButtonInterface $button)
1202
    {
1203
        $this->form->addButton($button);
1204
1205
        return $this;
1206
    }
1207
1208
    /**
1209
     * Add a form section.
1210
     *
1211
     * @param        $slug
1212
     * @param  array $section
1213
     * @return $this
1214
     */
1215
    public function addFormSection($slug, array $section)
1216
    {
1217
        $this->form->addSection($slug, $section);
1218
1219
        return $this;
1220
    }
1221
1222
    /**
1223
     * Set the form entry.
1224
     *
1225
     * @param $entry
1226
     * @return $this
1227
     */
1228
    public function setFormEntry($entry)
1229
    {
1230
        $this->form->setEntry($entry);
1231
1232
        return $this;
1233
    }
1234
1235
    /**
1236
     * Get a request value.
1237
     *
1238
     * @param        $key
1239
     * @param  null  $default
1240
     * @return mixed
1241
     */
1242
    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...
1243
    {
1244
        return array_get($_REQUEST, $this->getOption('prefix') . $key, $default);
1245
    }
1246
1247
    /**
1248
     * Get a post value.
1249
     *
1250
     * @param        $key
1251
     * @param  null  $default
1252
     * @return mixed
1253
     */
1254
    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...
1255
    {
1256
        return array_get($_POST, $this->getOption('prefix') . $key, $default);
1257
    }
1258
1259
    /**
1260
     * Return a post key flag.
1261
     *
1262
     * @param        $key
1263
     * @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...
1264
     * @return mixed
1265
     */
1266
    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...
1267
    {
1268
        return isset($_POST[$this->getOption('prefix') . $key]);
1269
    }
1270
1271
    /**
1272
     * Return whether any post data exists.
1273
     *
1274
     * @return bool
1275
     */
1276
    public function hasPostData()
1277
    {
1278
        /* @var FieldType $field */
1279
        foreach ($this->getFormFields() as $field) {
1280
            if ($field->hasPostedInput()) {
1281
                return true;
1282
            }
1283
        }
1284
1285
        return false;
1286
    }
1287
1288
    /**
1289
     * Set the save flag.
1290
     *
1291
     * @param  bool $save
1292
     * @return $this
1293
     */
1294
    public function setSave($save)
1295
    {
1296
        $this->save = $save;
1297
1298
        return $this;
1299
    }
1300
1301
    /**
1302
     * Return the save flag.
1303
     *
1304
     * @return bool
1305
     */
1306
    public function canSave()
1307
    {
1308
        return $this->save;
1309
    }
1310
1311
    /**
1312
     * Set the read only flag.
1313
     *
1314
     * @param $readOnly
1315
     * @return $this
1316
     */
1317
    public function setReadOnly($readOnly)
1318
    {
1319
        $this->readOnly = $readOnly;
1320
1321
        return $this;
1322
    }
1323
1324
    /**
1325
     * Return the read only flag.
1326
     *
1327
     * @return bool
1328
     */
1329
    public function isReadOnly()
1330
    {
1331
        return $this->readOnly;
1332
    }
1333
}
1334