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