Deployed 506b5bb to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / latest / php / api / form_builder / structure / index.html
CommitLineData
0c5338dd
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
12 <link rel="shortcut icon" href="../../../../assets/default.favicon.ico">
fb88dc6e 13 <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.0.5">
0c5338dd
TD
14
15
16
17 <title>Structure - WoltLab Suite Documentation</title>
18
19
20
fb88dc6e 21 <link rel="stylesheet" href="../../../../assets/stylesheets/main.77f3fd56.min.css">
0c5338dd
TD
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 <link rel="stylesheet" href="../../../../stylesheets/extra.css">
38
39
40
41
42
43 </head>
44
45
46
47
48
49
50
51 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="">
52
53
54
55 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
56 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
57 <label class="md-overlay" for="__drawer"></label>
58 <div data-md-component="skip">
59
60
61 <a href="#structure-of-form-builder" class="md-skip">
62 Skip to content
63 </a>
64
65 </div>
66 <div data-md-component="announce">
67
68 <aside class="md-announce">
69 <div class="md-announce__inner md-grid md-typeset">
70
71 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
72
73 </div>
74 </aside>
75
76 </div>
77
78
79
80<header class="md-header" data-md-component="header">
81 <nav class="md-header__inner md-grid" aria-label="Header">
82 <a href="../../../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation">
83
84 <img src="../../../../assets/logo.png" alt="logo">
85
86 </a>
87 <label class="md-header__button md-icon" for="__drawer">
88 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
89 </label>
90 <div class="md-header__title" data-md-component="header-title">
91 <div class="md-header__ellipsis">
92 <div class="md-header__topic">
93 <span class="md-ellipsis">
94 WoltLab Suite Documentation
95 </span>
96 </div>
97 <div class="md-header__topic" data-md-component="header-topic">
98 <span class="md-ellipsis">
99
100 Structure
101
102 </span>
103 </div>
104 </div>
105 </div>
106 <div class="md-header__options">
107
108 </div>
109
110 <label class="md-header__button md-icon" for="__search">
111 <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>
112 </label>
113
114<div class="md-search" data-md-component="search" role="dialog">
115 <label class="md-search__overlay" for="__search"></label>
116 <div class="md-search__inner" role="search">
117 <form class="md-search__form" name="search">
118 <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>
119 <label class="md-search__icon md-icon" for="__search">
120 <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>
121 <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>
122 </label>
123 <button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
124 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.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>
125 </button>
126 </form>
127 <div class="md-search__output">
128 <div class="md-search__scrollwrap" data-md-scrollfix>
129 <div class="md-search-result" data-md-component="search-result">
130 <div class="md-search-result__meta">
131 Initializing search
132 </div>
133 <ol class="md-search-result__list"></ol>
134 </div>
135 </div>
136 </div>
137 </div>
138</div>
139
140
141 </nav>
142</header>
143
144 <div class="md-container" data-md-component="container">
145
146
147
148
149 <main class="md-main" data-md-component="main">
150 <div class="md-main__inner md-grid">
151
152
153
154 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
155 <div class="md-sidebar__scrollwrap">
156 <div class="md-sidebar__inner">
157
158
159
160
161
162<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
163 <label class="md-nav__title" for="__drawer">
164 <a href="../../../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation">
165
166 <img src="../../../../assets/logo.png" alt="logo">
167
168 </a>
169 WoltLab Suite Documentation
170 </label>
171
172 <ul class="md-nav__list" data-md-scrollfix>
173
174
175
176
177
178
179
180
181 <li class="md-nav__item">
182 <a href="../../../../getting-started/" class="md-nav__link">
183 Getting Started
184 </a>
185 </li>
186
187
188
189
190
191
192
193
194
195
196
197
198
199 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
200
201
202 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" checked>
203
204 <label class="md-nav__link" for="__nav_2">
205 PHP API
206 <span class="md-nav__icon md-icon"></span>
207 </label>
208 <nav class="md-nav" aria-label="PHP API" data-md-level="1">
209 <label class="md-nav__title" for="__nav_2">
210 <span class="md-nav__icon md-icon"></span>
211 PHP API
212 </label>
213 <ul class="md-nav__list" data-md-scrollfix>
214
215
216
217
218
219 <li class="md-nav__item">
220 <a href="../../../pages/" class="md-nav__link">
221 Pages
222 </a>
223 </li>
224
225
226
227
228
229
230
231 <li class="md-nav__item">
232 <a href="../../../database-objects/" class="md-nav__link">
233 Database Objects
234 </a>
235 </li>
236
237
238
239
240
241
242
243 <li class="md-nav__item">
244 <a href="../../../database-access/" class="md-nav__link">
245 Database Access
246 </a>
247 </li>
248
249
250
251
252
253
254
255 <li class="md-nav__item">
256 <a href="../../../exceptions/" class="md-nav__link">
257 Exceptions
258 </a>
259 </li>
260
261
262
263
264
265
266
267
268
269
270 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
271
272
273 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" checked>
274
275 <label class="md-nav__link" for="__nav_2_5">
276 API
277 <span class="md-nav__icon md-icon"></span>
278 </label>
279 <nav class="md-nav" aria-label="API" data-md-level="2">
280 <label class="md-nav__title" for="__nav_2_5">
281 <span class="md-nav__icon md-icon"></span>
282 API
283 </label>
284 <ul class="md-nav__list" data-md-scrollfix>
285
286
287
288
289
290 <li class="md-nav__item">
291 <a href="../../caches/" class="md-nav__link">
292 Caches
293 </a>
294 </li>
295
296
297
298
299
300
301
302 <li class="md-nav__item">
303 <a href="../../comments/" class="md-nav__link">
304 Comments
305 </a>
306 </li>
307
308
309
310
311
312
313
314 <li class="md-nav__item">
315 <a href="../../cronjobs/" class="md-nav__link">
316 Cronjobs
317 </a>
318 </li>
319
320
321
322
323
324
325
326 <li class="md-nav__item">
327 <a href="../../events/" class="md-nav__link">
328 Events
329 </a>
330 </li>
331
332
333
334
335
336
337
338
339
340
341 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
342
343
344 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" checked>
345
346 <label class="md-nav__link" for="__nav_2_5_5">
347 Form Builder
348 <span class="md-nav__icon md-icon"></span>
349 </label>
350 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
351 <label class="md-nav__title" for="__nav_2_5_5">
352 <span class="md-nav__icon md-icon"></span>
353 Form Builder
354 </label>
355 <ul class="md-nav__list" data-md-scrollfix>
356
357
358
359
360
361 <li class="md-nav__item">
362 <a href="../overview/" class="md-nav__link">
363 Overview
364 </a>
365 </li>
366
367
368
369
370
371
372
373
374
375 <li class="md-nav__item md-nav__item--active">
376
377 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
378
379
380
381
382 <label class="md-nav__link md-nav__link--active" for="__toc">
383 Structure
384 <span class="md-nav__icon md-icon"></span>
385 </label>
386
387 <a href="./" class="md-nav__link md-nav__link--active">
388 Structure
389 </a>
390
391
392<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
393
394
395
396
397
398 <label class="md-nav__title" for="__toc">
399 <span class="md-nav__icon md-icon"></span>
400 Table of contents
401 </label>
402 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
403
404 <li class="md-nav__item">
405 <a href="#form-nodes" class="md-nav__link">
406 Form Nodes
407 </a>
408
409 <nav class="md-nav" aria-label="Form Nodes">
410 <ul class="md-nav__list">
411
412 <li class="md-nav__item">
413 <a href="#iformnode" class="md-nav__link">
414 IFormNode
415 </a>
416
417</li>
418
419 <li class="md-nav__item">
420 <a href="#iformchildnode" class="md-nav__link">
421 IFormChildNode
422 </a>
423
424</li>
425
426 <li class="md-nav__item">
427 <a href="#iformparentnode" class="md-nav__link">
428 IFormParentNode
429 </a>
430
431</li>
432
433 <li class="md-nav__item">
434 <a href="#iformelement" class="md-nav__link">
435 IFormElement
436 </a>
437
438</li>
439
440 <li class="md-nav__item">
441 <a href="#iobjecttypeformnode" class="md-nav__link">
442 IObjectTypeFormNode
443 </a>
444
445</li>
446
447 <li class="md-nav__item">
448 <a href="#customformnode" class="md-nav__link">
449 CustomFormNode
450 </a>
451
452</li>
453
454 <li class="md-nav__item">
455 <a href="#templateformnode" class="md-nav__link">
456 TemplateFormNode
457 </a>
458
459</li>
460
461 </ul>
462 </nav>
463
464</li>
465
466 <li class="md-nav__item">
467 <a href="#form-document" class="md-nav__link">
468 Form Document
469 </a>
470
471</li>
472
473 <li class="md-nav__item">
474 <a href="#form-button" class="md-nav__link">
475 Form Button
476 </a>
477
478</li>
479
480 <li class="md-nav__item">
481 <a href="#form-container" class="md-nav__link">
482 Form Container
483 </a>
484
485</li>
486
487 <li class="md-nav__item">
488 <a href="#form-field" class="md-nav__link">
489 Form Field
490 </a>
491
492 <nav class="md-nav" aria-label="Form Field">
493 <ul class="md-nav__list">
494
495 <li class="md-nav__item">
496 <a href="#form-field-interfaces-and-traits" class="md-nav__link">
497 Form Field Interfaces and Traits
498 </a>
499
500 <nav class="md-nav" aria-label="Form Field Interfaces and Traits">
501 <ul class="md-nav__list">
502
503 <li class="md-nav__item">
504 <a href="#iattributeformfield" class="md-nav__link">
505 IAttributeFormField
506 </a>
507
508</li>
509
510 <li class="md-nav__item">
511 <a href="#iautocompleteformfield" class="md-nav__link">
512 IAutoCompleteFormField
513 </a>
514
515</li>
516
517 <li class="md-nav__item">
518 <a href="#iautofocusformfield" class="md-nav__link">
519 IAutoFocusFormField
520 </a>
521
522</li>
523
524 <li class="md-nav__item">
525 <a href="#icssclassformfield" class="md-nav__link">
526 ICssClassFormField
527 </a>
528
529</li>
530
531 <li class="md-nav__item">
532 <a href="#ifileformfield" class="md-nav__link">
533 IFileFormField
534 </a>
535
536</li>
537
538 <li class="md-nav__item">
539 <a href="#ifilterableselectionformfield" class="md-nav__link">
540 IFilterableSelectionFormField
541 </a>
542
543</li>
544
545 <li class="md-nav__item">
546 <a href="#ii18nformfield" class="md-nav__link">
547 II18nFormField
548 </a>
549
550</li>
551
552 <li class="md-nav__item">
553 <a href="#iimmutableformfield" class="md-nav__link">
554 IImmutableFormField
555 </a>
556
557</li>
558
559 <li class="md-nav__item">
560 <a href="#iinputmodeformfield" class="md-nav__link">
561 IInputModeFormField
562 </a>
563
564</li>
565
566 <li class="md-nav__item">
567 <a href="#imaximumformfield" class="md-nav__link">
568 IMaximumFormField
569 </a>
570
571</li>
572
573 <li class="md-nav__item">
574 <a href="#imaximumlengthformfield" class="md-nav__link">
575 IMaximumLengthFormField
576 </a>
577
578</li>
579
580 <li class="md-nav__item">
581 <a href="#iminimumformfield" class="md-nav__link">
582 IMinimumFormField
583 </a>
584
585</li>
586
587 <li class="md-nav__item">
588 <a href="#iminimumlengthformfield" class="md-nav__link">
589 IMinimumLengthFormField
590 </a>
591
592</li>
593
594 <li class="md-nav__item">
595 <a href="#imultipleformfield" class="md-nav__link">
596 IMultipleFormField
597 </a>
598
599</li>
600
601 <li class="md-nav__item">
602 <a href="#inullableformfield" class="md-nav__link">
603 INullableFormField
604 </a>
605
606</li>
607
608 <li class="md-nav__item">
609 <a href="#ipackagesformfield" class="md-nav__link">
610 IPackagesFormField
611 </a>
612
613</li>
614
615 <li class="md-nav__item">
616 <a href="#ipatternformfield" class="md-nav__link">
617 IPatternFormField
618 </a>
619
620</li>
621
622 <li class="md-nav__item">
623 <a href="#iplaceholderformfield" class="md-nav__link">
624 IPlaceholderFormField
625 </a>
626
627</li>
628
629 <li class="md-nav__item">
630 <a href="#iselectionformfield" class="md-nav__link">
631 ISelectionFormField
632 </a>
633
634</li>
635
636 <li class="md-nav__item">
637 <a href="#isuffixedformfield" class="md-nav__link">
638 ISuffixedFormField
639 </a>
640
641</li>
642
643 <li class="md-nav__item">
644 <a href="#tdefaultidformfield" class="md-nav__link">
645 TDefaultIdFormField
646 </a>
647
648</li>
649
650 </ul>
651 </nav>
652
653</li>
654
655 </ul>
656 </nav>
657
658</li>
659
660 <li class="md-nav__item">
661 <a href="#displaying-forms" class="md-nav__link">
662 Displaying Forms
663 </a>
664
665</li>
666
667 </ul>
668
669</nav>
670
671 </li>
672
673
674
675
676
677
678
679 <li class="md-nav__item">
680 <a href="../form_fields/" class="md-nav__link">
681 Fields
682 </a>
683 </li>
684
685
686
687
688
689
690
691 <li class="md-nav__item">
692 <a href="../validation_data/" class="md-nav__link">
693 Validation and Data
694 </a>
695 </li>
696
697
698
699
700
701
702
703 <li class="md-nav__item">
704 <a href="../dependencies/" class="md-nav__link">
705 Dependencies
706 </a>
707 </li>
708
709
710
711 </ul>
712 </nav>
713 </li>
714
715
716
717
718
719
720
721 <li class="md-nav__item">
722 <a href="../../package_installation_plugins/" class="md-nav__link">
723 Package Installation Plugins
724 </a>
725 </li>
726
727
728
729
730
731
732
733 <li class="md-nav__item">
734 <a href="../../user_activity_points/" class="md-nav__link">
735 User Activity Points
736 </a>
737 </li>
738
739
740
741
742
743
744
745 <li class="md-nav__item">
746 <a href="../../user_notifications/" class="md-nav__link">
747 User Notifications
748 </a>
749 </li>
750
751
752
753
754
755
756
757 <li class="md-nav__item">
758 <a href="../../sitemaps/" class="md-nav__link">
759 Sitemaps
760 </a>
761 </li>
762
763
764
765 </ul>
766 </nav>
767 </li>
768
769
770
771
772
773
774
775 <li class="md-nav__item">
776 <a href="../../../code-style/" class="md-nav__link">
777 Code Style
778 </a>
779 </li>
780
781
782
783
784
785
786
787 <li class="md-nav__item">
788 <a href="../../../apps/" class="md-nav__link">
789 Apps
790 </a>
791 </li>
792
793
794
795
796
797
798
799 <li class="md-nav__item">
800 <a href="../../../gdpr/" class="md-nav__link">
801 GDPR
802 </a>
803 </li>
804
805
806
807 </ul>
808 </nav>
809 </li>
810
811
812
813
814
815
816
817
818
819
820
821 <li class="md-nav__item md-nav__item--nested">
822
823
824 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
825
826 <label class="md-nav__link" for="__nav_3">
827 Languages, Templates & CSS
828 <span class="md-nav__icon md-icon"></span>
829 </label>
830 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
831 <label class="md-nav__title" for="__nav_3">
832 <span class="md-nav__icon md-icon"></span>
833 Languages, Templates & CSS
834 </label>
835 <ul class="md-nav__list" data-md-scrollfix>
836
837
838
839
840
841 <li class="md-nav__item">
842 <a href="../../../../view/languages/" class="md-nav__link">
843 Languages
844 </a>
845 </li>
846
847
848
849
850
851
852
853 <li class="md-nav__item">
854 <a href="../../../../view/templates/" class="md-nav__link">
855 Templates
856 </a>
857 </li>
858
859
860
861
862
863
864
865 <li class="md-nav__item">
866 <a href="../../../../view/css/" class="md-nav__link">
867 CSS
868 </a>
869 </li>
870
871
872
873 </ul>
874 </nav>
875 </li>
876
877
878
879
880
881
882
883
884
885
886
887 <li class="md-nav__item md-nav__item--nested">
888
889
890 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
891
892 <label class="md-nav__link" for="__nav_4">
893 JavaScript API
894 <span class="md-nav__icon md-icon"></span>
895 </label>
896 <nav class="md-nav" aria-label="JavaScript API" data-md-level="1">
897 <label class="md-nav__title" for="__nav_4">
898 <span class="md-nav__icon md-icon"></span>
899 JavaScript API
900 </label>
901 <ul class="md-nav__list" data-md-scrollfix>
902
903
904
905
906
907 <li class="md-nav__item">
908 <a href="../../../../javascript/general-usage/" class="md-nav__link">
909 General Usage
910 </a>
911 </li>
912
913
914
915
916
917
918
919
920 <li class="md-nav__item md-nav__item--nested">
921
922
923 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
924
925 <label class="md-nav__link" for="__nav_4_2">
926 New API
927 <span class="md-nav__icon md-icon"></span>
928 </label>
929 <nav class="md-nav" aria-label="New API" data-md-level="2">
930 <label class="md-nav__title" for="__nav_4_2">
931 <span class="md-nav__icon md-icon"></span>
932 New API
933 </label>
934 <ul class="md-nav__list" data-md-scrollfix>
935
936
937
938
939
940 <li class="md-nav__item">
941 <a href="../../../../javascript/new-api_writing-a-module/" class="md-nav__link">
942 Writing a module
943 </a>
944 </li>
945
946
947
948
949
950
951
952 <li class="md-nav__item">
953 <a href="../../../../javascript/new-api_data-structures/" class="md-nav__link">
954 Data Structures
955 </a>
956 </li>
957
958
959
960
961
962
963
964 <li class="md-nav__item">
965 <a href="../../../../javascript/new-api_core/" class="md-nav__link">
966 Core Functions
967 </a>
968 </li>
969
970
971
972
973
974
975
976 <li class="md-nav__item">
977 <a href="../../../../javascript/new-api_dom/" class="md-nav__link">
978 DOM
979 </a>
980 </li>
981
982
983
984
985
986
987
988 <li class="md-nav__item">
989 <a href="../../../../javascript/new-api_events/" class="md-nav__link">
990 Event Handling
991 </a>
992 </li>
993
994
995
996
997
998
999
1000 <li class="md-nav__item">
1001 <a href="../../../../javascript/new-api_ajax/" class="md-nav__link">
1002 Ajax
1003 </a>
1004 </li>
1005
1006
1007
1008
1009
1010
1011
1012 <li class="md-nav__item">
1013 <a href="../../../../javascript/new-api_dialogs/" class="md-nav__link">
1014 Dialogs
1015 </a>
1016 </li>
1017
1018
1019
1020
1021
1022
1023
1024 <li class="md-nav__item">
1025 <a href="../../../../javascript/new-api_browser/" class="md-nav__link">
1026 Browser and Screen Sizes
1027 </a>
1028 </li>
1029
1030
1031
1032
1033
1034
1035
1036 <li class="md-nav__item">
1037 <a href="../../../../javascript/new-api_ui/" class="md-nav__link">
1038 User Interface
1039 </a>
1040 </li>
1041
1042
1043
1044 </ul>
1045 </nav>
1046 </li>
1047
1048
1049
1050
1051
1052
1053
1054 <li class="md-nav__item">
1055 <a href="../../../../javascript/legacy-api/" class="md-nav__link">
1056 Legacy API
1057 </a>
1058 </li>
1059
1060
1061
1062
1063
1064
1065
1066 <li class="md-nav__item">
1067 <a href="../../../../javascript/helper-functions/" class="md-nav__link">
1068 Helper Functions
1069 </a>
1070 </li>
1071
1072
1073
1074
1075
1076
1077
1078 <li class="md-nav__item">
1079 <a href="../../../../javascript/code-snippets/" class="md-nav__link">
1080 Code Snippets
1081 </a>
1082 </li>
1083
1084
1085
1086 </ul>
1087 </nav>
1088 </li>
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100 <li class="md-nav__item md-nav__item--nested">
1101
1102
1103 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
1104
1105 <label class="md-nav__link" for="__nav_5">
1106 Package Components
1107 <span class="md-nav__icon md-icon"></span>
1108 </label>
1109 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
1110 <label class="md-nav__title" for="__nav_5">
1111 <span class="md-nav__icon md-icon"></span>
1112 Package Components
1113 </label>
1114 <ul class="md-nav__list" data-md-scrollfix>
1115
1116
1117
1118
1119
1120 <li class="md-nav__item">
1121 <a href="../../../../package/package-xml/" class="md-nav__link">
1122 package.xml
1123 </a>
1124 </li>
1125
1126
1127
1128
1129
1130
1131
1132
1133 <li class="md-nav__item md-nav__item--nested">
1134
1135
1136 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
1137
1138 <label class="md-nav__link" for="__nav_5_2">
1139 PIPs
1140 <span class="md-nav__icon md-icon"></span>
1141 </label>
1142 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
1143 <label class="md-nav__title" for="__nav_5_2">
1144 <span class="md-nav__icon md-icon"></span>
1145 PIPs
1146 </label>
1147 <ul class="md-nav__list" data-md-scrollfix>
1148
1149
1150
1151
1152
1153 <li class="md-nav__item">
1154 <a href="../../../../package/pip/" class="md-nav__link">
1155 Overview
1156 </a>
1157 </li>
1158
1159
1160
1161
1162
1163
1164
1165 <li class="md-nav__item">
1166 <a href="../../../../package/pip/acl-option/" class="md-nav__link">
1167 aclOption
1168 </a>
1169 </li>
1170
1171
1172
1173
1174
1175
1176
1177 <li class="md-nav__item">
1178 <a href="../../../../package/pip/acp-menu/" class="md-nav__link">
1179 acpMenu
1180 </a>
1181 </li>
1182
1183
1184
1185
1186
1187
1188
1189 <li class="md-nav__item">
1190 <a href="../../../../package/pip/acp-search-provider/" class="md-nav__link">
1191 acpSearchProvider
1192 </a>
1193 </li>
1194
1195
1196
1197
1198
1199
1200
1201 <li class="md-nav__item">
1202 <a href="../../../../package/pip/acp-template/" class="md-nav__link">
1203 acpTemplate
1204 </a>
1205 </li>
1206
1207
1208
1209
1210
1211
1212
1213 <li class="md-nav__item">
1214 <a href="../../../../package/pip/bbcode/" class="md-nav__link">
1215 bbcode
1216 </a>
1217 </li>
1218
1219
1220
1221
1222
1223
1224
1225 <li class="md-nav__item">
1226 <a href="../../../../package/pip/box/" class="md-nav__link">
1227 box
1228 </a>
1229 </li>
1230
1231
1232
1233
1234
1235
1236
1237 <li class="md-nav__item">
1238 <a href="../../../../package/pip/clipboard-action/" class="md-nav__link">
1239 clipboardAction
1240 </a>
1241 </li>
1242
1243
1244
1245
1246
1247
1248
1249 <li class="md-nav__item">
1250 <a href="../../../../package/pip/core-object/" class="md-nav__link">
1251 coreObject
1252 </a>
1253 </li>
1254
1255
1256
1257
1258
1259
1260
1261 <li class="md-nav__item">
1262 <a href="../../../../package/pip/cronjob/" class="md-nav__link">
1263 cronjob
1264 </a>
1265 </li>
1266
1267
1268
1269
1270
1271
1272
1273 <li class="md-nav__item">
1274 <a href="../../../../package/pip/event-listener/" class="md-nav__link">
1275 eventListener
1276 </a>
1277 </li>
1278
1279
1280
1281
1282
1283
1284
1285 <li class="md-nav__item">
1286 <a href="../../../../package/pip/file/" class="md-nav__link">
1287 file
1288 </a>
1289 </li>
1290
1291
1292
1293
1294
1295
1296
1297 <li class="md-nav__item">
1298 <a href="../../../../package/pip/language/" class="md-nav__link">
1299 language
1300 </a>
1301 </li>
1302
1303
1304
1305
1306
1307
1308
1309 <li class="md-nav__item">
1310 <a href="../../../../package/pip/media-provider/" class="md-nav__link">
1311 mediaProvider
1312 </a>
1313 </li>
1314
1315
1316
1317
1318
1319
1320
1321 <li class="md-nav__item">
1322 <a href="../../../../package/pip/menu/" class="md-nav__link">
1323 menu
1324 </a>
1325 </li>
1326
1327
1328
1329
1330
1331
1332
1333 <li class="md-nav__item">
1334 <a href="../../../../package/pip/menu-item/" class="md-nav__link">
1335 menuItem
1336 </a>
1337 </li>
1338
1339
1340
1341
1342
1343
1344
1345 <li class="md-nav__item">
1346 <a href="../../../../package/pip/object-type/" class="md-nav__link">
1347 objectType
1348 </a>
1349 </li>
1350
1351
1352
1353
1354
1355
1356
1357 <li class="md-nav__item">
1358 <a href="../../../../package/pip/object-type-definition/" class="md-nav__link">
1359 objectTypeDefinition
1360 </a>
1361 </li>
1362
1363
1364
1365
1366
1367
1368
1369 <li class="md-nav__item">
1370 <a href="../../../../package/pip/option/" class="md-nav__link">
1371 option
1372 </a>
1373 </li>
1374
1375
1376
1377
1378
1379
1380
1381 <li class="md-nav__item">
1382 <a href="../../../../package/pip/page/" class="md-nav__link">
1383 page
1384 </a>
1385 </li>
1386
1387
1388
1389
1390
1391
1392
1393 <li class="md-nav__item">
1394 <a href="../../../../package/pip/pip/" class="md-nav__link">
1395 pip
1396 </a>
1397 </li>
1398
1399
1400
1401
1402
1403
1404
1405 <li class="md-nav__item">
1406 <a href="../../../../package/pip/script/" class="md-nav__link">
1407 script
1408 </a>
1409 </li>
1410
1411
1412
1413
1414
1415
1416
1417 <li class="md-nav__item">
1418 <a href="../../../../package/pip/smiley/" class="md-nav__link">
1419 smiley
1420 </a>
1421 </li>
1422
1423
1424
1425
1426
1427
1428
1429 <li class="md-nav__item">
1430 <a href="../../../../package/pip/sql/" class="md-nav__link">
1431 sql
1432 </a>
1433 </li>
1434
1435
1436
1437
1438
1439
1440
1441 <li class="md-nav__item">
1442 <a href="../../../../package/pip/style/" class="md-nav__link">
1443 style
1444 </a>
1445 </li>
1446
1447
1448
1449
1450
1451
1452
1453 <li class="md-nav__item">
1454 <a href="../../../../package/pip/template/" class="md-nav__link">
1455 template
1456 </a>
1457 </li>
1458
1459
1460
1461
1462
1463
1464
1465 <li class="md-nav__item">
1466 <a href="../../../../package/pip/template-listener/" class="md-nav__link">
1467 templateListener
1468 </a>
1469 </li>
1470
1471
1472
1473
1474
1475
1476
1477 <li class="md-nav__item">
1478 <a href="../../../../package/pip/user-group-option/" class="md-nav__link">
1479 userGroupOption
1480 </a>
1481 </li>
1482
1483
1484
1485
1486
1487
1488
1489 <li class="md-nav__item">
1490 <a href="../../../../package/pip/user-menu/" class="md-nav__link">
1491 userMenu
1492 </a>
1493 </li>
1494
1495
1496
1497
1498
1499
1500
1501 <li class="md-nav__item">
1502 <a href="../../../../package/pip/user-notification-event/" class="md-nav__link">
1503 userNotificationEvent
1504 </a>
1505 </li>
1506
1507
1508
1509
1510
1511
1512
1513 <li class="md-nav__item">
1514 <a href="../../../../package/pip/user-option/" class="md-nav__link">
1515 userOption
1516 </a>
1517 </li>
1518
1519
1520
1521
1522
1523
1524
1525 <li class="md-nav__item">
1526 <a href="../../../../package/pip/user-profile-menu/" class="md-nav__link">
1527 userProfileMenu
1528 </a>
1529 </li>
1530
1531
1532
1533 </ul>
1534 </nav>
1535 </li>
1536
1537
1538
1539
1540
1541
1542
1543 <li class="md-nav__item">
1544 <a href="../../../../package/database-php-api/" class="md-nav__link">
1545 Database PHP API
1546 </a>
1547 </li>
1548
1549
1550
1551 </ul>
1552 </nav>
1553 </li>
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565 <li class="md-nav__item md-nav__item--nested">
1566
1567
1568 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
1569
1570 <label class="md-nav__link" for="__nav_6">
1571 Migration
1572 <span class="md-nav__icon md-icon"></span>
1573 </label>
1574 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1575 <label class="md-nav__title" for="__nav_6">
1576 <span class="md-nav__icon md-icon"></span>
1577 Migration
1578 </label>
1579 <ul class="md-nav__list" data-md-scrollfix>
1580
1581
1582
1583
1584
1585
1586 <li class="md-nav__item md-nav__item--nested">
1587
1588
1589 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" >
1590
1591 <label class="md-nav__link" for="__nav_6_1">
1592 Migrating from WSC 5.3
1593 <span class="md-nav__icon md-icon"></span>
1594 </label>
1595 <nav class="md-nav" aria-label="Migrating from WSC 5.3" data-md-level="2">
1596 <label class="md-nav__title" for="__nav_6_1">
1597 <span class="md-nav__icon md-icon"></span>
1598 Migrating from WSC 5.3
1599 </label>
1600 <ul class="md-nav__list" data-md-scrollfix>
1601
1602
1603
1604
1605
1606 <li class="md-nav__item">
1607 <a href="../../../../migration/wsc53/php/" class="md-nav__link">
1608 PHP API
1609 </a>
1610 </li>
1611
1612
1613
1614
1615
1616
1617
1618 <li class="md-nav__item">
1619 <a href="../../../../migration/wsc53/session/" class="md-nav__link">
1620 Session Handling and Authentication
1621 </a>
1622 </li>
1623
1624
1625
1626
1627
1628
1629
1630 <li class="md-nav__item">
1631 <a href="../../../../migration/wsc53/javascript/" class="md-nav__link">
1632 JavaScript
1633 </a>
1634 </li>
1635
1636
1637
1638
1639
1640
1641
1642 <li class="md-nav__item">
1643 <a href="../../../../migration/wsc53/templates/" class="md-nav__link">
1644 Templates
1645 </a>
1646 </li>
1647
1648
1649
1650
1651
1652
1653
1654 <li class="md-nav__item">
1655 <a href="../../../../migration/wsc53/libraries/" class="md-nav__link">
1656 Third Party Libraries
1657 </a>
1658 </li>
1659
1660
1661
1662 </ul>
1663 </nav>
1664 </li>
1665
1666
1667
1668
1669
1670
1671
1672
1673 <li class="md-nav__item md-nav__item--nested">
1674
1675
1676 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
1677
1678 <label class="md-nav__link" for="__nav_6_2">
1679 Migrating from WSC 5.2
1680 <span class="md-nav__icon md-icon"></span>
1681 </label>
1682 <nav class="md-nav" aria-label="Migrating from WSC 5.2" data-md-level="2">
1683 <label class="md-nav__title" for="__nav_6_2">
1684 <span class="md-nav__icon md-icon"></span>
1685 Migrating from WSC 5.2
1686 </label>
1687 <ul class="md-nav__list" data-md-scrollfix>
1688
1689
1690
1691
1692
1693 <li class="md-nav__item">
1694 <a href="../../../../migration/wsc52/php/" class="md-nav__link">
1695 PHP API
1696 </a>
1697 </li>
1698
1699
1700
1701
1702
1703
1704
1705 <li class="md-nav__item">
1706 <a href="../../../../migration/wsc52/templates/" class="md-nav__link">
1707 Templates and Languages
1708 </a>
1709 </li>
1710
1711
1712
1713
1714
1715
1716
1717 <li class="md-nav__item">
1718 <a href="../../../../migration/wsc52/libraries/" class="md-nav__link">
1719 Third Party Libraries
1720 </a>
1721 </li>
1722
1723
1724
1725 </ul>
1726 </nav>
1727 </li>
1728
1729
1730
1731
1732
1733
1734
1735
1736 <li class="md-nav__item md-nav__item--nested">
1737
1738
1739 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" >
1740
1741 <label class="md-nav__link" for="__nav_6_3">
1742 Migrating from WSC 3.1
1743 <span class="md-nav__icon md-icon"></span>
1744 </label>
1745 <nav class="md-nav" aria-label="Migrating from WSC 3.1" data-md-level="2">
1746 <label class="md-nav__title" for="__nav_6_3">
1747 <span class="md-nav__icon md-icon"></span>
1748 Migrating from WSC 3.1
1749 </label>
1750 <ul class="md-nav__list" data-md-scrollfix>
1751
1752
1753
1754
1755
1756 <li class="md-nav__item">
1757 <a href="../../../../migration/wsc31/php/" class="md-nav__link">
1758 PHP API
1759 </a>
1760 </li>
1761
1762
1763
1764 </ul>
1765 </nav>
1766 </li>
1767
1768
1769
1770
1771
1772
1773
1774
1775 <li class="md-nav__item md-nav__item--nested">
1776
1777
1778 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
1779
1780 <label class="md-nav__link" for="__nav_6_4">
1781 Migrating from WSC 3.0
1782 <span class="md-nav__icon md-icon"></span>
1783 </label>
1784 <nav class="md-nav" aria-label="Migrating from WSC 3.0" data-md-level="2">
1785 <label class="md-nav__title" for="__nav_6_4">
1786 <span class="md-nav__icon md-icon"></span>
1787 Migrating from WSC 3.0
1788 </label>
1789 <ul class="md-nav__list" data-md-scrollfix>
1790
1791
1792
1793
1794
1795 <li class="md-nav__item">
1796 <a href="../../../../migration/wsc30/php/" class="md-nav__link">
1797 PHP API
1798 </a>
1799 </li>
1800
1801
1802
1803
1804
1805
1806
1807 <li class="md-nav__item">
1808 <a href="../../../../migration/wsc30/javascript/" class="md-nav__link">
1809 JavaScript API
1810 </a>
1811 </li>
1812
1813
1814
1815
1816
1817
1818
1819 <li class="md-nav__item">
1820 <a href="../../../../migration/wsc30/templates/" class="md-nav__link">
1821 Templates
1822 </a>
1823 </li>
1824
1825
1826
1827
1828
1829
1830
1831 <li class="md-nav__item">
1832 <a href="../../../../migration/wsc30/css/" class="md-nav__link">
1833 CSS
1834 </a>
1835 </li>
1836
1837
1838
1839
1840
1841
1842
1843 <li class="md-nav__item">
1844 <a href="../../../../migration/wsc30/package/" class="md-nav__link">
1845 Package Components
1846 </a>
1847 </li>
1848
1849
1850
1851 </ul>
1852 </nav>
1853 </li>
1854
1855
1856
1857
1858
1859
1860
1861
1862 <li class="md-nav__item md-nav__item--nested">
1863
1864
1865 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
1866
1867 <label class="md-nav__link" for="__nav_6_5">
1868 Migrating from WCF 2.1
1869 <span class="md-nav__icon md-icon"></span>
1870 </label>
1871 <nav class="md-nav" aria-label="Migrating from WCF 2.1" data-md-level="2">
1872 <label class="md-nav__title" for="__nav_6_5">
1873 <span class="md-nav__icon md-icon"></span>
1874 Migrating from WCF 2.1
1875 </label>
1876 <ul class="md-nav__list" data-md-scrollfix>
1877
1878
1879
1880
1881
1882 <li class="md-nav__item">
1883 <a href="../../../../migration/wcf21/php/" class="md-nav__link">
1884 PHP API
1885 </a>
1886 </li>
1887
1888
1889
1890
1891
1892
1893
1894 <li class="md-nav__item">
1895 <a href="../../../../migration/wcf21/templates/" class="md-nav__link">
1896 Templates
1897 </a>
1898 </li>
1899
1900
1901
1902
1903
1904
1905
1906 <li class="md-nav__item">
1907 <a href="../../../../migration/wcf21/css/" class="md-nav__link">
1908 CSS
1909 </a>
1910 </li>
1911
1912
1913
1914
1915
1916
1917
1918 <li class="md-nav__item">
1919 <a href="../../../../migration/wcf21/package/" class="md-nav__link">
1920 Package Components
1921 </a>
1922 </li>
1923
1924
1925
1926 </ul>
1927 </nav>
1928 </li>
1929
1930
1931
1932 </ul>
1933 </nav>
1934 </li>
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946 <li class="md-nav__item md-nav__item--nested">
1947
1948
1949 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
1950
1951 <label class="md-nav__link" for="__nav_7">
1952 Tutorials
1953 <span class="md-nav__icon md-icon"></span>
1954 </label>
1955 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
1956 <label class="md-nav__title" for="__nav_7">
1957 <span class="md-nav__icon md-icon"></span>
1958 Tutorials
1959 </label>
1960 <ul class="md-nav__list" data-md-scrollfix>
1961
1962
1963
1964
1965
1966
1967 <li class="md-nav__item md-nav__item--nested">
1968
1969
1970 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
1971
1972 <label class="md-nav__link" for="__nav_7_1">
1973 Tutorial Series
1974 <span class="md-nav__icon md-icon"></span>
1975 </label>
1976 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
1977 <label class="md-nav__title" for="__nav_7_1">
1978 <span class="md-nav__icon md-icon"></span>
1979 Tutorial Series
1980 </label>
1981 <ul class="md-nav__list" data-md-scrollfix>
1982
1983
1984
1985
1986
1987 <li class="md-nav__item">
1988 <a href="../../../../tutorial/series/overview/" class="md-nav__link">
1989 Overview
1990 </a>
1991 </li>
1992
1993
1994
1995
1996
1997
1998
1999 <li class="md-nav__item">
2000 <a href="../../../../tutorial/series/part_1/" class="md-nav__link">
2001 Part 1
2002 </a>
2003 </li>
2004
2005
2006
2007
2008
2009
2010
2011 <li class="md-nav__item">
2012 <a href="../../../../tutorial/series/part_2/" class="md-nav__link">
2013 Part 2
2014 </a>
2015 </li>
2016
2017
2018
2019
2020
2021
2022
2023 <li class="md-nav__item">
2024 <a href="../../../../tutorial/series/part_3/" class="md-nav__link">
2025 Part 3
2026 </a>
2027 </li>
2028
2029
2030
2031 </ul>
2032 </nav>
2033 </li>
2034
2035
2036
2037 </ul>
2038 </nav>
2039 </li>
2040
2041
2042
2043 </ul>
2044</nav>
2045 </div>
2046 </div>
2047 </div>
2048
2049
2050
2051 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2052 <div class="md-sidebar__scrollwrap">
2053 <div class="md-sidebar__inner">
2054
2055<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2056
2057
2058
2059
2060
2061 <label class="md-nav__title" for="__toc">
2062 <span class="md-nav__icon md-icon"></span>
2063 Table of contents
2064 </label>
2065 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2066
2067 <li class="md-nav__item">
2068 <a href="#form-nodes" class="md-nav__link">
2069 Form Nodes
2070 </a>
2071
2072 <nav class="md-nav" aria-label="Form Nodes">
2073 <ul class="md-nav__list">
2074
2075 <li class="md-nav__item">
2076 <a href="#iformnode" class="md-nav__link">
2077 IFormNode
2078 </a>
2079
2080</li>
2081
2082 <li class="md-nav__item">
2083 <a href="#iformchildnode" class="md-nav__link">
2084 IFormChildNode
2085 </a>
2086
2087</li>
2088
2089 <li class="md-nav__item">
2090 <a href="#iformparentnode" class="md-nav__link">
2091 IFormParentNode
2092 </a>
2093
2094</li>
2095
2096 <li class="md-nav__item">
2097 <a href="#iformelement" class="md-nav__link">
2098 IFormElement
2099 </a>
2100
2101</li>
2102
2103 <li class="md-nav__item">
2104 <a href="#iobjecttypeformnode" class="md-nav__link">
2105 IObjectTypeFormNode
2106 </a>
2107
2108</li>
2109
2110 <li class="md-nav__item">
2111 <a href="#customformnode" class="md-nav__link">
2112 CustomFormNode
2113 </a>
2114
2115</li>
2116
2117 <li class="md-nav__item">
2118 <a href="#templateformnode" class="md-nav__link">
2119 TemplateFormNode
2120 </a>
2121
2122</li>
2123
2124 </ul>
2125 </nav>
2126
2127</li>
2128
2129 <li class="md-nav__item">
2130 <a href="#form-document" class="md-nav__link">
2131 Form Document
2132 </a>
2133
2134</li>
2135
2136 <li class="md-nav__item">
2137 <a href="#form-button" class="md-nav__link">
2138 Form Button
2139 </a>
2140
2141</li>
2142
2143 <li class="md-nav__item">
2144 <a href="#form-container" class="md-nav__link">
2145 Form Container
2146 </a>
2147
2148</li>
2149
2150 <li class="md-nav__item">
2151 <a href="#form-field" class="md-nav__link">
2152 Form Field
2153 </a>
2154
2155 <nav class="md-nav" aria-label="Form Field">
2156 <ul class="md-nav__list">
2157
2158 <li class="md-nav__item">
2159 <a href="#form-field-interfaces-and-traits" class="md-nav__link">
2160 Form Field Interfaces and Traits
2161 </a>
2162
2163 <nav class="md-nav" aria-label="Form Field Interfaces and Traits">
2164 <ul class="md-nav__list">
2165
2166 <li class="md-nav__item">
2167 <a href="#iattributeformfield" class="md-nav__link">
2168 IAttributeFormField
2169 </a>
2170
2171</li>
2172
2173 <li class="md-nav__item">
2174 <a href="#iautocompleteformfield" class="md-nav__link">
2175 IAutoCompleteFormField
2176 </a>
2177
2178</li>
2179
2180 <li class="md-nav__item">
2181 <a href="#iautofocusformfield" class="md-nav__link">
2182 IAutoFocusFormField
2183 </a>
2184
2185</li>
2186
2187 <li class="md-nav__item">
2188 <a href="#icssclassformfield" class="md-nav__link">
2189 ICssClassFormField
2190 </a>
2191
2192</li>
2193
2194 <li class="md-nav__item">
2195 <a href="#ifileformfield" class="md-nav__link">
2196 IFileFormField
2197 </a>
2198
2199</li>
2200
2201 <li class="md-nav__item">
2202 <a href="#ifilterableselectionformfield" class="md-nav__link">
2203 IFilterableSelectionFormField
2204 </a>
2205
2206</li>
2207
2208 <li class="md-nav__item">
2209 <a href="#ii18nformfield" class="md-nav__link">
2210 II18nFormField
2211 </a>
2212
2213</li>
2214
2215 <li class="md-nav__item">
2216 <a href="#iimmutableformfield" class="md-nav__link">
2217 IImmutableFormField
2218 </a>
2219
2220</li>
2221
2222 <li class="md-nav__item">
2223 <a href="#iinputmodeformfield" class="md-nav__link">
2224 IInputModeFormField
2225 </a>
2226
2227</li>
2228
2229 <li class="md-nav__item">
2230 <a href="#imaximumformfield" class="md-nav__link">
2231 IMaximumFormField
2232 </a>
2233
2234</li>
2235
2236 <li class="md-nav__item">
2237 <a href="#imaximumlengthformfield" class="md-nav__link">
2238 IMaximumLengthFormField
2239 </a>
2240
2241</li>
2242
2243 <li class="md-nav__item">
2244 <a href="#iminimumformfield" class="md-nav__link">
2245 IMinimumFormField
2246 </a>
2247
2248</li>
2249
2250 <li class="md-nav__item">
2251 <a href="#iminimumlengthformfield" class="md-nav__link">
2252 IMinimumLengthFormField
2253 </a>
2254
2255</li>
2256
2257 <li class="md-nav__item">
2258 <a href="#imultipleformfield" class="md-nav__link">
2259 IMultipleFormField
2260 </a>
2261
2262</li>
2263
2264 <li class="md-nav__item">
2265 <a href="#inullableformfield" class="md-nav__link">
2266 INullableFormField
2267 </a>
2268
2269</li>
2270
2271 <li class="md-nav__item">
2272 <a href="#ipackagesformfield" class="md-nav__link">
2273 IPackagesFormField
2274 </a>
2275
2276</li>
2277
2278 <li class="md-nav__item">
2279 <a href="#ipatternformfield" class="md-nav__link">
2280 IPatternFormField
2281 </a>
2282
2283</li>
2284
2285 <li class="md-nav__item">
2286 <a href="#iplaceholderformfield" class="md-nav__link">
2287 IPlaceholderFormField
2288 </a>
2289
2290</li>
2291
2292 <li class="md-nav__item">
2293 <a href="#iselectionformfield" class="md-nav__link">
2294 ISelectionFormField
2295 </a>
2296
2297</li>
2298
2299 <li class="md-nav__item">
2300 <a href="#isuffixedformfield" class="md-nav__link">
2301 ISuffixedFormField
2302 </a>
2303
2304</li>
2305
2306 <li class="md-nav__item">
2307 <a href="#tdefaultidformfield" class="md-nav__link">
2308 TDefaultIdFormField
2309 </a>
2310
2311</li>
2312
2313 </ul>
2314 </nav>
2315
2316</li>
2317
2318 </ul>
2319 </nav>
2320
2321</li>
2322
2323 <li class="md-nav__item">
2324 <a href="#displaying-forms" class="md-nav__link">
2325 Displaying Forms
2326 </a>
2327
2328</li>
2329
2330 </ul>
2331
2332</nav>
2333 </div>
2334 </div>
2335 </div>
2336
2337
2338 <div class="md-content" data-md-component="content">
2339 <article class="md-content__inner md-typeset">
2340
2341
2342
2343 <h1 id="structure-of-form-builder">Structure of Form Builder<a class="headerlink" href="#structure-of-form-builder" title="Permanent link">#</a></h1>
2344<p>Forms built with form builder consist of three major structural elements listed from top to bottom:</p>
2345<ol>
2346<li>form document,</li>
2347<li>form container,</li>
2348<li>form field.</li>
2349</ol>
2350<p>The basis for all three elements are form nodes.</p>
2351<div class="admonition info">
2352<p class="admonition-title">The form builder API uses fluent interfaces heavily, meaning that unless a method is a getter, it generally returns the objects itself to support method chaining.</p>
2353</div>
2354<h2 id="form-nodes">Form Nodes<a class="headerlink" href="#form-nodes" title="Permanent link">#</a></h2>
2355<ul>
2356<li><code>IFormNode</code> is the base interface that any node of a form has to implement.</li>
2357<li><code>IFormChildNode</code> extends <code>IFormNode</code> for such elements of a form that can be a child node to a parent node.</li>
2358<li><code>IFormParentNode</code> extends <code>IFormNode</code> for such elements of a form that can be a parent to child nodes.</li>
2359<li><code>IFormElement</code> extends <code>IFormNode</code> for such elements of a form that can have a description and a label.</li>
2360</ul>
2361<h3 id="iformnode"><code>IFormNode</code><a class="headerlink" href="#iformnode" title="Permanent link">#</a></h3>
2362<p><code>IFormNode</code> is the base interface that any node of a form has to implement and it requires the following methods:</p>
2363<ul>
2364<li><code>addClass($class)</code>, <code>addClasses(array $classes)</code>, <code>removeClass($class)</code>, <code>getClasses()</code>, and <code>hasClass($class)</code> add, remove, get, and check for CSS classes of the HTML element representing the form node.
2365 If the form node consists of multiple (nested) HTML elements, the classes are generally added to the top element.
2366 <code>static validateClass($class)</code> is used to check if a given CSS class is valid.
2367 By default, a form node has no CSS classes.</li>
2368<li><code>addDependency(IFormFieldDependency $dependency)</code>, <code>removeDependency($dependencyId)</code>, <code>getDependencies()</code>, and <code>hasDependency($dependencyId)</code> add, remove, get, and check for dependencies of this form node on other form fields.
2369 <code>checkDependencies()</code> checks if <strong>all</strong> of the node’s dependencies are met and returns a boolean value reflecting the check’s result.
2370 The <a href="../dependencies/">form builder dependency documentation</a> provides more detailed information about dependencies and how they work.
2371 By default, a form node has no dependencies.</li>
2372<li><code>attribute($name, $value = null)</code>, <code>removeAttribute($name)</code>, <code>getAttribute($name)</code>, <code>getAttributes()</code>, <code>hasAttribute($name)</code> add, remove, get, and check for attributes of the HTML element represting the form node.
2373 The attributes are added to the same element that the CSS classes are added to.
2374 <code>static validateAttribute($name)</code> is used to check if a given attribute is valid.
2375 By default, a form node has no attributes.</li>
2376<li><code>available($available = true)</code> and <code>isAvailable()</code> can be used to set and check if the node is available.
2377 The availability functionality can be used to easily toggle form nodes based, for example, on options without having to create a condition to append the relevant.
2378 This way of checking availability makes it easier to set up forms.
2379 By default, every form node is available.</li>
2380</ul>
2381<p>The following aspects are important when working with availability:</p>
2382<ul>
2383<li>Unavailable fields produce no output, their value is not read, they are not validated and they are not checked for save values.</li>
2384<li>Form fields are also able to mark themselves as unavailable, for example, a selection field without any options.</li>
2385<li>Form containers are automatically unavailable if they contain no available children.</li>
2386</ul>
2387<p>Availability sets the static availability for form nodes that does not change during the lifetime of a form.
2388 In contrast, dependencies represent a dynamic availability for form nodes that depends on the current value of certain form fields.
2389- <code>cleanup()</code> is called after the whole form is not used anymore to reset other APIs if the form fields depends on them and they expect such a reset.
2390 This method is not intended to clean up the form field’s value as a new form document object is created to show a clean form.
2391- <code>getDocument()</code> returns the <code>IFormDocument</code> object the node belongs to.
2392 (As <code>IFormDocument</code> extends <code>IFormNode</code>, form document objects simply return themselves.)
2393- <code>getHtml()</code> returns the HTML representation of the node.
2394 <code>getHtmlVariables()</code> return template variables (in addition to the form node itself) to render the node’s HTML representation.
2395- <code>id($id)</code> and <code>getId()</code> set and get the id of the form node.
2396 Every id has to be unique within a form.
2397 <code>getPrefixedId()</code> returns the prefixed version of the node’s id (see <code>IFormDocument::getPrefix()</code> and <code>IFormDocument::prefix()</code>).
2398 <code>static validateId($id)</code> is used to check if a given id is valid.
2399- <code>populate()</code> is called by <code>IFormDocument::build()</code> after all form nodes have been added.
2400 This method should finilize the initialization of the form node after all parent-child relations of the form document have been established.
2401 This method is needed because during the construction of a form node, it neither knows the form document it will belong to nor does it know its parent.
2402- <code>validate()</code> checks, after the form is submitted, if the form node is valid.
2403 A form node with children is valid if all of its child nodes are valid.
2404 A form field is valid if its value is valid.
2405- <code>static create($id)</code> is the factory method that has to be used to create new form nodes with the given id.</p>
2406<p><code>TFormNode</code> provides a default implementation of most of these methods.</p>
2407<h3 id="iformchildnode"><code>IFormChildNode</code><a class="headerlink" href="#iformchildnode" title="Permanent link">#</a></h3>
2408<p><code>IFormChildNode</code> extends <code>IFormNode</code> for such elements of a form that can be a child node to a parent node and it requires the <code>parent(IFormParentNode $parentNode)</code> and <code>getParent()</code> methods used to set and get the node’s parent node.
2409<code>TFormChildNode</code> provides a default implementation of these two methods and also of <code>IFormNode::getDocument()</code>.</p>
2410<h3 id="iformparentnode"><code>IFormParentNode</code><a class="headerlink" href="#iformparentnode" title="Permanent link">#</a></h3>
2411<p><code>IFormParentNode</code> extends <code>IFormNode</code> for such elements of a form that can be a parent to child nodes.
2412Additionally, the interface also extends <code>\Countable</code> and <code>\RecursiveIterator</code>.
2413The interface requires the following methods:</p>
2414<ul>
2415<li><code>appendChild(IFormChildNode $child)</code>, <code>appendChildren(array $children)</code>, <code>insertAfter(IFormChildNode $child, $referenceNodeId)</code>, and <code>insertBefore(IFormChildNode $child, $referenceNodeId)</code> are used to insert new children either at the end or at specific positions.
2416 <code>validateChild(IFormChildNode $child)</code> is used to check if a given child node can be added.
2417 A child node cannot be added if it would cause an id to be used twice.</li>
2418<li><code>children()</code> returns the direct children of a form node.</li>
2419<li><code>getIterator()</code> return a recursive iterator for a form node.</li>
2420<li><code>getNodeById($nodeId)</code> returns the node with the given id by searching for it in the node’s children and recursively in all of their children.
2421 <code>contains($nodeId)</code> can be used to simply check if a node with the given id exists.</li>
2422<li><code>hasValidationErrors()</code> checks if a form node or any of its children has a validation error (see <code>IFormField::getValidationErrors()</code>).</li>
2423<li><code>readValues()</code> recursively calls <code>IFormParentNode::readValues()</code> and <code>IFormField::readValue()</code> on its children.</li>
2424</ul>
2425<h3 id="iformelement"><code>IFormElement</code><a class="headerlink" href="#iformelement" title="Permanent link">#</a></h3>
2426<p><code>IFormElement</code> extends <code>IFormNode</code> for such elements of a form that can have a description and a label and it requires the following methods:</p>
2427<ul>
2428<li><code>label($languageItem = null, array $variables = [])</code> and <code>getLabel()</code> can be used to set and get the label of the form element.
2429 <code>requiresLabel()</code> can be checked if the form element requires a label.
2430 A label-less form element that requires a label will prevent the form from being rendered by throwing an exception.</li>
2431<li><code>description($languageItem = null, array $variables = [])</code> and <code>getDescription()</code> can be used to set and get the description of the form element.</li>
2432</ul>
2433<h3 id="iobjecttypeformnode"><code>IObjectTypeFormNode</code><a class="headerlink" href="#iobjecttypeformnode" title="Permanent link">#</a></h3>
2434<p><code>IObjectTypeFormField</code> has to be implemented by form nodes that rely on a object type of a specific object type definition in order to function.
2435The implementing class has to implement the methods <code>objectType($objectType)</code>, <code>getObjectType()</code>, and <code>getObjectTypeDefinition()</code>.
2436<code>TObjectTypeFormNode</code> provides a default implementation of these three methods.</p>
2437<h3 id="customformnode"><code>CustomFormNode</code><a class="headerlink" href="#customformnode" title="Permanent link">#</a></h3>
2438<p><code>CustomFormNode</code> is a form node whose contents can be set directly via <code>content($content)</code>.</p>
2439<div class="admonition warning">
2440<p class="admonition-title">This class should generally not be relied on. Instead, <code>TemplateFormNode</code> should be used.</p>
2441</div>
2442<h3 id="templateformnode"><code>TemplateFormNode</code><a class="headerlink" href="#templateformnode" title="Permanent link">#</a></h3>
2443<p><code>TemplateFormNode</code> is a form node whose contents are read from a template.
2444<code>TemplateFormNode</code> has the following additional methods:</p>
2445<ul>
2446<li><code>application($application)</code> and <code>getApplicaton()</code> can be used to set and get the abbreviation of the application the shown template belongs to.
2447 If no template has been set explicitly, <code>getApplicaton()</code> returns <code>wcf</code>.</li>
2448<li><code>templateName($templateName)</code> and <code>getTemplateName()</code> can be used to set and get the name of the template containing the node contents.
2449 If no template has been set and the node is rendered, an exception will be thrown.</li>
2450<li><code>variables(array $variables)</code> and <code>getVariables()</code> can be used to set and get additional variables passed to the template.</li>
2451</ul>
2452<h2 id="form-document">Form Document<a class="headerlink" href="#form-document" title="Permanent link">#</a></h2>
2453<p>A form document object represents the form as a whole and has to implement the <code>IFormDocument</code> interface.
2454WoltLab Suite provides a default implementation with the <code>FormDocument</code> class.
2455<code>IFormDocument</code> should not be implemented directly but instead <code>FormDocument</code> should be extended to avoid issues if the <code>IFormDocument</code> interface changes in the future.</p>
2456<p><code>IFormDocument</code> extends <code>IFormParentNode</code> and requires the following additional methods:</p>
2457<ul>
2458<li><code>action($action)</code> and <code>getAction()</code> can be used set and get the <code>action</code> attribute of the <code>&lt;form&gt;</code> HTML element.</li>
2459<li><code>addButton(IFormButton $button)</code> and <code>getButtons()</code> can be used add and get form buttons that are shown at the bottom of the form.
2460 <code>addDefaultButton($addDefaultButton)</code> and <code>hasDefaultButton()</code> can be used to set and check if the form has the default button which is added by default unless specified otherwise.
2461 Each implementing class may define its own default button.
2462 <code>FormDocument</code> has a button with id <code>submitButton</code>, label <code>wcf.global.button.submit</code>, access key <code>s</code>, and CSS class <code>buttonPrimary</code> as its default button. </li>
2463<li><code>ajax($ajax)</code> and <code>isAjax()</code> can be used to set and check if the form document is requested via an AJAX request or processes data via an AJAX request.
2464 These methods are helpful for form fields that behave differently when providing data via AJAX.</li>
2465<li><code>build()</code> has to be called once after all nodes have been added to this document to trigger <code>IFormNode::populate()</code>.</li>
2466<li>
2467<p><code>formMode($formMode)</code> and <code>getFormMode()</code> sets the form mode.
2468 Possible form modes are:</p>
2469</li>
2470<li>
2471<p><code>IFormDocument::FORM_MODE_CREATE</code> has to be used when the form is used to create a new object.</p>
2472</li>
2473<li><code>IFormDocument::FORM_MODE_UPDATE</code> has to be used when the form is used to edit an existing object.</li>
2474<li><code>getData()</code> returns the array containing the form data and which is passed as the <code>$parameters</code> argument of the constructor of a database object action object.</li>
2475<li><code>getDataHandler()</code> returns the data handler for this document that is used to process the field data into a parameters array for the constructor of a database object action object.</li>
2476<li><code>getEnctype()</code> returns the encoding type of the form.
2477 If the form contains a <code>IFileFormField</code>, <code>multipart/form-data</code> is returned, otherwise <code>null</code> is returned.</li>
2478<li><code>loadValues(array $data, IStorableObject $object)</code> is used when editing an existing object to set the form field values by calling <code>IFormField::loadValue()</code> for all form fields.
2479 Additionally, the form mode is set to <code>IFormDocument::FORM_MODE_UPDATE</code>.</li>
2480<li><span class="label label-info">5.4+</span> <code>markRequiredFields(bool $markRequiredFields = true): self</code> and <code>marksRequiredFields(): bool</code> can be used to set and check whether fields that are required are marked (with an asterisk in the label) in the output.</li>
2481<li><code>method($method)</code> and <code>getMethod()</code> can be used to set and get the <code>method</code> attribute of the <code>&lt;form&gt;</code> HTML element.
2482 By default, the method is <code>post</code>.</li>
2483<li><code>prefix($prefix)</code> and <code>getPrefix()</code> can be used to set and get a global form prefix that is prepended to form elements’ names and ids to avoid conflicts with other forms.
2484 By default, the prefix is an empty string.
2485 If a prefix of <code>foo</code> is set, <code>getPrefix()</code> returns <code>foo_</code> (additional trailing underscore).</li>
2486<li><code>requestData(array $requestData)</code>, <code>getRequestData($index = null)</code>, and <code>hasRequestData($index = null)</code> can be used to set, get and check for specific request data.
2487 In most cases, the relevant request data is the <code>$_POST</code> array.
2488 In default AJAX requests handled by database object actions, however, the request data generally is in <code>AbstractDatabaseObjectAction::$parameters</code>.
2489 By default, <code>$_POST</code> is the request data.</li>
2490</ul>
2491<p>The last aspect is relevant for <code>DialogFormDocument</code> objects.
2492<code>DialogFormDocument</code> is a specialized class for forms in dialogs that, in contrast to <code>FormDocument</code> do not require an <code>action</code> to be set.
2493Additionally, <code>DialogFormDocument</code> provides the <code>cancelable($cancelable = true)</code> and <code>isCancelable()</code> methods used to determine if the dialog from can be canceled.
2494By default, dialog forms are cancelable.</p>
2495<h2 id="form-button">Form Button<a class="headerlink" href="#form-button" title="Permanent link">#</a></h2>
2496<p>A form button object represents a button shown at the end of the form that, for example, submits the form.
2497Every form button has to implement the <code>IFormButton</code> interface that extends <code>IFormChildNode</code> and <code>IFormElement</code>.
2498<code>IFormButton</code> requires four methods to be implemented:</p>
2499<ul>
2500<li><code>accessKey($accessKey)</code> and <code>getAccessKey()</code> can be used to set and get the access key with which the form button can be activated.
2501 By default, form buttons have no access key set.</li>
2502<li><code>submit($submitButton)</code> and <code>isSubmit()</code> can be used to set and check if the form button is a submit button.
2503 A submit button is an <code>input[type=submit]</code> element.
2504 Otherwise, the button is a <code>button</code> element. </li>
2505</ul>
2506<h2 id="form-container">Form Container<a class="headerlink" href="#form-container" title="Permanent link">#</a></h2>
2507<p>A form container object represents a container for other form containers or form field directly.
2508Every form container has to implement the <code>IFormContainer</code> interface which requires the following method:</p>
2509<ul>
2510<li><code>loadValues(array $data, IStorableObject $object)</code> is called by <code>IFormDocument::loadValuesFromObject()</code> to inform the container that object data is loaded.
2511 This method is <em>not</em> intended to generally call <code>IFormField::loadValues()</code> on its form field children as these methods are already called by <code>IFormDocument::loadValuesFromObject()</code>.
2512 This method is intended for specialized form containers with more complex logic.</li>
2513</ul>
2514<p>There are multiple default container implementations:</p>
2515<ol>
2516<li><code>FormContainer</code> is the default implementation of <code>IFormContainer</code>.</li>
2517<li><code>TabMenuFormContainer</code> represents the container of tab menu, while</li>
2518<li><code>TabFormContainer</code> represents a tab of a tab menu and</li>
2519<li><code>TabTabMenuFormContainer</code> represents a tab of a tab menu that itself contains a tab menu.</li>
2520<li>The children of <code>RowFormContainer</code> are shown in a row and should use <code>col-*</code> classes.</li>
2521<li>The children of <code>RowFormFieldContainer</code> are also shown in a row but does not show the labels and descriptions of the individual form fields.
2522 Instead of the individual labels and descriptions, the container's label and description is shown and both span all of fields.</li>
2523<li><code>SuffixFormFieldContainer</code> can be used for one form field with a second selection form field used as a suffix.</li>
2524</ol>
2525<p>The methods of the interfaces that <code>FormContainer</code> is implementing are well documented, but here is a short overview of the most important methods when setting up a form or extending a form with an event listener:</p>
2526<ul>
2527<li><code>appendChild(IFormChildNode $child)</code>, <code>appendChildren(array $children)</code>, and <code>insertBefore(IFormChildNode $child, $referenceNodeId)</code> are used to insert new children into the form container.</li>
2528<li><code>description($languageItem = null, array $variables = [])</code> and <code>label($languageItem = null, array $variables = [])</code> are used to set the description and the label or title of the form container.</li>
2529</ul>
2530<h2 id="form-field">Form Field<a class="headerlink" href="#form-field" title="Permanent link">#</a></h2>
2531<p>A form field object represents a concrete form field that allows entering data.
2532Every form field has to implement the <code>IFormField</code> interface which extends <code>IFormChildNode</code> and <code>IFormElement</code>.</p>
2533<p><code>IFormField</code> requires the following additional methods:</p>
2534<ul>
2535<li><code>addValidationError(IFormFieldValidationError $error)</code> and <code>getValidationErrors()</code> can be used to get and set validation errors of the form field (see <a href="../validation_data/#form-validation">form validation</a>).</li>
2536<li><code>addValidator(IFormFieldValidator $validator)</code>, <code>getValidators()</code>, <code>removeValidator($validatorId)</code>, and <code>hasValidator($validatorId)</code> can be used to get, set, remove, and check for validators for the form field (see <a href="../validation_data/#form-validation">form validation</a>).</li>
2537<li><code>getFieldHtml()</code> returns the field's HTML output without the surrounding <code>dl</code> structure.</li>
2538<li><code>objectProperty($objectProperty)</code> and <code>getObjectProperty()</code> can be used to get and set the object property that the field represents.
2539 When setting the object property is set to an empty string, the previously set object property is unset.
2540 If no object property has been set, the field’s (non-prefixed) id is returned.</li>
2541</ul>
2542<p>The object property allows having different fields (requiring different ids) that represent the same object property which is handy when available options of the field’s value depend on another field.
2543 Having object property allows to define different fields for each value of the other field and to use form field dependencies to only show the appropriate field.
2544- <code>readValue()</code> reads the form field value from the request data after the form is submitted.
2545- <code>required($required = true)</code> and <code>isRequired()</code> can be used to determine if the form field has to be filled out.
2546 By default, form fields do not have to be filled out.
2547- <code>value($value)</code> and <code>getSaveValue()</code> can be used to get and set the value of the form field to be used outside of the context of forms.
2548 <code>getValue()</code>, in contrast, returns the internal representation of the form field’s value.
2549 In general, the internal representation is only relevant when validating the value in additional validators.
2550 <code>loadValue(array $data, IStorableObject $object)</code> extracts the form field value from the given data array (and additional, non-editable data from the object if the field needs them).</p>
2551<p><code>AbstractFormField</code> provides default implementations of many of the listed methods above and should be extended instead of implementing <code>IFormField</code> directly.</p>
2552<p>An overview of the form fields provided by default can be found <a href="../form_fields/">here</a>.</p>
2553<h3 id="form-field-interfaces-and-traits">Form Field Interfaces and Traits<a class="headerlink" href="#form-field-interfaces-and-traits" title="Permanent link">#</a></h3>
2554<p>WoltLab Suite Core provides a variety of interfaces and matching traits with default implementations for several common features of form fields:</p>
2555<h4 id="iattributeformfield"><code>IAttributeFormField</code><a class="headerlink" href="#iattributeformfield" title="Permanent link">#</a></h4>
2556<div class="admonition info">
2557<p class="admonition-title">Only available since version 5.4.</p>
2558</div>
2559<p><code>IAttributeFormField</code> has to be implemented by form fields for which attributes can be added to the actual form element (in addition to adding attributes to the surrounding element via the attribute-related methods of <code>IFormNode</code>).
2560The implementing class has to implement the methods <code>fieldAttribute(string $name, string $value = null): self</code> and <code>getFieldAttribute(string $name): self</code>/<code>getFieldAttributes(): array</code>, which are used to add and get the attributes, respectively.
2561Additionally, <code>hasFieldAttribute(string $name): bool</code> has to implemented to check if a certain attribute is present, <code>removeFieldAttribute(string $name): self</code> to remove an attribute, and <code>static validateFieldAttribute(string $name)</code> to check if the attribute is valid for this specific class.
2562<code>TAttributeFormField</code> provides a default implementation of these methods and <code>TInputAttributeFormField</code> specializes the trait for <code>input</code>-based form fields.
2563These two traits also ensure that if a specific interface that handles a specific attribute is implemented, like <code>IAutoCompleteFormField</code> handling <code>autocomplete</code>, this attribute cannot be set with this API.
2564Instead, the dedicated API provided by the relevant interface has to be used.</p>
2565<h4 id="iautocompleteformfield"><code>IAutoCompleteFormField</code><a class="headerlink" href="#iautocompleteformfield" title="Permanent link">#</a></h4>
2566<div class="admonition info">
2567<p class="admonition-title">Only available since version 5.4.</p>
2568</div>
2569<p><code>IAutoCompleteFormField</code> has to be implemented by form fields that support the <a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofilling-form-controls:-the-autocomplete-attribute"><code>autocomplete</code> attribute</a>.
2570The implementing class has to implement the methods <code>autoComplete(?string $autoComplete): self</code> and <code>getAutoComplete(): ?string</code>, which are used to set and get the autocomplete value, respectively.
2571<code>TAutoCompleteFormField</code> provides a default implementation of these two methods and <code>TTextAutoCompleteFormField</code> specializes the trait for text form fields.
2572When using <code>TAutoCompleteFormField</code>, you have to implement the <code>getValidAutoCompleteTokens(): array</code> method which returns all valid <code>autocomplete</code> tokens.</p>
2573<h4 id="iautofocusformfield"><code>IAutoFocusFormField</code><a class="headerlink" href="#iautofocusformfield" title="Permanent link">#</a></h4>
2574<p><code>IAutoFocusFormField</code> has to be implemented by form fields that can be auto-focused.
2575The implementing class has to implement the methods <code>autoFocus($autoFocus = true)</code> and <code>isAutoFocused()</code>.
2576By default, form fields are not auto-focused.
2577<code>TAutoFocusFormField</code> provides a default implementation of these two methods.</p>
2578<h4 id="icssclassformfield"><code>ICssClassFormField</code><a class="headerlink" href="#icssclassformfield" title="Permanent link">#</a></h4>
2579<div class="admonition info">
2580<p class="admonition-title">Only available since version 5.4.</p>
2581</div>
2582<p><code>ICssClassFormField</code> has to be implemented by form fields for which CSS classes can be added to the actual form element (in addition to adding CSS classes to the surrounding element via the class-related methods of <code>IFormNode</code>).
2583The implementing class has to implement the methods <code>addFieldClass(string $class): self</code>/<code>addFieldClasses(array $classes): self</code> and <code>getFieldClasses(): array</code>, which are used to add and get the CSS classes, respectively.
2584Additionally, <code>hasFieldClass(string $class): bool</code> has to implemented to check if a certain CSS class is present and <code>removeFieldClass(string $class): self</code> to remove a CSS class.
2585<code>TCssClassFormField</code> provides a default implementation of these methods.</p>
2586<h4 id="ifileformfield"><code>IFileFormField</code><a class="headerlink" href="#ifileformfield" title="Permanent link">#</a></h4>
2587<p><code>IFileFormField</code> has to be implemented by every form field that uploads files so that the <code>enctype</code> attribute of the form document is <code>multipart/form-data</code> (see <code>IFormDocument::getEnctype()</code>).</p>
2588<h4 id="ifilterableselectionformfield"><code>IFilterableSelectionFormField</code><a class="headerlink" href="#ifilterableselectionformfield" title="Permanent link">#</a></h4>
2589<p><code>IFilterableSelectionFormField</code> extends <code>ISelectionFormField</code> by the possibilty for users when selecting the value(s) to filter the list of available options.
2590The implementing class has to implement the methods <code>filterable($filterable = true)</code> and <code>isFilterable()</code>.
2591<code>TFilterableSelectionFormField</code> provides a default implementation of these two methods.</p>
2592<h4 id="ii18nformfield"><code>II18nFormField</code><a class="headerlink" href="#ii18nformfield" title="Permanent link">#</a></h4>
2593<p><code>II18nFormField</code> has to be implemented by form fields if the form field value can be entered separately for all available languages.
2594The implementing class has to implement the following methods:</p>
2595<ul>
2596<li><code>i18n($i18n = true)</code> and <code>isI18n()</code> can be used to set whether a specific instance of the class actually supports multilingual input.</li>
2597<li><code>i18nRequired($i18nRequired = true)</code> and <code>isI18nRequired()</code> can be used to set whether a specific instance of the class requires separate values for all languages.</li>
2598<li><code>languageItemPattern($pattern)</code> and <code>getLanguageItemPattern()</code> can be used to set the pattern/regular expression for the language item used to save the multilingual values.</li>
2599<li><code>hasI18nValues()</code> and <code>hasPlainValue()</code> check if the current value is a multilingual or monolingual value.</li>
2600</ul>
2601<p><code>TI18nFormField</code> provides a default implementation of these eight methods and additional default implementations of some of the <code>IFormField</code> methods.
2602If multilingual input is enabled for a specific form field, classes using <code>TI18nFormField</code> register a <a href="../validation_data/#customformfielddataprocessor">custom form field data processor</a> to add the array with multilingual input into the <code>$parameters</code> array directly using <code>{$objectProperty}_i18n</code> as the array key.
2603If multilingual input is enabled but only a monolingual value is entered, the custom form field data processor does nothing and the form field’s value is added by the <code>DefaultFormDataProcessor</code> into the <code>data</code> sub-array of the <code>$parameters</code> array.</p>
2604<div class="admonition info">
2605<p class="admonition-title"><code>TI18nFormField</code> already provides a default implementation of <code>IFormField::validate()</code>.</p>
2606</div>
2607<h4 id="iimmutableformfield"><code>IImmutableFormField</code><a class="headerlink" href="#iimmutableformfield" title="Permanent link">#</a></h4>
2608<p><code>IImmutableFormField</code> has to be implemented by form fields that support being displayed but whose value cannot be changed.
2609The implementing class has to implement the methods <code>immutable($immutable = true)</code> and <code>isImmutable()</code> that can be used to determine if the value of the form field is mutable or immutable.
2610By default, form field are mutable.</p>
2611<h4 id="iinputmodeformfield"><code>IInputModeFormField</code><a class="headerlink" href="#iinputmodeformfield" title="Permanent link">#</a></h4>
2612<div class="admonition info">
2613<p class="admonition-title">Only available since version 5.4.</p>
2614</div>
2615<p><code>IInputModeFormField</code> has to be implemented by form fields that support the <a href="https://html.spec.whatwg.org/multipage/interaction.html#input-modalities:-the-inputmode-attribute"><code>inputmode</code> attribute</a>.
2616The implementing class has to implement the methods <code>inputMode(?string $inputMode): self</code> and <code>getInputMode(): ?string</code>, which are used to set and get the input mode, respectively.
2617<code>TInputModeFormField</code> provides a default implementation of these two methods.</p>
2618<h4 id="imaximumformfield"><code>IMaximumFormField</code><a class="headerlink" href="#imaximumformfield" title="Permanent link">#</a></h4>
2619<p><code>IMaximumFormField</code> has to be implemented by form fields if the entered value must have a maximum value.
2620The implementing class has to implement the methods <code>maximum($maximum = null)</code> and <code>getMaximum()</code>.
2621A maximum of <code>null</code> signals that no maximum value has been set.
2622<code>TMaximumFormField</code> provides a default implementation of these two methods.</p>
2623<div class="admonition warning">
2624<p class="admonition-title">The implementing class has to validate the entered value against the maximum value manually.</p>
2625</div>
2626<h4 id="imaximumlengthformfield"><code>IMaximumLengthFormField</code><a class="headerlink" href="#imaximumlengthformfield" title="Permanent link">#</a></h4>
2627<p><code>IMaximumLengthFormField</code> has to be implemented by form fields if the entered value must have a maximum length.
2628The implementing class has to implement the methods <code>maximumLength($maximumLength = null)</code>, <code>getMaximumLength()</code>, and <code>validateMaximumLength($text, Language $language = null)</code>.
2629A maximum length of <code>null</code> signals that no maximum length has been set.
2630<code>TMaximumLengthFormField</code> provides a default implementation of these two methods.</p>
2631<div class="admonition warning">
2632<p class="admonition-title">The implementing class has to validate the entered value against the maximum value manually by calling <code>validateMaximumLength()</code>.</p>
2633</div>
2634<h4 id="iminimumformfield"><code>IMinimumFormField</code><a class="headerlink" href="#iminimumformfield" title="Permanent link">#</a></h4>
2635<p><code>IMinimumFormField</code> has to be implemented by form fields if the entered value must have a minimum value.
2636The implementing class has to implement the methods <code>minimum($minimum = null)</code> and <code>getMinimum()</code>.
2637A minimum of <code>null</code> signals that no minimum value has been set.
2638<code>TMinimumFormField</code> provides a default implementation of these three methods.</p>
2639<div class="admonition warning">
2640<p class="admonition-title">The implementing class has to validate the entered value against the minimum value manually.</p>
2641</div>
2642<h4 id="iminimumlengthformfield"><code>IMinimumLengthFormField</code><a class="headerlink" href="#iminimumlengthformfield" title="Permanent link">#</a></h4>
2643<p><code>IMinimumLengthFormField</code> has to be implemented by form fields if the entered value must have a minimum length.
2644The implementing class has to implement the methods <code>minimumLength($minimumLength = null)</code>, <code>getMinimumLength()</code>, and <code>validateMinimumLength($text, Language $language = null)</code>.
2645A minimum length of <code>null</code> signals that no minimum length has been set.
2646<code>TMinimumLengthFormField</code> provides a default implementation of these three methods.</p>
2647<div class="admonition warning">
2648<p class="admonition-title">The implementing class has to validate the entered value against the minimum value manually by calling <code>validateMinimumLength()</code>.</p>
2649</div>
2650<h4 id="imultipleformfield"><code>IMultipleFormField</code><a class="headerlink" href="#imultipleformfield" title="Permanent link">#</a></h4>
2651<p><code>IMinimumLengthFormField</code> has to be implemented by form fields that support selecting or setting multiple values.
2652The implementing class has to implement the following methods:</p>
2653<ul>
2654<li><code>multiple($multiple = true)</code> and <code>allowsMultiple()</code> can be used to set whether a specific instance of the class actually should support multiple values.
2655 By default, multiple values are not supported.</li>
2656<li><code>minimumMultiples($minimum)</code> and <code>getMinimumMultiples()</code> can be used to set the minimum number of values that have to be selected/entered.
2657 By default, there is no required minimum number of values.</li>
2658<li><code>maximumMultiples($minimum)</code> and <code>getMaximumMultiples()</code> can be used to set the maximum number of values that have to be selected/entered.
2659 By default, there is no maximum number of values.
2660 <code>IMultipleFormField::NO_MAXIMUM_MULTIPLES</code> is returned if no maximum number of values has been set and it can also be used to unset a previously set maximum number of values.</li>
2661</ul>
2662<p><code>TMultipleFormField</code> provides a default implementation of these six methods and classes using <code>TMultipleFormField</code> register a <a href="../validation_data/#customformfielddataprocessor">custom form field data processor</a> to add the <code>HtmlInputProcessor</code> object with the text into the <code>$parameters</code> array directly using <code>{$objectProperty}_htmlInputProcessor</code> as the array key.</p>
2663<div class="admonition warning">
2664<p class="admonition-title">The implementing class has to validate the values against the minimum and maximum number of values manually.</p>
2665</div>
2666<h4 id="inullableformfield"><code>INullableFormField</code><a class="headerlink" href="#inullableformfield" title="Permanent link">#</a></h4>
2667<p><code>INullableFormField</code> has to be implemented by form fields that support <code>null</code> as their (empty) value.
2668The implementing class has to implement the methods <code>nullable($nullable = true)</code> and <code>isNullable()</code>.
2669<code>TNullableFormField</code> provides a default implementation of these two methods.</p>
2670<p><code>null</code> should be returned by <code>IFormField::getSaveValue()</code> is the field is considered empty and the form field has been set as nullable.</p>
2671<h4 id="ipackagesformfield"><code>IPackagesFormField</code><a class="headerlink" href="#ipackagesformfield" title="Permanent link">#</a></h4>
2672<p><code>IPackagesFormField</code> has to be implemented by form fields that, in some way, considers packages whose ids may be passed to the field object.
2673The implementing class has to implement the methods <code>packageIDs(array $packageIDs)</code> and <code>getPackageIDs()</code>.
2674<code>TPackagesFormField</code> provides a default implementation of these two methods.</p>
2675<h4 id="ipatternformfield"><code>IPatternFormField</code><a class="headerlink" href="#ipatternformfield" title="Permanent link">#</a></h4>
2676<div class="admonition info">
2677<p class="admonition-title">Only available since version 5.4.</p>
2678</div>
2679<p><code>IPatternFormField</code> has to be implemented by form fields that support the <a href="https://html.spec.whatwg.org/multipage/input.html#the-pattern-attribute"><code>pattern</code> attribute</a>.
2680The implementing class has to implement the methods <code>pattern(?string $pattern): self</code> and <code>getPattern(): ?string</code>, which are used to set and get the pattern, respectively.
2681<code>TPatternFormField</code> provides a default implementation of these two methods.</p>
2682<h4 id="iplaceholderformfield"><code>IPlaceholderFormField</code><a class="headerlink" href="#iplaceholderformfield" title="Permanent link">#</a></h4>
2683<p><code>IPlaceholderFormField</code> has to be implemented by form fields that support a placeholder value for empty fields.
2684The implementing class has to implement the methods <code>placeholder($languageItem = null, array $variables = [])</code> and <code>getPlaceholder()</code>.
2685<code>TPlaceholderFormField</code> provides a default implementation of these two methods.</p>
2686<h4 id="iselectionformfield"><code>ISelectionFormField</code><a class="headerlink" href="#iselectionformfield" title="Permanent link">#</a></h4>
2687<p><code>ISelectionFormField</code> has to be implemented by form fields with a predefined set of possible values.
2688The implementing class has to implement the getter and setter methods <code>options($options, $nestedOptions = false, $labelLanguageItems = true)</code> and <code>getOptions()</code> and additionally two methods related to nesting, i.e. whether the selectable options have a hierarchy:
2689<code>supportsNestedOptions()</code> and <code>getNestedOptions()</code>.
2690<code>TSelectionFormField</code> provides a default implementation of these four methods.</p>
2691<h4 id="isuffixedformfield"><code>ISuffixedFormField</code><a class="headerlink" href="#isuffixedformfield" title="Permanent link">#</a></h4>
2692<p><code>ISuffixedFormField</code> has to be implemented by form fields that support supports displaying a suffix behind the actual input field.
2693The implementing class has to implement the methods <code>suffix($languageItem = null, array $variables = [])</code> and <code>getSuffix()</code>.
2694<code>TSuffixedFormField</code> provides a default implementation of these two methods.</p>
2695<h4 id="tdefaultidformfield"><code>TDefaultIdFormField</code><a class="headerlink" href="#tdefaultidformfield" title="Permanent link">#</a></h4>
2696<p>Form fields that have a default id have to use <code>TDefaultIdFormField</code> and have to implement the method <code>getDefaultId()</code>.</p>
2697<h2 id="displaying-forms">Displaying Forms<a class="headerlink" href="#displaying-forms" title="Permanent link">#</a></h2>
2698<p>The only thing to do in a template to display the <strong>whole</strong> form including all of the necessary JavaScript is to put</p>
2699<div class="highlight"><pre><span></span><code><span class="cp">{</span><span class="o">@</span><span class="nv">$form</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="o">()</span><span class="cp">}</span><span class="x"></span>
2700</code></pre></div>
0c5338dd
TD
2701<p>into the template file at the relevant position.</p>
2702
2703
2704
2705
2706
2707
2708
2709 </article>
2710 </div>
2711 </div>
2712 </main>
2713
2714
2715<footer class="md-footer">
2716
2717 <nav class="md-footer__inner md-grid" aria-label="Footer">
2718
2719 <a href="../overview/" class="md-footer__link md-footer__link--prev" rel="prev">
2720 <div class="md-footer__button md-icon">
2721 <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>
2722 </div>
2723 <div class="md-footer__title">
2724 <div class="md-ellipsis">
2725 <span class="md-footer__direction">
2726 Previous
2727 </span>
2728 Overview
2729 </div>
2730 </div>
2731 </a>
2732
2733
2734 <a href="../form_fields/" class="md-footer__link md-footer__link--next" rel="next">
2735 <div class="md-footer__title">
2736 <div class="md-ellipsis">
2737 <span class="md-footer__direction">
2738 Next
2739 </span>
2740 Fields
2741 </div>
2742 </div>
2743 <div class="md-footer__button md-icon">
2744 <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>
2745 </div>
2746 </a>
2747
2748 </nav>
2749
2750 <div class="md-footer-meta md-typeset">
2751 <div class="md-footer-meta__inner md-grid">
2752 <div class="md-footer-copyright">
2753
2754 <div class="md-footer-copyright__highlight">
2755 Copyright © 2020 WoltLab GmbH
2756 </div>
2757
2758 Made with
2759 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2760 Material for MkDocs
2761 </a>
fb88dc6e 2762
0c5338dd
TD
2763 </div>
2764 <div class="md-footer-copyright">
2765 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
2766 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
2767</div>
2768 </div>
2769 </div>
2770</footer>
2771
2772 </div>
2773 <div class="md-dialog" data-md-component="dialog">
2774 <div class="md-dialog__inner md-typeset"></div>
2775 </div>
2776 <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>
2777
2778
fb88dc6e 2779 <script src="../../../../assets/javascripts/bundle.5cf3e710.min.js"></script>
0c5338dd
TD
2780
2781
2782 </body>
2783</html>