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