Deployed 2063d78 to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / 5.4 / migration / wsc31 / form-builder / index.html
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9
10
11
12 <link rel="shortcut icon" href="../../../assets/default.favicon.ico">
13 <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.0.5">
14
15
16
17 <title>Migrating from WSC 3.1 - Form Builder - WoltLab Suite Documentation</title>
18
19
20
21 <link rel="stylesheet" href="../../../assets/stylesheets/main.77f3fd56.min.css">
22
23
24 <link rel="stylesheet" href="../../../assets/stylesheets/palette.7fa14f5b.min.css">
25
26
27
28 <meta name="theme-color" content="#009485">
29
30
31
32
33
34
35
36
37
38 <link rel="stylesheet" href="../../../stylesheets/extra.css">
39
40
41
42
43
44 </head>
45
46
47
48
49
50
51
52 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="">
53
54
55
56 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
57 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
58 <label class="md-overlay" for="__drawer"></label>
59 <div data-md-component="skip">
60
61
62 <a href="#migrating-from-wsc-31-form-builder" class="md-skip">
63 Skip to content
64 </a>
65
66 </div>
67 <div data-md-component="announce">
68
69 <aside class="md-announce">
70 <div class="md-announce__inner md-grid md-typeset">
71
72 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
73
74 </div>
75 </aside>
76
77 </div>
78
79
80
81 <header class="md-header" data-md-component="header">
82 <nav class="md-header__inner md-grid" aria-label="Header">
83 <a href="../../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation">
84
85 <img src="../../../assets/logo.png" alt="logo">
86
87 </a>
88 <label class="md-header__button md-icon" for="__drawer">
89 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
90 </label>
91 <div class="md-header__title" data-md-component="header-title">
92 <div class="md-header__ellipsis">
93 <div class="md-header__topic">
94 <span class="md-ellipsis">
95 WoltLab Suite Documentation
96 </span>
97 </div>
98 <div class="md-header__topic" data-md-component="header-topic">
99 <span class="md-ellipsis">
100
101 Migrating from WSC 3.1 - Form Builder
102
103 </span>
104 </div>
105 </div>
106 </div>
107 <div class="md-header__options">
108
109 </div>
110
111
112 <div class="md-header__source">
113
114 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
115 <div class="md-source__icon md-icon">
116
117 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
118 </div>
119 <div class="md-source__repository">
120 GitHub
121 </div>
122 </a>
123 </div>
124
125 </nav>
126 </header>
127
128 <div class="md-container" data-md-component="container">
129
130
131
132
133 <main class="md-main" data-md-component="main">
134 <div class="md-main__inner md-grid">
135
136
137
138 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
139 <div class="md-sidebar__scrollwrap">
140 <div class="md-sidebar__inner">
141
142
143
144
145
146 <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
147 <label class="md-nav__title" for="__drawer">
148 <a href="../../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation">
149
150 <img src="../../../assets/logo.png" alt="logo">
151
152 </a>
153 WoltLab Suite Documentation
154 </label>
155
156 <div class="md-nav__source">
157
158 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
159 <div class="md-source__icon md-icon">
160
161 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
162 </div>
163 <div class="md-source__repository">
164 GitHub
165 </div>
166 </a>
167 </div>
168
169 <ul class="md-nav__list" data-md-scrollfix>
170
171
172
173
174
175
176
177
178 <li class="md-nav__item">
179 <a href="../../../getting-started/" class="md-nav__link">
180 Getting Started
181 </a>
182 </li>
183
184
185
186
187
188
189
190
191
192
193
194 <li class="md-nav__item md-nav__item--nested">
195
196
197 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
198
199 <label class="md-nav__link" for="__nav_2">
200 PHP API
201 <span class="md-nav__icon md-icon"></span>
202 </label>
203 <nav class="md-nav" aria-label="PHP API" data-md-level="1">
204 <label class="md-nav__title" for="__nav_2">
205 <span class="md-nav__icon md-icon"></span>
206 PHP API
207 </label>
208 <ul class="md-nav__list" data-md-scrollfix>
209
210
211
212
213
214 <li class="md-nav__item">
215 <a href="../../../php/pages/" class="md-nav__link">
216 Pages
217 </a>
218 </li>
219
220
221
222
223
224
225
226 <li class="md-nav__item">
227 <a href="../../../php/database-objects/" class="md-nav__link">
228 Database Objects
229 </a>
230 </li>
231
232
233
234
235
236
237
238 <li class="md-nav__item">
239 <a href="../../../php/database-access/" class="md-nav__link">
240 Database Access
241 </a>
242 </li>
243
244
245
246
247
248
249
250 <li class="md-nav__item">
251 <a href="../../../php/exceptions/" class="md-nav__link">
252 Exceptions
253 </a>
254 </li>
255
256
257
258
259
260
261
262
263 <li class="md-nav__item md-nav__item--nested">
264
265
266 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" >
267
268 <label class="md-nav__link" for="__nav_2_5">
269 API
270 <span class="md-nav__icon md-icon"></span>
271 </label>
272 <nav class="md-nav" aria-label="API" data-md-level="2">
273 <label class="md-nav__title" for="__nav_2_5">
274 <span class="md-nav__icon md-icon"></span>
275 API
276 </label>
277 <ul class="md-nav__list" data-md-scrollfix>
278
279
280
281
282
283 <li class="md-nav__item">
284 <a href="../../../php/api/caches/" class="md-nav__link">
285 Caches
286 </a>
287 </li>
288
289
290
291
292
293
294
295 <li class="md-nav__item">
296 <a href="../../../php/api/comments/" class="md-nav__link">
297 Comments
298 </a>
299 </li>
300
301
302
303
304
305
306
307 <li class="md-nav__item">
308 <a href="../../../php/api/cronjobs/" class="md-nav__link">
309 Cronjobs
310 </a>
311 </li>
312
313
314
315
316
317
318
319 <li class="md-nav__item">
320 <a href="../../../php/api/events/" class="md-nav__link">
321 Events
322 </a>
323 </li>
324
325
326
327
328
329
330
331
332 <li class="md-nav__item md-nav__item--nested">
333
334
335 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" >
336
337 <label class="md-nav__link" for="__nav_2_5_5">
338 Form Builder
339 <span class="md-nav__icon md-icon"></span>
340 </label>
341 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
342 <label class="md-nav__title" for="__nav_2_5_5">
343 <span class="md-nav__icon md-icon"></span>
344 Form Builder
345 </label>
346 <ul class="md-nav__list" data-md-scrollfix>
347
348
349
350
351
352 <li class="md-nav__item">
353 <a href="../../../php/api/form_builder/overview/" class="md-nav__link">
354 Overview
355 </a>
356 </li>
357
358
359
360
361
362
363
364 <li class="md-nav__item">
365 <a href="../../../php/api/form_builder/structure/" class="md-nav__link">
366 Structure
367 </a>
368 </li>
369
370
371
372
373
374
375
376 <li class="md-nav__item">
377 <a href="../../../php/api/form_builder/form_fields/" class="md-nav__link">
378 Fields
379 </a>
380 </li>
381
382
383
384
385
386
387
388 <li class="md-nav__item">
389 <a href="../../../php/api/form_builder/validation_data/" class="md-nav__link">
390 Validation and Data
391 </a>
392 </li>
393
394
395
396
397
398
399
400 <li class="md-nav__item">
401 <a href="../../../php/api/form_builder/dependencies/" class="md-nav__link">
402 Dependencies
403 </a>
404 </li>
405
406
407
408 </ul>
409 </nav>
410 </li>
411
412
413
414
415
416
417
418 <li class="md-nav__item">
419 <a href="../../../php/api/package_installation_plugins/" class="md-nav__link">
420 Package Installation Plugins
421 </a>
422 </li>
423
424
425
426
427
428
429
430 <li class="md-nav__item">
431 <a href="../../../php/api/user_activity_points/" class="md-nav__link">
432 User Activity Points
433 </a>
434 </li>
435
436
437
438
439
440
441
442 <li class="md-nav__item">
443 <a href="../../../php/api/user_notifications/" class="md-nav__link">
444 User Notifications
445 </a>
446 </li>
447
448
449
450
451
452
453
454 <li class="md-nav__item">
455 <a href="../../../php/api/sitemaps/" class="md-nav__link">
456 Sitemaps
457 </a>
458 </li>
459
460
461
462 </ul>
463 </nav>
464 </li>
465
466
467
468
469
470
471
472 <li class="md-nav__item">
473 <a href="../../../php/code-style/" class="md-nav__link">
474 Code Style
475 </a>
476 </li>
477
478
479
480
481
482
483
484 <li class="md-nav__item">
485 <a href="../../../php/apps/" class="md-nav__link">
486 Apps
487 </a>
488 </li>
489
490
491
492
493
494
495
496 <li class="md-nav__item">
497 <a href="../../../php/gdpr/" class="md-nav__link">
498 GDPR
499 </a>
500 </li>
501
502
503
504 </ul>
505 </nav>
506 </li>
507
508
509
510
511
512
513
514
515
516
517
518 <li class="md-nav__item md-nav__item--nested">
519
520
521 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
522
523 <label class="md-nav__link" for="__nav_3">
524 Languages, Templates & CSS
525 <span class="md-nav__icon md-icon"></span>
526 </label>
527 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
528 <label class="md-nav__title" for="__nav_3">
529 <span class="md-nav__icon md-icon"></span>
530 Languages, Templates & CSS
531 </label>
532 <ul class="md-nav__list" data-md-scrollfix>
533
534
535
536
537
538 <li class="md-nav__item">
539 <a href="../../../view/languages/" class="md-nav__link">
540 Languages
541 </a>
542 </li>
543
544
545
546
547
548
549
550 <li class="md-nav__item">
551 <a href="../../../view/templates/" class="md-nav__link">
552 Templates
553 </a>
554 </li>
555
556
557
558
559
560
561
562 <li class="md-nav__item">
563 <a href="../../../view/css/" class="md-nav__link">
564 CSS
565 </a>
566 </li>
567
568
569
570 </ul>
571 </nav>
572 </li>
573
574
575
576
577
578
579
580
581
582
583
584 <li class="md-nav__item md-nav__item--nested">
585
586
587 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
588
589 <label class="md-nav__link" for="__nav_4">
590 JavaScript API
591 <span class="md-nav__icon md-icon"></span>
592 </label>
593 <nav class="md-nav" aria-label="JavaScript API" data-md-level="1">
594 <label class="md-nav__title" for="__nav_4">
595 <span class="md-nav__icon md-icon"></span>
596 JavaScript API
597 </label>
598 <ul class="md-nav__list" data-md-scrollfix>
599
600
601
602
603
604 <li class="md-nav__item">
605 <a href="../../../javascript/general-usage/" class="md-nav__link">
606 General Usage
607 </a>
608 </li>
609
610
611
612
613
614
615
616
617 <li class="md-nav__item md-nav__item--nested">
618
619
620 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
621
622 <label class="md-nav__link" for="__nav_4_2">
623 New API
624 <span class="md-nav__icon md-icon"></span>
625 </label>
626 <nav class="md-nav" aria-label="New API" data-md-level="2">
627 <label class="md-nav__title" for="__nav_4_2">
628 <span class="md-nav__icon md-icon"></span>
629 New API
630 </label>
631 <ul class="md-nav__list" data-md-scrollfix>
632
633
634
635
636
637 <li class="md-nav__item">
638 <a href="../../../javascript/new-api_writing-a-module/" class="md-nav__link">
639 Writing a module
640 </a>
641 </li>
642
643
644
645
646
647
648
649 <li class="md-nav__item">
650 <a href="../../../javascript/new-api_data-structures/" class="md-nav__link">
651 Data Structures
652 </a>
653 </li>
654
655
656
657
658
659
660
661 <li class="md-nav__item">
662 <a href="../../../javascript/new-api_core/" class="md-nav__link">
663 Core Functions
664 </a>
665 </li>
666
667
668
669
670
671
672
673 <li class="md-nav__item">
674 <a href="../../../javascript/new-api_dom/" class="md-nav__link">
675 DOM
676 </a>
677 </li>
678
679
680
681
682
683
684
685 <li class="md-nav__item">
686 <a href="../../../javascript/new-api_events/" class="md-nav__link">
687 Event Handling
688 </a>
689 </li>
690
691
692
693
694
695
696
697 <li class="md-nav__item">
698 <a href="../../../javascript/new-api_ajax/" class="md-nav__link">
699 Ajax
700 </a>
701 </li>
702
703
704
705
706
707
708
709 <li class="md-nav__item">
710 <a href="../../../javascript/new-api_dialogs/" class="md-nav__link">
711 Dialogs
712 </a>
713 </li>
714
715
716
717
718
719
720
721 <li class="md-nav__item">
722 <a href="../../../javascript/new-api_browser/" class="md-nav__link">
723 Browser and Screen Sizes
724 </a>
725 </li>
726
727
728
729
730
731
732
733 <li class="md-nav__item">
734 <a href="../../../javascript/new-api_ui/" class="md-nav__link">
735 User Interface
736 </a>
737 </li>
738
739
740
741 </ul>
742 </nav>
743 </li>
744
745
746
747
748
749
750
751 <li class="md-nav__item">
752 <a href="../../../javascript/legacy-api/" class="md-nav__link">
753 Legacy API
754 </a>
755 </li>
756
757
758
759
760
761
762
763 <li class="md-nav__item">
764 <a href="../../../javascript/helper-functions/" class="md-nav__link">
765 Helper Functions
766 </a>
767 </li>
768
769
770
771
772
773
774
775 <li class="md-nav__item">
776 <a href="../../../javascript/code-snippets/" class="md-nav__link">
777 Code Snippets
778 </a>
779 </li>
780
781
782
783 </ul>
784 </nav>
785 </li>
786
787
788
789
790
791
792
793
794
795
796
797 <li class="md-nav__item md-nav__item--nested">
798
799
800 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
801
802 <label class="md-nav__link" for="__nav_5">
803 Package Components
804 <span class="md-nav__icon md-icon"></span>
805 </label>
806 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
807 <label class="md-nav__title" for="__nav_5">
808 <span class="md-nav__icon md-icon"></span>
809 Package Components
810 </label>
811 <ul class="md-nav__list" data-md-scrollfix>
812
813
814
815
816
817 <li class="md-nav__item">
818 <a href="../../../package/package-xml/" class="md-nav__link">
819 package.xml
820 </a>
821 </li>
822
823
824
825
826
827
828
829
830 <li class="md-nav__item md-nav__item--nested">
831
832
833 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
834
835 <label class="md-nav__link" for="__nav_5_2">
836 PIPs
837 <span class="md-nav__icon md-icon"></span>
838 </label>
839 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
840 <label class="md-nav__title" for="__nav_5_2">
841 <span class="md-nav__icon md-icon"></span>
842 PIPs
843 </label>
844 <ul class="md-nav__list" data-md-scrollfix>
845
846
847
848
849
850 <li class="md-nav__item">
851 <a href="../../../package/pip/" class="md-nav__link">
852 Overview
853 </a>
854 </li>
855
856
857
858
859
860
861
862 <li class="md-nav__item">
863 <a href="../../../package/pip/acl-option/" class="md-nav__link">
864 aclOption
865 </a>
866 </li>
867
868
869
870
871
872
873
874 <li class="md-nav__item">
875 <a href="../../../package/pip/acp-menu/" class="md-nav__link">
876 acpMenu
877 </a>
878 </li>
879
880
881
882
883
884
885
886 <li class="md-nav__item">
887 <a href="../../../package/pip/acp-search-provider/" class="md-nav__link">
888 acpSearchProvider
889 </a>
890 </li>
891
892
893
894
895
896
897
898 <li class="md-nav__item">
899 <a href="../../../package/pip/acp-template/" class="md-nav__link">
900 acpTemplate
901 </a>
902 </li>
903
904
905
906
907
908
909
910 <li class="md-nav__item">
911 <a href="../../../package/pip/bbcode/" class="md-nav__link">
912 bbcode
913 </a>
914 </li>
915
916
917
918
919
920
921
922 <li class="md-nav__item">
923 <a href="../../../package/pip/box/" class="md-nav__link">
924 box
925 </a>
926 </li>
927
928
929
930
931
932
933
934 <li class="md-nav__item">
935 <a href="../../../package/pip/clipboard-action/" class="md-nav__link">
936 clipboardAction
937 </a>
938 </li>
939
940
941
942
943
944
945
946 <li class="md-nav__item">
947 <a href="../../../package/pip/core-object/" class="md-nav__link">
948 coreObject
949 </a>
950 </li>
951
952
953
954
955
956
957
958 <li class="md-nav__item">
959 <a href="../../../package/pip/cronjob/" class="md-nav__link">
960 cronjob
961 </a>
962 </li>
963
964
965
966
967
968
969
970 <li class="md-nav__item">
971 <a href="../../../package/pip/event-listener/" class="md-nav__link">
972 eventListener
973 </a>
974 </li>
975
976
977
978
979
980
981
982 <li class="md-nav__item">
983 <a href="../../../package/pip/file/" class="md-nav__link">
984 file
985 </a>
986 </li>
987
988
989
990
991
992
993
994 <li class="md-nav__item">
995 <a href="../../../package/pip/language/" class="md-nav__link">
996 language
997 </a>
998 </li>
999
1000
1001
1002
1003
1004
1005
1006 <li class="md-nav__item">
1007 <a href="../../../package/pip/media-provider/" class="md-nav__link">
1008 mediaProvider
1009 </a>
1010 </li>
1011
1012
1013
1014
1015
1016
1017
1018 <li class="md-nav__item">
1019 <a href="../../../package/pip/menu/" class="md-nav__link">
1020 menu
1021 </a>
1022 </li>
1023
1024
1025
1026
1027
1028
1029
1030 <li class="md-nav__item">
1031 <a href="../../../package/pip/menu-item/" class="md-nav__link">
1032 menuItem
1033 </a>
1034 </li>
1035
1036
1037
1038
1039
1040
1041
1042 <li class="md-nav__item">
1043 <a href="../../../package/pip/object-type/" class="md-nav__link">
1044 objectType
1045 </a>
1046 </li>
1047
1048
1049
1050
1051
1052
1053
1054 <li class="md-nav__item">
1055 <a href="../../../package/pip/object-type-definition/" class="md-nav__link">
1056 objectTypeDefinition
1057 </a>
1058 </li>
1059
1060
1061
1062
1063
1064
1065
1066 <li class="md-nav__item">
1067 <a href="../../../package/pip/option/" class="md-nav__link">
1068 option
1069 </a>
1070 </li>
1071
1072
1073
1074
1075
1076
1077
1078 <li class="md-nav__item">
1079 <a href="../../../package/pip/page/" class="md-nav__link">
1080 page
1081 </a>
1082 </li>
1083
1084
1085
1086
1087
1088
1089
1090 <li class="md-nav__item">
1091 <a href="../../../package/pip/pip/" class="md-nav__link">
1092 pip
1093 </a>
1094 </li>
1095
1096
1097
1098
1099
1100
1101
1102 <li class="md-nav__item">
1103 <a href="../../../package/pip/script/" class="md-nav__link">
1104 script
1105 </a>
1106 </li>
1107
1108
1109
1110
1111
1112
1113
1114 <li class="md-nav__item">
1115 <a href="../../../package/pip/smiley/" class="md-nav__link">
1116 smiley
1117 </a>
1118 </li>
1119
1120
1121
1122
1123
1124
1125
1126 <li class="md-nav__item">
1127 <a href="../../../package/pip/sql/" class="md-nav__link">
1128 sql
1129 </a>
1130 </li>
1131
1132
1133
1134
1135
1136
1137
1138 <li class="md-nav__item">
1139 <a href="../../../package/pip/style/" class="md-nav__link">
1140 style
1141 </a>
1142 </li>
1143
1144
1145
1146
1147
1148
1149
1150 <li class="md-nav__item">
1151 <a href="../../../package/pip/template/" class="md-nav__link">
1152 template
1153 </a>
1154 </li>
1155
1156
1157
1158
1159
1160
1161
1162 <li class="md-nav__item">
1163 <a href="../../../package/pip/template-listener/" class="md-nav__link">
1164 templateListener
1165 </a>
1166 </li>
1167
1168
1169
1170
1171
1172
1173
1174 <li class="md-nav__item">
1175 <a href="../../../package/pip/user-group-option/" class="md-nav__link">
1176 userGroupOption
1177 </a>
1178 </li>
1179
1180
1181
1182
1183
1184
1185
1186 <li class="md-nav__item">
1187 <a href="../../../package/pip/user-menu/" class="md-nav__link">
1188 userMenu
1189 </a>
1190 </li>
1191
1192
1193
1194
1195
1196
1197
1198 <li class="md-nav__item">
1199 <a href="../../../package/pip/user-notification-event/" class="md-nav__link">
1200 userNotificationEvent
1201 </a>
1202 </li>
1203
1204
1205
1206
1207
1208
1209
1210 <li class="md-nav__item">
1211 <a href="../../../package/pip/user-option/" class="md-nav__link">
1212 userOption
1213 </a>
1214 </li>
1215
1216
1217
1218
1219
1220
1221
1222 <li class="md-nav__item">
1223 <a href="../../../package/pip/user-profile-menu/" class="md-nav__link">
1224 userProfileMenu
1225 </a>
1226 </li>
1227
1228
1229
1230 </ul>
1231 </nav>
1232 </li>
1233
1234
1235
1236
1237
1238
1239
1240 <li class="md-nav__item">
1241 <a href="../../../package/database-php-api/" class="md-nav__link">
1242 Database PHP API
1243 </a>
1244 </li>
1245
1246
1247
1248 </ul>
1249 </nav>
1250 </li>
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262 <li class="md-nav__item md-nav__item--nested">
1263
1264
1265 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
1266
1267 <label class="md-nav__link" for="__nav_6">
1268 Migration
1269 <span class="md-nav__icon md-icon"></span>
1270 </label>
1271 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1272 <label class="md-nav__title" for="__nav_6">
1273 <span class="md-nav__icon md-icon"></span>
1274 Migration
1275 </label>
1276 <ul class="md-nav__list" data-md-scrollfix>
1277
1278
1279
1280
1281
1282
1283 <li class="md-nav__item md-nav__item--nested">
1284
1285
1286 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" >
1287
1288 <label class="md-nav__link" for="__nav_6_1">
1289 Migrating from WSC 5.3
1290 <span class="md-nav__icon md-icon"></span>
1291 </label>
1292 <nav class="md-nav" aria-label="Migrating from WSC 5.3" data-md-level="2">
1293 <label class="md-nav__title" for="__nav_6_1">
1294 <span class="md-nav__icon md-icon"></span>
1295 Migrating from WSC 5.3
1296 </label>
1297 <ul class="md-nav__list" data-md-scrollfix>
1298
1299
1300
1301
1302
1303 <li class="md-nav__item">
1304 <a href="../../wsc53/php/" class="md-nav__link">
1305 PHP API
1306 </a>
1307 </li>
1308
1309
1310
1311
1312
1313
1314
1315 <li class="md-nav__item">
1316 <a href="../../wsc53/session/" class="md-nav__link">
1317 Session Handling and Authentication
1318 </a>
1319 </li>
1320
1321
1322
1323
1324
1325
1326
1327 <li class="md-nav__item">
1328 <a href="../../wsc53/javascript/" class="md-nav__link">
1329 JavaScript
1330 </a>
1331 </li>
1332
1333
1334
1335
1336
1337
1338
1339 <li class="md-nav__item">
1340 <a href="../../wsc53/templates/" class="md-nav__link">
1341 Templates
1342 </a>
1343 </li>
1344
1345
1346
1347
1348
1349
1350
1351 <li class="md-nav__item">
1352 <a href="../../wsc53/libraries/" class="md-nav__link">
1353 Third Party Libraries
1354 </a>
1355 </li>
1356
1357
1358
1359 </ul>
1360 </nav>
1361 </li>
1362
1363
1364
1365
1366
1367
1368
1369
1370 <li class="md-nav__item md-nav__item--nested">
1371
1372
1373 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
1374
1375 <label class="md-nav__link" for="__nav_6_2">
1376 Migrating from WSC 5.2
1377 <span class="md-nav__icon md-icon"></span>
1378 </label>
1379 <nav class="md-nav" aria-label="Migrating from WSC 5.2" data-md-level="2">
1380 <label class="md-nav__title" for="__nav_6_2">
1381 <span class="md-nav__icon md-icon"></span>
1382 Migrating from WSC 5.2
1383 </label>
1384 <ul class="md-nav__list" data-md-scrollfix>
1385
1386
1387
1388
1389
1390 <li class="md-nav__item">
1391 <a href="../../wsc52/php/" class="md-nav__link">
1392 PHP API
1393 </a>
1394 </li>
1395
1396
1397
1398
1399
1400
1401
1402 <li class="md-nav__item">
1403 <a href="../../wsc52/templates/" class="md-nav__link">
1404 Templates and Languages
1405 </a>
1406 </li>
1407
1408
1409
1410
1411
1412
1413
1414 <li class="md-nav__item">
1415 <a href="../../wsc52/libraries/" class="md-nav__link">
1416 Third Party Libraries
1417 </a>
1418 </li>
1419
1420
1421
1422 </ul>
1423 </nav>
1424 </li>
1425
1426
1427
1428
1429
1430
1431
1432
1433 <li class="md-nav__item md-nav__item--nested">
1434
1435
1436 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" >
1437
1438 <label class="md-nav__link" for="__nav_6_3">
1439 Migrating from WSC 3.1
1440 <span class="md-nav__icon md-icon"></span>
1441 </label>
1442 <nav class="md-nav" aria-label="Migrating from WSC 3.1" data-md-level="2">
1443 <label class="md-nav__title" for="__nav_6_3">
1444 <span class="md-nav__icon md-icon"></span>
1445 Migrating from WSC 3.1
1446 </label>
1447 <ul class="md-nav__list" data-md-scrollfix>
1448
1449
1450
1451
1452
1453 <li class="md-nav__item">
1454 <a href="../php/" class="md-nav__link">
1455 PHP API
1456 </a>
1457 </li>
1458
1459
1460
1461 </ul>
1462 </nav>
1463 </li>
1464
1465
1466
1467
1468
1469
1470
1471
1472 <li class="md-nav__item md-nav__item--nested">
1473
1474
1475 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
1476
1477 <label class="md-nav__link" for="__nav_6_4">
1478 Migrating from WSC 3.0
1479 <span class="md-nav__icon md-icon"></span>
1480 </label>
1481 <nav class="md-nav" aria-label="Migrating from WSC 3.0" data-md-level="2">
1482 <label class="md-nav__title" for="__nav_6_4">
1483 <span class="md-nav__icon md-icon"></span>
1484 Migrating from WSC 3.0
1485 </label>
1486 <ul class="md-nav__list" data-md-scrollfix>
1487
1488
1489
1490
1491
1492 <li class="md-nav__item">
1493 <a href="../../wsc30/php/" class="md-nav__link">
1494 PHP API
1495 </a>
1496 </li>
1497
1498
1499
1500
1501
1502
1503
1504 <li class="md-nav__item">
1505 <a href="../../wsc30/javascript/" class="md-nav__link">
1506 JavaScript API
1507 </a>
1508 </li>
1509
1510
1511
1512
1513
1514
1515
1516 <li class="md-nav__item">
1517 <a href="../../wsc30/templates/" class="md-nav__link">
1518 Templates
1519 </a>
1520 </li>
1521
1522
1523
1524
1525
1526
1527
1528 <li class="md-nav__item">
1529 <a href="../../wsc30/css/" class="md-nav__link">
1530 CSS
1531 </a>
1532 </li>
1533
1534
1535
1536
1537
1538
1539
1540 <li class="md-nav__item">
1541 <a href="../../wsc30/package/" class="md-nav__link">
1542 Package Components
1543 </a>
1544 </li>
1545
1546
1547
1548 </ul>
1549 </nav>
1550 </li>
1551
1552
1553
1554
1555
1556
1557
1558
1559 <li class="md-nav__item md-nav__item--nested">
1560
1561
1562 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
1563
1564 <label class="md-nav__link" for="__nav_6_5">
1565 Migrating from WCF 2.1
1566 <span class="md-nav__icon md-icon"></span>
1567 </label>
1568 <nav class="md-nav" aria-label="Migrating from WCF 2.1" data-md-level="2">
1569 <label class="md-nav__title" for="__nav_6_5">
1570 <span class="md-nav__icon md-icon"></span>
1571 Migrating from WCF 2.1
1572 </label>
1573 <ul class="md-nav__list" data-md-scrollfix>
1574
1575
1576
1577
1578
1579 <li class="md-nav__item">
1580 <a href="../../wcf21/php/" class="md-nav__link">
1581 PHP API
1582 </a>
1583 </li>
1584
1585
1586
1587
1588
1589
1590
1591 <li class="md-nav__item">
1592 <a href="../../wcf21/templates/" class="md-nav__link">
1593 Templates
1594 </a>
1595 </li>
1596
1597
1598
1599
1600
1601
1602
1603 <li class="md-nav__item">
1604 <a href="../../wcf21/css/" class="md-nav__link">
1605 CSS
1606 </a>
1607 </li>
1608
1609
1610
1611
1612
1613
1614
1615 <li class="md-nav__item">
1616 <a href="../../wcf21/package/" class="md-nav__link">
1617 Package Components
1618 </a>
1619 </li>
1620
1621
1622
1623 </ul>
1624 </nav>
1625 </li>
1626
1627
1628
1629 </ul>
1630 </nav>
1631 </li>
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643 <li class="md-nav__item md-nav__item--nested">
1644
1645
1646 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
1647
1648 <label class="md-nav__link" for="__nav_7">
1649 Tutorials
1650 <span class="md-nav__icon md-icon"></span>
1651 </label>
1652 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
1653 <label class="md-nav__title" for="__nav_7">
1654 <span class="md-nav__icon md-icon"></span>
1655 Tutorials
1656 </label>
1657 <ul class="md-nav__list" data-md-scrollfix>
1658
1659
1660
1661
1662
1663
1664 <li class="md-nav__item md-nav__item--nested">
1665
1666
1667 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
1668
1669 <label class="md-nav__link" for="__nav_7_1">
1670 Tutorial Series
1671 <span class="md-nav__icon md-icon"></span>
1672 </label>
1673 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
1674 <label class="md-nav__title" for="__nav_7_1">
1675 <span class="md-nav__icon md-icon"></span>
1676 Tutorial Series
1677 </label>
1678 <ul class="md-nav__list" data-md-scrollfix>
1679
1680
1681
1682
1683
1684 <li class="md-nav__item">
1685 <a href="../../../tutorial/series/overview/" class="md-nav__link">
1686 Overview
1687 </a>
1688 </li>
1689
1690
1691
1692
1693
1694
1695
1696 <li class="md-nav__item">
1697 <a href="../../../tutorial/series/part_1/" class="md-nav__link">
1698 Part 1
1699 </a>
1700 </li>
1701
1702
1703
1704
1705
1706
1707
1708 <li class="md-nav__item">
1709 <a href="../../../tutorial/series/part_2/" class="md-nav__link">
1710 Part 2
1711 </a>
1712 </li>
1713
1714
1715
1716
1717
1718
1719
1720 <li class="md-nav__item">
1721 <a href="../../../tutorial/series/part_3/" class="md-nav__link">
1722 Part 3
1723 </a>
1724 </li>
1725
1726
1727
1728 </ul>
1729 </nav>
1730 </li>
1731
1732
1733
1734 </ul>
1735 </nav>
1736 </li>
1737
1738
1739
1740 </ul>
1741 </nav>
1742 </div>
1743 </div>
1744 </div>
1745
1746
1747
1748 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1749 <div class="md-sidebar__scrollwrap">
1750 <div class="md-sidebar__inner">
1751
1752 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1753
1754
1755
1756
1757
1758 <label class="md-nav__title" for="__toc">
1759 <span class="md-nav__icon md-icon"></span>
1760 Table of contents
1761 </label>
1762 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1763
1764 <li class="md-nav__item">
1765 <a href="#example-two-text-form-fields" class="md-nav__link">
1766 Example: Two Text Form Fields
1767 </a>
1768
1769 </li>
1770
1771 </ul>
1772
1773 </nav>
1774 </div>
1775 </div>
1776 </div>
1777
1778
1779 <div class="md-content" data-md-component="content">
1780 <article class="md-content__inner md-typeset">
1781
1782
1783 <a href="https://github.com/WoltLab/docs.woltlab.com/edit/5.4/docs/migration/wsc31/form-builder.md" title="Edit this page" class="md-content__button md-icon">
1784 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
1785 </a>
1786
1787
1788 <h1 id="migrating-from-wsc-31-form-builder">Migrating from WSC 3.1 - Form Builder<a class="headerlink" href="#migrating-from-wsc-31-form-builder" title="Permanent link">#</a></h1>
1789 <h2 id="example-two-text-form-fields">Example: Two Text Form Fields<a class="headerlink" href="#example-two-text-form-fields" title="Permanent link">#</a></h2>
1790 <p>As the first example, the pre-WoltLab Suite Core 5.2 versions of the forms to add and edit persons from the <a href="../../../tutorial/series/part_1/">first part of the tutorial series</a> will be updated to the new form builder API.
1791 This form is the perfect first examples as it is very simple with only two text fields whose only restriction is that they have to be filled out and that their values may not be longer than 255 characters each.</p>
1792 <p>As a reminder, here are the two relevant PHP files and the relevant template file:</p>
1793 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
1794 <span class="k">namespace</span> <span class="nx">wcf\acp\form</span><span class="p">;</span>
1795 <span class="k">use</span> <span class="nx">wcf\data\person\PersonAction</span><span class="p">;</span>
1796 <span class="k">use</span> <span class="nx">wcf\form\AbstractForm</span><span class="p">;</span>
1797 <span class="k">use</span> <span class="nx">wcf\system\exception\UserInputException</span><span class="p">;</span>
1798 <span class="k">use</span> <span class="nx">wcf\system\WCF</span><span class="p">;</span>
1799 <span class="k">use</span> <span class="nx">wcf\util\StringUtil</span><span class="p">;</span>
1800
1801 <span class="sd">/**</span>
1802 <span class="sd"> * Shows the form to create a new person.</span>
1803 <span class="sd"> * </span>
1804 <span class="sd"> * @author Matthias Schmidt</span>
1805 <span class="sd"> * @copyright 2001-2019 WoltLab GmbH</span>
1806 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
1807 <span class="sd"> * @package WoltLabSuite\Core\Acp\Form</span>
1808 <span class="sd"> */</span>
1809 <span class="k">class</span> <span class="nc">PersonAddForm</span> <span class="k">extends</span> <span class="nx">AbstractForm</span> <span class="p">{</span>
1810 <span class="sd">/**</span>
1811 <span class="sd"> * @inheritDoc</span>
1812 <span class="sd"> */</span>
1813 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">&#39;wcf.acp.menu.link.person.add&#39;</span><span class="p">;</span>
1814
1815 <span class="sd">/**</span>
1816 <span class="sd"> * first name of the person</span>
1817 <span class="sd"> * @var string</span>
1818 <span class="sd"> */</span>
1819 <span class="k">public</span> <span class="nv">$firstName</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
1820
1821 <span class="sd">/**</span>
1822 <span class="sd"> * last name of the person</span>
1823 <span class="sd"> * @var string</span>
1824 <span class="sd"> */</span>
1825 <span class="k">public</span> <span class="nv">$lastName</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
1826
1827 <span class="sd">/**</span>
1828 <span class="sd"> * @inheritDoc</span>
1829 <span class="sd"> */</span>
1830 <span class="k">public</span> <span class="nv">$neededPermissions</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;admin.content.canManagePeople&#39;</span><span class="p">];</span>
1831
1832 <span class="sd">/**</span>
1833 <span class="sd"> * @inheritDoc</span>
1834 <span class="sd"> */</span>
1835 <span class="k">public</span> <span class="k">function</span> <span class="nf">assignVariables</span><span class="p">()</span> <span class="p">{</span>
1836 <span class="k">parent</span><span class="o">::</span><span class="na">assignVariables</span><span class="p">();</span>
1837
1838 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">([</span>
1839 <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;add&#39;</span><span class="p">,</span>
1840 <span class="s1">&#39;firstName&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">,</span>
1841 <span class="s1">&#39;lastName&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span>
1842 <span class="p">]);</span>
1843 <span class="p">}</span>
1844
1845 <span class="sd">/**</span>
1846 <span class="sd"> * @inheritDoc</span>
1847 <span class="sd"> */</span>
1848 <span class="k">public</span> <span class="k">function</span> <span class="nf">readFormParameters</span><span class="p">()</span> <span class="p">{</span>
1849 <span class="k">parent</span><span class="o">::</span><span class="na">readFormParameters</span><span class="p">();</span>
1850
1851 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;firstName&#39;</span><span class="p">]))</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span> <span class="o">=</span> <span class="nx">StringUtil</span><span class="o">::</span><span class="na">trim</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;firstName&#39;</span><span class="p">]);</span>
1852 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;lastName&#39;</span><span class="p">]))</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span> <span class="o">=</span> <span class="nx">StringUtil</span><span class="o">::</span><span class="na">trim</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;lastName&#39;</span><span class="p">]);</span>
1853 <span class="p">}</span>
1854
1855 <span class="sd">/**</span>
1856 <span class="sd"> * @inheritDoc</span>
1857 <span class="sd"> */</span>
1858 <span class="k">public</span> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span> <span class="p">{</span>
1859 <span class="k">parent</span><span class="o">::</span><span class="na">save</span><span class="p">();</span>
1860
1861 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PersonAction</span><span class="p">([],</span> <span class="s1">&#39;create&#39;</span><span class="p">,</span> <span class="p">[</span>
1862 <span class="s1">&#39;data&#39;</span> <span class="o">=&gt;</span> <span class="nb">array_merge</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">additionalFields</span><span class="p">,</span> <span class="p">[</span>
1863 <span class="s1">&#39;firstName&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">,</span>
1864 <span class="s1">&#39;lastName&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span>
1865 <span class="p">])</span>
1866 <span class="p">]);</span>
1867 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
1868
1869 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">saved</span><span class="p">();</span>
1870
1871 <span class="c1">// reset values</span>
1872 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
1873 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
1874
1875 <span class="c1">// show success message</span>
1876 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">(</span><span class="s1">&#39;success&#39;</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
1877 <span class="p">}</span>
1878
1879 <span class="sd">/**</span>
1880 <span class="sd"> * @inheritDoc</span>
1881 <span class="sd"> */</span>
1882 <span class="k">public</span> <span class="k">function</span> <span class="nf">validate</span><span class="p">()</span> <span class="p">{</span>
1883 <span class="k">parent</span><span class="o">::</span><span class="na">validate</span><span class="p">();</span>
1884
1885 <span class="c1">// validate first name</span>
1886 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">))</span> <span class="p">{</span>
1887 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">);</span>
1888 <span class="p">}</span>
1889 <span class="k">if</span> <span class="p">(</span><span class="nb">mb_strlen</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">255</span><span class="p">)</span> <span class="p">{</span>
1890 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">,</span> <span class="s1">&#39;tooLong&#39;</span><span class="p">);</span>
1891 <span class="p">}</span>
1892
1893 <span class="c1">// validate last name</span>
1894 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span><span class="p">))</span> <span class="p">{</span>
1895 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">);</span>
1896 <span class="p">}</span>
1897 <span class="k">if</span> <span class="p">(</span><span class="nb">mb_strlen</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">255</span><span class="p">)</span> <span class="p">{</span>
1898 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">,</span> <span class="s1">&#39;tooLong&#39;</span><span class="p">);</span>
1899 <span class="p">}</span>
1900 <span class="p">}</span>
1901 <span class="p">}</span>
1902 </code></pre></div>
1903 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
1904 <span class="k">namespace</span> <span class="nx">wcf\acp\form</span><span class="p">;</span>
1905 <span class="k">use</span> <span class="nx">wcf\data\person\Person</span><span class="p">;</span>
1906 <span class="k">use</span> <span class="nx">wcf\data\person\PersonAction</span><span class="p">;</span>
1907 <span class="k">use</span> <span class="nx">wcf\form\AbstractForm</span><span class="p">;</span>
1908 <span class="k">use</span> <span class="nx">wcf\system\exception\IllegalLinkException</span><span class="p">;</span>
1909 <span class="k">use</span> <span class="nx">wcf\system\WCF</span><span class="p">;</span>
1910
1911 <span class="sd">/**</span>
1912 <span class="sd"> * Shows the form to edit an existing person.</span>
1913 <span class="sd"> * </span>
1914 <span class="sd"> * @author Matthias Schmidt</span>
1915 <span class="sd"> * @copyright 2001-2019 WoltLab GmbH</span>
1916 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
1917 <span class="sd"> * @package WoltLabSuite\Core\Acp\Form</span>
1918 <span class="sd"> */</span>
1919 <span class="k">class</span> <span class="nc">PersonEditForm</span> <span class="k">extends</span> <span class="nx">PersonAddForm</span> <span class="p">{</span>
1920 <span class="sd">/**</span>
1921 <span class="sd"> * @inheritDoc</span>
1922 <span class="sd"> */</span>
1923 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">&#39;wcf.acp.menu.link.person&#39;</span><span class="p">;</span>
1924
1925 <span class="sd">/**</span>
1926 <span class="sd"> * edited person object</span>
1927 <span class="sd"> * @var Person</span>
1928 <span class="sd"> */</span>
1929 <span class="k">public</span> <span class="nv">$person</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
1930
1931 <span class="sd">/**</span>
1932 <span class="sd"> * id of the edited person</span>
1933 <span class="sd"> * @var integer</span>
1934 <span class="sd"> */</span>
1935 <span class="k">public</span> <span class="nv">$personID</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
1936
1937 <span class="sd">/**</span>
1938 <span class="sd"> * @inheritDoc</span>
1939 <span class="sd"> */</span>
1940 <span class="k">public</span> <span class="k">function</span> <span class="nf">assignVariables</span><span class="p">()</span> <span class="p">{</span>
1941 <span class="k">parent</span><span class="o">::</span><span class="na">assignVariables</span><span class="p">();</span>
1942
1943 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">([</span>
1944 <span class="s1">&#39;action&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;edit&#39;</span><span class="p">,</span>
1945 <span class="s1">&#39;person&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span>
1946 <span class="p">]);</span>
1947 <span class="p">}</span>
1948
1949 <span class="sd">/**</span>
1950 <span class="sd"> * @inheritDoc</span>
1951 <span class="sd"> */</span>
1952 <span class="k">public</span> <span class="k">function</span> <span class="nf">readData</span><span class="p">()</span> <span class="p">{</span>
1953 <span class="k">parent</span><span class="o">::</span><span class="na">readData</span><span class="p">();</span>
1954
1955 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">))</span> <span class="p">{</span>
1956 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">;</span>
1957 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="o">-&gt;</span><span class="na">lastName</span><span class="p">;</span>
1958 <span class="p">}</span>
1959 <span class="p">}</span>
1960
1961 <span class="sd">/**</span>
1962 <span class="sd"> * @inheritDoc</span>
1963 <span class="sd"> */</span>
1964 <span class="k">public</span> <span class="k">function</span> <span class="nf">readParameters</span><span class="p">()</span> <span class="p">{</span>
1965 <span class="k">parent</span><span class="o">::</span><span class="na">readParameters</span><span class="p">();</span>
1966
1967 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]))</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">personID</span> <span class="o">=</span> <span class="nb">intval</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]);</span>
1968 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Person</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">);</span>
1969 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">)</span> <span class="p">{</span>
1970 <span class="k">throw</span> <span class="k">new</span> <span class="nx">IllegalLinkException</span><span class="p">();</span>
1971 <span class="p">}</span>
1972 <span class="p">}</span>
1973
1974 <span class="sd">/**</span>
1975 <span class="sd"> * @inheritDoc</span>
1976 <span class="sd"> */</span>
1977 <span class="k">public</span> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span> <span class="p">{</span>
1978 <span class="nx">AbstractForm</span><span class="o">::</span><span class="na">save</span><span class="p">();</span>
1979
1980 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PersonAction</span><span class="p">([</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="p">],</span> <span class="s1">&#39;update&#39;</span><span class="p">,</span> <span class="p">[</span>
1981 <span class="s1">&#39;data&#39;</span> <span class="o">=&gt;</span> <span class="nb">array_merge</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">additionalFields</span><span class="p">,</span> <span class="p">[</span>
1982 <span class="s1">&#39;firstName&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">,</span>
1983 <span class="s1">&#39;lastName&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span>
1984 <span class="p">])</span>
1985 <span class="p">]);</span>
1986 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
1987
1988 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">saved</span><span class="p">();</span>
1989
1990 <span class="c1">// show success message</span>
1991 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">(</span><span class="s1">&#39;success&#39;</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
1992 <span class="p">}</span>
1993 <span class="p">}</span>
1994 </code></pre></div>
1995 <div class="highlight"><pre><span></span><code><span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">&#39;header&#39;</span> <span class="nx">pageTitle</span><span class="o">=</span><span class="s1">&#39;wcf.acp.person.&#39;</span><span class="o">|</span><span class="nx">concat</span><span class="o">:</span><span class="nv">$action</span><span class="p">}</span>
1996
1997 <span class="o">&lt;</span><span class="nb">header</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentHeader&quot;</span><span class="o">&gt;</span>
1998 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentHeaderTitle&quot;</span><span class="o">&gt;</span>
1999 <span class="o">&lt;</span><span class="nx">h1</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentTitle&quot;</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="p">{</span><span class="nv">$action</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">h1</span><span class="o">&gt;</span>
2000 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
2001
2002 <span class="o">&lt;</span><span class="nx">nav</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentHeaderNavigation&quot;</span><span class="o">&gt;</span>
2003 <span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
2004 <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&quot;{link controller=&#39;PersonList&#39;}{/link}&quot;</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;button&quot;</span><span class="o">&gt;&lt;</span><span class="nx">span</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;icon icon16 fa-list&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">menu</span><span class="o">.</span><span class="nb">link</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="k">list</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">span</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nx">li</span><span class="o">&gt;</span>
2005
2006 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">&#39;contentHeaderNavigation&#39;</span><span class="p">}</span>
2007 <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span>
2008 <span class="o">&lt;/</span><span class="nx">nav</span><span class="o">&gt;</span>
2009 <span class="o">&lt;/</span><span class="nb">header</span><span class="o">&gt;</span>
2010
2011 <span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">&#39;formError&#39;</span><span class="p">}</span>
2012
2013 <span class="p">{</span><span class="k">if</span> <span class="nv">$success</span><span class="o">|</span><span class="nb">isset</span><span class="p">}</span>
2014 <span class="o">&lt;</span><span class="nx">p</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;success&quot;</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="k">global</span><span class="o">.</span><span class="nx">success</span><span class="o">.</span><span class="p">{</span><span class="nv">$action</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">p</span><span class="o">&gt;</span>
2015 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
2016
2017 <span class="o">&lt;</span><span class="nx">form</span> <span class="nx">method</span><span class="o">=</span><span class="s2">&quot;post&quot;</span> <span class="nx">action</span><span class="o">=</span><span class="s2">&quot;{if </span><span class="si">$action</span><span class="s2"> == &#39;add&#39;}{link controller=&#39;PersonAdd&#39;}{/link}{else}{link controller=&#39;PersonEdit&#39; object=</span><span class="si">$person</span><span class="s2">}{/link}{/if}&quot;</span><span class="o">&gt;</span>
2018 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;section&quot;</span><span class="o">&gt;</span>
2019 <span class="o">&lt;</span><span class="nb">dl</span><span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">&#39;firstName&#39;</span><span class="p">}</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;formError&quot;</span><span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span><span class="o">&gt;</span>
2020 <span class="o">&lt;</span><span class="nx">dt</span><span class="o">&gt;&lt;</span><span class="nx">label</span> <span class="k">for</span><span class="o">=</span><span class="s2">&quot;firstName&quot;</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">firstName</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">label</span><span class="o">&gt;&lt;/</span><span class="nx">dt</span><span class="o">&gt;</span>
2021 <span class="o">&lt;</span><span class="nx">dd</span><span class="o">&gt;</span>
2022 <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;firstName&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;firstName&quot;</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">{</span><span class="nv">$firstName</span><span class="si">}</span><span class="s2">&quot;</span> <span class="nx">required</span> <span class="nx">autofocus</span> <span class="nx">maxlength</span><span class="o">=</span><span class="s2">&quot;255&quot;</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;long&quot;</span><span class="o">&gt;</span>
2023 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">&#39;firstName&#39;</span><span class="p">}</span>
2024 <span class="o">&lt;</span><span class="nx">small</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;innerError&quot;</span><span class="o">&gt;</span>
2025 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorType</span> <span class="o">==</span> <span class="s1">&#39;empty&#39;</span><span class="p">}</span>
2026 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="k">global</span><span class="o">.</span><span class="nx">form</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="k">empty</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
2027 <span class="p">{</span><span class="k">else</span><span class="p">}</span>
2028 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">firstName</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="p">{</span><span class="nv">$errorType</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
2029 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
2030 <span class="o">&lt;/</span><span class="nx">small</span><span class="o">&gt;</span>
2031 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
2032 <span class="o">&lt;/</span><span class="nx">dd</span><span class="o">&gt;</span>
2033 <span class="o">&lt;/</span><span class="nb">dl</span><span class="o">&gt;</span>
2034
2035 <span class="o">&lt;</span><span class="nb">dl</span><span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">&#39;lastName&#39;</span><span class="p">}</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;formError&quot;</span><span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span><span class="o">&gt;</span>
2036 <span class="o">&lt;</span><span class="nx">dt</span><span class="o">&gt;&lt;</span><span class="nx">label</span> <span class="k">for</span><span class="o">=</span><span class="s2">&quot;lastName&quot;</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">lastName</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">label</span><span class="o">&gt;&lt;/</span><span class="nx">dt</span><span class="o">&gt;</span>
2037 <span class="o">&lt;</span><span class="nx">dd</span><span class="o">&gt;</span>
2038 <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;text&quot;</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;lastName&quot;</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;lastName&quot;</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">{</span><span class="nv">$lastName</span><span class="si">}</span><span class="s2">&quot;</span> <span class="nx">required</span> <span class="nx">maxlength</span><span class="o">=</span><span class="s2">&quot;255&quot;</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;long&quot;</span><span class="o">&gt;</span>
2039 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">&#39;lastName&#39;</span><span class="p">}</span>
2040 <span class="o">&lt;</span><span class="nx">small</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;innerError&quot;</span><span class="o">&gt;</span>
2041 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorType</span> <span class="o">==</span> <span class="s1">&#39;empty&#39;</span><span class="p">}</span>
2042 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="k">global</span><span class="o">.</span><span class="nx">form</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="k">empty</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
2043 <span class="p">{</span><span class="k">else</span><span class="p">}</span>
2044 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">lastName</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="p">{</span><span class="nv">$errorType</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
2045 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
2046 <span class="o">&lt;/</span><span class="nx">small</span><span class="o">&gt;</span>
2047 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
2048 <span class="o">&lt;/</span><span class="nx">dd</span><span class="o">&gt;</span>
2049 <span class="o">&lt;/</span><span class="nb">dl</span><span class="o">&gt;</span>
2050
2051 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">&#39;dataFields&#39;</span><span class="p">}</span>
2052 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
2053
2054 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">&#39;sections&#39;</span><span class="p">}</span>
2055
2056 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;formSubmit&quot;</span><span class="o">&gt;</span>
2057 <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">&quot;submit&quot;</span> <span class="nx">value</span><span class="o">=</span><span class="s2">&quot;{lang}wcf.global.button.submit{/lang}&quot;</span> <span class="nx">accesskey</span><span class="o">=</span><span class="s2">&quot;s&quot;</span><span class="o">&gt;</span>
2058 <span class="p">{</span><span class="o">@</span><span class="nx">SECURITY_TOKEN_INPUT_TAG</span><span class="p">}</span>
2059 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
2060 <span class="o">&lt;/</span><span class="nx">form</span><span class="o">&gt;</span>
2061
2062 <span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">&#39;footer&#39;</span><span class="p">}</span>
2063 </code></pre></div>
2064 <p>Updating the template is easy as the complete form is replace by a single line of code:</p>
2065 <div class="highlight"><pre><span></span><code><span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">&#39;header&#39;</span> <span class="nx">pageTitle</span><span class="o">=</span><span class="s1">&#39;wcf.acp.person.&#39;</span><span class="o">|</span><span class="nx">concat</span><span class="o">:</span><span class="nv">$action</span><span class="p">}</span>
2066
2067 <span class="o">&lt;</span><span class="nb">header</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentHeader&quot;</span><span class="o">&gt;</span>
2068 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentHeaderTitle&quot;</span><span class="o">&gt;</span>
2069 <span class="o">&lt;</span><span class="nx">h1</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentTitle&quot;</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="p">{</span><span class="nv">$action</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">h1</span><span class="o">&gt;</span>
2070 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
2071
2072 <span class="o">&lt;</span><span class="nx">nav</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;contentHeaderNavigation&quot;</span><span class="o">&gt;</span>
2073 <span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
2074 <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&quot;{link controller=&#39;PersonList&#39;}{/link}&quot;</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;button&quot;</span><span class="o">&gt;&lt;</span><span class="nx">span</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;icon icon16 fa-list&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">menu</span><span class="o">.</span><span class="nb">link</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="k">list</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">span</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nx">li</span><span class="o">&gt;</span>
2075
2076 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">&#39;contentHeaderNavigation&#39;</span><span class="p">}</span>
2077 <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span>
2078 <span class="o">&lt;/</span><span class="nx">nav</span><span class="o">&gt;</span>
2079 <span class="o">&lt;/</span><span class="nb">header</span><span class="o">&gt;</span>
2080
2081 <span class="p">{</span><span class="o">@</span><span class="nv">$form</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">()}</span>
2082
2083 <span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">&#39;footer&#39;</span><span class="p">}</span>
2084 </code></pre></div>
2085 <p><code>PersonEditForm</code> also becomes much simpler:
2086 only the edited <code>Person</code> object must be read:</p>
2087 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2088 <span class="k">namespace</span> <span class="nx">wcf\acp\form</span><span class="p">;</span>
2089 <span class="k">use</span> <span class="nx">wcf\data\person\Person</span><span class="p">;</span>
2090 <span class="k">use</span> <span class="nx">wcf\system\exception\IllegalLinkException</span><span class="p">;</span>
2091
2092 <span class="sd">/**</span>
2093 <span class="sd"> * Shows the form to edit an existing person.</span>
2094 <span class="sd"> * </span>
2095 <span class="sd"> * @author Matthias Schmidt</span>
2096 <span class="sd"> * @copyright 2001-2019 WoltLab GmbH</span>
2097 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
2098 <span class="sd"> * @package WoltLabSuite\Core\Acp\Form</span>
2099 <span class="sd"> */</span>
2100 <span class="k">class</span> <span class="nc">PersonEditForm</span> <span class="k">extends</span> <span class="nx">PersonAddForm</span> <span class="p">{</span>
2101 <span class="sd">/**</span>
2102 <span class="sd"> * @inheritDoc</span>
2103 <span class="sd"> */</span>
2104 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">&#39;wcf.acp.menu.link.person&#39;</span><span class="p">;</span>
2105
2106 <span class="sd">/**</span>
2107 <span class="sd"> * @inheritDoc</span>
2108 <span class="sd"> */</span>
2109 <span class="k">public</span> <span class="k">function</span> <span class="nf">readParameters</span><span class="p">()</span> <span class="p">{</span>
2110 <span class="k">parent</span><span class="o">::</span><span class="na">readParameters</span><span class="p">();</span>
2111
2112 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]))</span> <span class="p">{</span>
2113 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">formObject</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Person</span><span class="p">(</span><span class="nb">intval</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]));</span>
2114 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">formObject</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">)</span> <span class="p">{</span>
2115 <span class="k">throw</span> <span class="k">new</span> <span class="nx">IllegalLinkException</span><span class="p">();</span>
2116 <span class="p">}</span>
2117 <span class="p">}</span>
2118 <span class="p">}</span>
2119 <span class="p">}</span>
2120 </code></pre></div>
2121 <p>Most of the work is done in <code>PersonAddForm</code>:</p>
2122 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2123 <span class="k">namespace</span> <span class="nx">wcf\acp\form</span><span class="p">;</span>
2124 <span class="k">use</span> <span class="nx">wcf\data\person\PersonAction</span><span class="p">;</span>
2125 <span class="k">use</span> <span class="nx">wcf\form\AbstractFormBuilderForm</span><span class="p">;</span>
2126 <span class="k">use</span> <span class="nx">wcf\system\form\builder\container\FormContainer</span><span class="p">;</span>
2127 <span class="k">use</span> <span class="nx">wcf\system\form\builder\field\TextFormField</span><span class="p">;</span>
2128
2129 <span class="sd">/**</span>
2130 <span class="sd"> * Shows the form to create a new person.</span>
2131 <span class="sd"> * </span>
2132 <span class="sd"> * @author Matthias Schmidt</span>
2133 <span class="sd"> * @copyright 2001-2019 WoltLab GmbH</span>
2134 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
2135 <span class="sd"> * @package WoltLabSuite\Core\Acp\Form</span>
2136 <span class="sd"> */</span>
2137 <span class="k">class</span> <span class="nc">PersonAddForm</span> <span class="k">extends</span> <span class="nx">AbstractFormBuilderForm</span> <span class="p">{</span>
2138 <span class="sd">/**</span>
2139 <span class="sd"> * @inheritDoc</span>
2140 <span class="sd"> */</span>
2141 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">&#39;wcf.acp.menu.link.person.add&#39;</span><span class="p">;</span>
2142
2143 <span class="sd">/**</span>
2144 <span class="sd"> * @inheritDoc</span>
2145 <span class="sd"> */</span>
2146 <span class="k">public</span> <span class="nv">$formAction</span> <span class="o">=</span> <span class="s1">&#39;create&#39;</span><span class="p">;</span>
2147
2148 <span class="sd">/**</span>
2149 <span class="sd"> * @inheritDoc</span>
2150 <span class="sd"> */</span>
2151 <span class="k">public</span> <span class="nv">$neededPermissions</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;admin.content.canManagePeople&#39;</span><span class="p">];</span>
2152
2153 <span class="sd">/**</span>
2154 <span class="sd"> * @inheritDoc</span>
2155 <span class="sd"> */</span>
2156 <span class="k">public</span> <span class="nv">$objectActionClass</span> <span class="o">=</span> <span class="nx">PersonAction</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
2157
2158 <span class="sd">/**</span>
2159 <span class="sd"> * @inheritDoc</span>
2160 <span class="sd"> */</span>
2161 <span class="k">protected</span> <span class="k">function</span> <span class="nf">createForm</span><span class="p">()</span> <span class="p">{</span>
2162 <span class="k">parent</span><span class="o">::</span><span class="na">createForm</span><span class="p">();</span>
2163
2164 <span class="nv">$dataContainer</span> <span class="o">=</span> <span class="nx">FormContainer</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;data&#39;</span><span class="p">)</span>
2165 <span class="o">-&gt;</span><span class="na">appendChildren</span><span class="p">([</span>
2166 <span class="nx">TextFormField</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">)</span>
2167 <span class="o">-&gt;</span><span class="na">label</span><span class="p">(</span><span class="s1">&#39;wcf.person.firstName&#39;</span><span class="p">)</span>
2168 <span class="o">-&gt;</span><span class="na">required</span><span class="p">()</span>
2169 <span class="o">-&gt;</span><span class="na">maximumLength</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span>
2170
2171 <span class="nx">TextFormField</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">)</span>
2172 <span class="o">-&gt;</span><span class="na">label</span><span class="p">(</span><span class="s1">&#39;wcf.person.lastName&#39;</span><span class="p">)</span>
2173 <span class="o">-&gt;</span><span class="na">required</span><span class="p">()</span>
2174 <span class="o">-&gt;</span><span class="na">maximumLength</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span>
2175 <span class="p">]);</span>
2176
2177 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">form</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$dataContainer</span><span class="p">);</span>
2178 <span class="p">}</span>
2179 <span class="p">}</span>
2180 </code></pre></div>
2181 <p>But, as you can see, the number of lines almost decreased by half.
2182 All changes are due to extending <code>AbstractFormBuilderForm</code>:</p>
2183 <ul>
2184 <li><code>$formAction</code> is added and set to <code>create</code> as the form is used to create a new person.
2185 In the edit form, <code>$formAction</code> has not to be set explicitly as it is done automatically if a <code>$formObject</code> is set.</li>
2186 <li><code>$objectActionClass</code> is set to <code>PersonAction::class</code> and is the class name of the used <code>AbstractForm::$objectAction</code> object to create and update the <code>Person</code> object.</li>
2187 <li><code>AbstractFormBuilderForm::createForm()</code> is overridden and the form contents are added:
2188 a form container representing the <code>div.section</code> element from the old version and the two form fields with the same ids and labels as before.
2189 The contents of the old <code>validate()</code> method is put into two method calls:
2190 <code>required()</code> to ensure that the form is filled out and <code>maximumLength(255)</code> to ensure that the names are not longer than 255 characters.</li>
2191 </ul>
2192
2193
2194
2195
2196 <hr>
2197 <div class="md-source-date">
2198 <small>
2199
2200 Last update: 2021-01-15
2201
2202 </small>
2203 </div>
2204
2205
2206
2207
2208
2209
2210
2211
2212 </article>
2213 </div>
2214 </div>
2215 </main>
2216
2217
2218 <footer class="md-footer">
2219
2220 <div class="md-footer-meta md-typeset">
2221 <div class="md-footer-meta__inner md-grid">
2222 <div class="md-footer-copyright">
2223
2224 <div class="md-footer-copyright__highlight">
2225 Copyright © 2020 WoltLab GmbH
2226 </div>
2227
2228 Made with
2229 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2230 Material for MkDocs
2231 </a>
2232
2233 </div>
2234 <div class="md-footer-copyright">
2235 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
2236 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
2237 </div>
2238 </div>
2239 </div>
2240 </footer>
2241
2242 </div>
2243 <div class="md-dialog" data-md-component="dialog">
2244 <div class="md-dialog__inner md-typeset"></div>
2245 </div>
2246 <script id="__config" type="application/json">{"base": "../../..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../../../assets/javascripts/workers/search.fb4a9340.min.js", "version": {"provider": "mike"}}</script>
2247
2248
2249 <script src="../../../assets/javascripts/bundle.5cf3e710.min.js"></script>
2250
2251
2252 </body>
2253 </html>