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