Deployed 023ad450 to 6.0 with MkDocs 1.4.3 and mike 1.1.2
[GitHub/WoltLab/woltlab.github.io.git] / 6.0 / tutorial / series / part_5 / index.html
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9
10
11 <link rel="canonical" href="https://docs.woltlab.com/6.0/tutorial/series/part_5/">
12
13
14 <link rel="prev" href="../part_4/">
15
16
17 <link rel="next" href="../part_6/">
18
19 <link rel="icon" href="../../../assets/default.favicon.ico">
20 <meta name="generator" content="mkdocs-1.4.3, mkdocs-material-9.1.14">
21
22
23
24 <title>Part 5 - WoltLab Suite Documentation</title>
25
26
27
28 <link rel="stylesheet" href="../../../assets/stylesheets/main.85bb2934.min.css">
29
30
31 <link rel="stylesheet" href="../../../assets/stylesheets/palette.a6bdf11c.min.css">
32
33
34
35
36
37
38
39
40
41 <link rel="stylesheet" href="../../../stylesheets/extra.css">
42
43 <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
44
45
46
47
48
49
50 </head>
51
52
53
54
55
56
57
58 <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="teal" data-md-color-accent="indigo">
59
60
61
62 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
63 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
64 <label class="md-overlay" for="__drawer"></label>
65 <div data-md-component="skip">
66
67
68 <a href="#part-5-person-information" class="md-skip">
69 Skip to content
70 </a>
71
72 </div>
73 <div data-md-component="announce">
74
75 <aside class="md-banner">
76 <div class="md-banner__inner md-grid md-typeset">
77
78
79 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
80
81 </div>
82
83 </aside>
84
85 </div>
86
87 <div data-md-color-scheme="default" data-md-component="outdated" hidden>
88
89 </div>
90
91
92
93
94
95
96 <header class="md-header md-header--shadow" data-md-component="header">
97 <nav class="md-header__inner md-grid" aria-label="Header">
98 <a href="../../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
99
100 <img src="../../../assets/logo.png" alt="logo">
101
102 </a>
103 <label class="md-header__button md-icon" for="__drawer">
104 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
105 </label>
106 <div class="md-header__title" data-md-component="header-title">
107 <div class="md-header__ellipsis">
108 <div class="md-header__topic">
109 <span class="md-ellipsis">
110 WoltLab Suite Documentation
111 </span>
112 </div>
113 <div class="md-header__topic" data-md-component="header-topic">
114 <span class="md-ellipsis">
115
116 Part 5
117
118 </span>
119 </div>
120 </div>
121 </div>
122
123
124
125
126
127 <label class="md-header__button md-icon" for="__search">
128 <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>
129 </label>
130 <div class="md-search" data-md-component="search" role="dialog">
131 <label class="md-search__overlay" for="__search"></label>
132 <div class="md-search__inner" role="search">
133 <form class="md-search__form" name="search">
134 <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" required>
135 <label class="md-search__icon md-icon" for="__search">
136 <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>
137 <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>
138 </label>
139 <nav class="md-search__options" aria-label="Search">
140
141 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
142 <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>
143 </button>
144 </nav>
145
146 </form>
147 <div class="md-search__output">
148 <div class="md-search__scrollwrap" data-md-scrollfix>
149 <div class="md-search-result" data-md-component="search-result">
150 <div class="md-search-result__meta">
151 Initializing search
152 </div>
153 <ol class="md-search-result__list" role="presentation"></ol>
154 </div>
155 </div>
156 </div>
157 </div>
158 </div>
159
160
161 <div class="md-header__source">
162 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
163 <div class="md-source__icon md-icon">
164
165 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><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>
166 </div>
167 <div class="md-source__repository">
168 GitHub
169 </div>
170 </a>
171 </div>
172
173 </nav>
174
175 </header>
176
177 <div class="md-container" data-md-component="container">
178
179
180
181
182
183
184 <main class="md-main" data-md-component="main">
185 <div class="md-main__inner md-grid">
186
187
188
189 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
190 <div class="md-sidebar__scrollwrap">
191 <div class="md-sidebar__inner">
192
193
194
195 <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
196 <label class="md-nav__title" for="__drawer">
197 <a href="../../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
198
199 <img src="../../../assets/logo.png" alt="logo">
200
201 </a>
202 WoltLab Suite Documentation
203 </label>
204
205 <div class="md-nav__source">
206 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
207 <div class="md-source__icon md-icon">
208
209 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><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>
210 </div>
211 <div class="md-source__repository">
212 GitHub
213 </div>
214 </a>
215 </div>
216
217 <ul class="md-nav__list" data-md-scrollfix>
218
219
220
221
222
223
224
225
226 <li class="md-nav__item">
227 <a href="../../../getting-started/" class="md-nav__link">
228 Getting Started
229 </a>
230 </li>
231
232
233
234
235
236
237
238
239
240
241
242 <li class="md-nav__item md-nav__item--nested">
243
244
245
246
247 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
248
249
250
251 <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
252 PHP API
253 <span class="md-nav__icon md-icon"></span>
254 </label>
255
256 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
257 <label class="md-nav__title" for="__nav_2">
258 <span class="md-nav__icon md-icon"></span>
259 PHP API
260 </label>
261 <ul class="md-nav__list" data-md-scrollfix>
262
263
264
265
266
267
268 <li class="md-nav__item">
269 <a href="../../../php/pages/" class="md-nav__link">
270 Pages
271 </a>
272 </li>
273
274
275
276
277
278
279
280
281
282 <li class="md-nav__item">
283 <a href="../../../php/database-objects/" class="md-nav__link">
284 Database Objects
285 </a>
286 </li>
287
288
289
290
291
292
293
294
295
296 <li class="md-nav__item">
297 <a href="../../../php/database-access/" class="md-nav__link">
298 Database Access
299 </a>
300 </li>
301
302
303
304
305
306
307
308
309
310 <li class="md-nav__item">
311 <a href="../../../php/exceptions/" class="md-nav__link">
312 Exceptions
313 </a>
314 </li>
315
316
317
318
319
320
321
322
323
324
325 <li class="md-nav__item md-nav__item--nested">
326
327
328
329
330 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5" >
331
332
333
334 <label class="md-nav__link" for="__nav_2_5" id="__nav_2_5_label" tabindex="0">
335 API
336 <span class="md-nav__icon md-icon"></span>
337 </label>
338
339 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
340 <label class="md-nav__title" for="__nav_2_5">
341 <span class="md-nav__icon md-icon"></span>
342 API
343 </label>
344 <ul class="md-nav__list" data-md-scrollfix>
345
346
347
348
349
350
351
352 <li class="md-nav__item md-nav__item--nested">
353
354
355
356
357 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_1" >
358
359
360
361 <label class="md-nav__link" for="__nav_2_5_1" id="__nav_2_5_1_label" tabindex="0">
362 Caches
363 <span class="md-nav__icon md-icon"></span>
364 </label>
365
366 <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_1_label" aria-expanded="false">
367 <label class="md-nav__title" for="__nav_2_5_1">
368 <span class="md-nav__icon md-icon"></span>
369 Caches
370 </label>
371 <ul class="md-nav__list" data-md-scrollfix>
372
373
374
375
376
377
378 <li class="md-nav__item">
379 <a href="../../../php/api/caches/" class="md-nav__link">
380 Overview
381 </a>
382 </li>
383
384
385
386
387
388
389
390
391
392 <li class="md-nav__item">
393 <a href="../../../php/api/caches_persistent-caches/" class="md-nav__link">
394 Persistent Caches
395 </a>
396 </li>
397
398
399
400
401
402
403
404
405
406 <li class="md-nav__item">
407 <a href="../../../php/api/caches_runtime-caches/" class="md-nav__link">
408 Runtime Caches
409 </a>
410 </li>
411
412
413
414
415 </ul>
416 </nav>
417 </li>
418
419
420
421
422
423
424
425
426
427 <li class="md-nav__item">
428 <a href="../../../php/api/comments/" class="md-nav__link">
429 Comments
430 </a>
431 </li>
432
433
434
435
436
437
438
439
440
441 <li class="md-nav__item">
442 <a href="../../../php/api/cronjobs/" class="md-nav__link">
443 Cronjobs
444 </a>
445 </li>
446
447
448
449
450
451
452
453
454
455 <li class="md-nav__item">
456 <a href="../../../php/api/events/" class="md-nav__link">
457 Events
458 </a>
459 </li>
460
461
462
463
464
465
466
467
468
469
470 <li class="md-nav__item md-nav__item--nested">
471
472
473
474
475 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_5" >
476
477
478
479 <label class="md-nav__link" for="__nav_2_5_5" id="__nav_2_5_5_label" tabindex="0">
480 Form Builder
481 <span class="md-nav__icon md-icon"></span>
482 </label>
483
484 <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_5_label" aria-expanded="false">
485 <label class="md-nav__title" for="__nav_2_5_5">
486 <span class="md-nav__icon md-icon"></span>
487 Form Builder
488 </label>
489 <ul class="md-nav__list" data-md-scrollfix>
490
491
492
493
494
495
496 <li class="md-nav__item">
497 <a href="../../../php/api/form_builder/overview/" class="md-nav__link">
498 Overview
499 </a>
500 </li>
501
502
503
504
505
506
507
508
509
510 <li class="md-nav__item">
511 <a href="../../../php/api/form_builder/structure/" class="md-nav__link">
512 Structure
513 </a>
514 </li>
515
516
517
518
519
520
521
522
523
524 <li class="md-nav__item">
525 <a href="../../../php/api/form_builder/form_fields/" class="md-nav__link">
526 Fields
527 </a>
528 </li>
529
530
531
532
533
534
535
536
537
538 <li class="md-nav__item">
539 <a href="../../../php/api/form_builder/validation_data/" class="md-nav__link">
540 Validation and Data
541 </a>
542 </li>
543
544
545
546
547
548
549
550
551
552 <li class="md-nav__item">
553 <a href="../../../php/api/form_builder/dependencies/" class="md-nav__link">
554 Dependencies
555 </a>
556 </li>
557
558
559
560
561 </ul>
562 </nav>
563 </li>
564
565
566
567
568
569
570
571
572
573 <li class="md-nav__item">
574 <a href="../../../php/api/package_installation_plugins/" class="md-nav__link">
575 Package Installation Plugins
576 </a>
577 </li>
578
579
580
581
582
583
584
585
586
587 <li class="md-nav__item">
588 <a href="../../../php/api/user_activity_points/" class="md-nav__link">
589 User Activity Points
590 </a>
591 </li>
592
593
594
595
596
597
598
599
600
601 <li class="md-nav__item">
602 <a href="../../../php/api/user_notifications/" class="md-nav__link">
603 User Notifications
604 </a>
605 </li>
606
607
608
609
610
611
612
613
614
615 <li class="md-nav__item">
616 <a href="../../../php/api/sitemaps/" class="md-nav__link">
617 Sitemaps
618 </a>
619 </li>
620
621
622
623
624 </ul>
625 </nav>
626 </li>
627
628
629
630
631
632
633
634
635
636 <li class="md-nav__item">
637 <a href="../../../php/code-style/" class="md-nav__link">
638 Code Style
639 </a>
640 </li>
641
642
643
644
645
646
647
648
649
650 <li class="md-nav__item">
651 <a href="../../../php/apps/" class="md-nav__link">
652 Apps
653 </a>
654 </li>
655
656
657
658
659
660
661
662
663
664 <li class="md-nav__item">
665 <a href="../../../php/gdpr/" class="md-nav__link">
666 GDPR
667 </a>
668 </li>
669
670
671
672
673 </ul>
674 </nav>
675 </li>
676
677
678
679
680
681
682
683
684
685
686
687 <li class="md-nav__item md-nav__item--nested">
688
689
690
691
692 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
693
694
695
696 <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
697 Languages, Templates & CSS
698 <span class="md-nav__icon md-icon"></span>
699 </label>
700
701 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
702 <label class="md-nav__title" for="__nav_3">
703 <span class="md-nav__icon md-icon"></span>
704 Languages, Templates & CSS
705 </label>
706 <ul class="md-nav__list" data-md-scrollfix>
707
708
709
710
711
712
713 <li class="md-nav__item">
714 <a href="../../../view/languages/" class="md-nav__link">
715 Languages
716 </a>
717 </li>
718
719
720
721
722
723
724
725
726
727 <li class="md-nav__item">
728 <a href="../../../view/templates/" class="md-nav__link">
729 Templates
730 </a>
731 </li>
732
733
734
735
736
737
738
739
740
741 <li class="md-nav__item">
742 <a href="../../../view/template-plugins/" class="md-nav__link">
743 Template Plugins
744 </a>
745 </li>
746
747
748
749
750
751
752
753
754
755 <li class="md-nav__item">
756 <a href="../../../view/css/" class="md-nav__link">
757 CSS
758 </a>
759 </li>
760
761
762
763
764 </ul>
765 </nav>
766 </li>
767
768
769
770
771
772
773
774
775
776
777
778 <li class="md-nav__item md-nav__item--nested">
779
780
781
782
783 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
784
785
786
787 <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
788 TypeScript and JavaScript API
789 <span class="md-nav__icon md-icon"></span>
790 </label>
791
792 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
793 <label class="md-nav__title" for="__nav_4">
794 <span class="md-nav__icon md-icon"></span>
795 TypeScript and JavaScript API
796 </label>
797 <ul class="md-nav__list" data-md-scrollfix>
798
799
800
801
802
803
804 <li class="md-nav__item">
805 <a href="../../../javascript/general-usage/" class="md-nav__link">
806 General Usage
807 </a>
808 </li>
809
810
811
812
813
814
815
816
817
818 <li class="md-nav__item">
819 <a href="../../../javascript/typescript/" class="md-nav__link">
820 TypeScript
821 </a>
822 </li>
823
824
825
826
827
828
829
830
831
832
833 <li class="md-nav__item md-nav__item--nested">
834
835
836
837
838 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" >
839
840
841
842 <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0">
843 Components
844 <span class="md-nav__icon md-icon"></span>
845 </label>
846
847 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false">
848 <label class="md-nav__title" for="__nav_4_3">
849 <span class="md-nav__icon md-icon"></span>
850 Components
851 </label>
852 <ul class="md-nav__list" data-md-scrollfix>
853
854
855
856
857
858
859 <li class="md-nav__item">
860 <a href="../../../javascript/components_confirmation/" class="md-nav__link">
861 Confirmation
862 </a>
863 </li>
864
865
866
867
868
869
870
871
872
873 <li class="md-nav__item">
874 <a href="../../../javascript/components_dialog/" class="md-nav__link">
875 Dialog
876 </a>
877 </li>
878
879
880
881
882
883
884
885
886
887 <li class="md-nav__item">
888 <a href="../../../javascript/components_google_maps/" class="md-nav__link">
889 Google Maps
890 </a>
891 </li>
892
893
894
895
896
897
898
899
900
901 <li class="md-nav__item">
902 <a href="../../../javascript/components_pagination/" class="md-nav__link">
903 Pagination
904 </a>
905 </li>
906
907
908
909
910 </ul>
911 </nav>
912 </li>
913
914
915
916
917
918
919
920
921
922
923 <li class="md-nav__item md-nav__item--nested">
924
925
926
927
928 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_4" >
929
930
931
932 <label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0">
933 New API
934 <span class="md-nav__icon md-icon"></span>
935 </label>
936
937 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false">
938 <label class="md-nav__title" for="__nav_4_4">
939 <span class="md-nav__icon md-icon"></span>
940 New API
941 </label>
942 <ul class="md-nav__list" data-md-scrollfix>
943
944
945
946
947
948
949 <li class="md-nav__item">
950 <a href="../../../javascript/new-api_writing-a-module/" class="md-nav__link">
951 Writing a module
952 </a>
953 </li>
954
955
956
957
958
959
960
961
962
963 <li class="md-nav__item">
964 <a href="../../../javascript/new-api_core/" class="md-nav__link">
965 Core Functions
966 </a>
967 </li>
968
969
970
971
972
973
974
975
976
977 <li class="md-nav__item">
978 <a href="../../../javascript/new-api_dom/" class="md-nav__link">
979 DOM
980 </a>
981 </li>
982
983
984
985
986
987
988
989
990
991 <li class="md-nav__item">
992 <a href="../../../javascript/new-api_events/" class="md-nav__link">
993 Event Handling
994 </a>
995 </li>
996
997
998
999
1000
1001
1002
1003
1004
1005 <li class="md-nav__item">
1006 <a href="../../../javascript/new-api_ajax/" class="md-nav__link">
1007 Ajax
1008 </a>
1009 </li>
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019 <li class="md-nav__item">
1020 <a href="../../../javascript/new-api_dialogs/" class="md-nav__link">
1021 Dialogs
1022 </a>
1023 </li>
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033 <li class="md-nav__item">
1034 <a href="../../../javascript/new-api_browser/" class="md-nav__link">
1035 Browser and Screen Sizes
1036 </a>
1037 </li>
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047 <li class="md-nav__item">
1048 <a href="../../../javascript/new-api_ui/" class="md-nav__link">
1049 User Interface
1050 </a>
1051 </li>
1052
1053
1054
1055
1056 </ul>
1057 </nav>
1058 </li>
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068 <li class="md-nav__item">
1069 <a href="../../../javascript/legacy-api/" class="md-nav__link">
1070 Legacy API
1071 </a>
1072 </li>
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082 <li class="md-nav__item">
1083 <a href="../../../javascript/code-snippets/" class="md-nav__link">
1084 Code Snippets
1085 </a>
1086 </li>
1087
1088
1089
1090
1091 </ul>
1092 </nav>
1093 </li>
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105 <li class="md-nav__item md-nav__item--nested">
1106
1107
1108
1109
1110 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1111
1112
1113
1114 <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
1115 Package Components
1116 <span class="md-nav__icon md-icon"></span>
1117 </label>
1118
1119 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1120 <label class="md-nav__title" for="__nav_5">
1121 <span class="md-nav__icon md-icon"></span>
1122 Package Components
1123 </label>
1124 <ul class="md-nav__list" data-md-scrollfix>
1125
1126
1127
1128
1129
1130
1131 <li class="md-nav__item">
1132 <a href="../../../package/package-xml/" class="md-nav__link">
1133 package.xml
1134 </a>
1135 </li>
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146 <li class="md-nav__item md-nav__item--nested">
1147
1148
1149
1150
1151 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
1152
1153
1154
1155 <label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
1156 PIPs
1157 <span class="md-nav__icon md-icon"></span>
1158 </label>
1159
1160 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
1161 <label class="md-nav__title" for="__nav_5_2">
1162 <span class="md-nav__icon md-icon"></span>
1163 PIPs
1164 </label>
1165 <ul class="md-nav__list" data-md-scrollfix>
1166
1167
1168
1169
1170
1171
1172 <li class="md-nav__item">
1173 <a href="../../../package/pip/" class="md-nav__link">
1174 Overview
1175 </a>
1176 </li>
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186 <li class="md-nav__item">
1187 <a href="../../../package/pip/acl-option/" class="md-nav__link">
1188 aclOption
1189 </a>
1190 </li>
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200 <li class="md-nav__item">
1201 <a href="../../../package/pip/acp-menu/" class="md-nav__link">
1202 acpMenu
1203 </a>
1204 </li>
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214 <li class="md-nav__item">
1215 <a href="../../../package/pip/acp-search-provider/" class="md-nav__link">
1216 acpSearchProvider
1217 </a>
1218 </li>
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228 <li class="md-nav__item">
1229 <a href="../../../package/pip/acp-template/" class="md-nav__link">
1230 acpTemplate
1231 </a>
1232 </li>
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242 <li class="md-nav__item">
1243 <a href="../../../package/pip/acp-template-delete/" class="md-nav__link">
1244 acpTemplateDelete
1245 </a>
1246 </li>
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256 <li class="md-nav__item">
1257 <a href="../../../package/pip/bbcode/" class="md-nav__link">
1258 bbcode
1259 </a>
1260 </li>
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270 <li class="md-nav__item">
1271 <a href="../../../package/pip/box/" class="md-nav__link">
1272 box
1273 </a>
1274 </li>
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284 <li class="md-nav__item">
1285 <a href="../../../package/pip/clipboard-action/" class="md-nav__link">
1286 clipboardAction
1287 </a>
1288 </li>
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298 <li class="md-nav__item">
1299 <a href="../../../package/pip/core-object/" class="md-nav__link">
1300 coreObject
1301 </a>
1302 </li>
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312 <li class="md-nav__item">
1313 <a href="../../../package/pip/cronjob/" class="md-nav__link">
1314 cronjob
1315 </a>
1316 </li>
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326 <li class="md-nav__item">
1327 <a href="../../../package/pip/database/" class="md-nav__link">
1328 database
1329 </a>
1330 </li>
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340 <li class="md-nav__item">
1341 <a href="../../../package/pip/event-listener/" class="md-nav__link">
1342 eventListener
1343 </a>
1344 </li>
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354 <li class="md-nav__item">
1355 <a href="../../../package/pip/file/" class="md-nav__link">
1356 file
1357 </a>
1358 </li>
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368 <li class="md-nav__item">
1369 <a href="../../../package/pip/file-delete/" class="md-nav__link">
1370 fileDelete
1371 </a>
1372 </li>
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382 <li class="md-nav__item">
1383 <a href="../../../package/pip/language/" class="md-nav__link">
1384 language
1385 </a>
1386 </li>
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396 <li class="md-nav__item">
1397 <a href="../../../package/pip/media-provider/" class="md-nav__link">
1398 mediaProvider
1399 </a>
1400 </li>
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410 <li class="md-nav__item">
1411 <a href="../../../package/pip/menu/" class="md-nav__link">
1412 menu
1413 </a>
1414 </li>
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424 <li class="md-nav__item">
1425 <a href="../../../package/pip/menu-item/" class="md-nav__link">
1426 menuItem
1427 </a>
1428 </li>
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438 <li class="md-nav__item">
1439 <a href="../../../package/pip/object-type/" class="md-nav__link">
1440 objectType
1441 </a>
1442 </li>
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452 <li class="md-nav__item">
1453 <a href="../../../package/pip/object-type-definition/" class="md-nav__link">
1454 objectTypeDefinition
1455 </a>
1456 </li>
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466 <li class="md-nav__item">
1467 <a href="../../../package/pip/option/" class="md-nav__link">
1468 option
1469 </a>
1470 </li>
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480 <li class="md-nav__item">
1481 <a href="../../../package/pip/page/" class="md-nav__link">
1482 page
1483 </a>
1484 </li>
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494 <li class="md-nav__item">
1495 <a href="../../../package/pip/pip/" class="md-nav__link">
1496 pip
1497 </a>
1498 </li>
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508 <li class="md-nav__item">
1509 <a href="../../../package/pip/script/" class="md-nav__link">
1510 script
1511 </a>
1512 </li>
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522 <li class="md-nav__item">
1523 <a href="../../../package/pip/smiley/" class="md-nav__link">
1524 smiley
1525 </a>
1526 </li>
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536 <li class="md-nav__item">
1537 <a href="../../../package/pip/sql/" class="md-nav__link">
1538 sql
1539 </a>
1540 </li>
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550 <li class="md-nav__item">
1551 <a href="../../../package/pip/style/" class="md-nav__link">
1552 style
1553 </a>
1554 </li>
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564 <li class="md-nav__item">
1565 <a href="../../../package/pip/template/" class="md-nav__link">
1566 template
1567 </a>
1568 </li>
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578 <li class="md-nav__item">
1579 <a href="../../../package/pip/template-delete/" class="md-nav__link">
1580 templateDelete
1581 </a>
1582 </li>
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592 <li class="md-nav__item">
1593 <a href="../../../package/pip/template-listener/" class="md-nav__link">
1594 templateListener
1595 </a>
1596 </li>
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606 <li class="md-nav__item">
1607 <a href="../../../package/pip/user-group-option/" class="md-nav__link">
1608 userGroupOption
1609 </a>
1610 </li>
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620 <li class="md-nav__item">
1621 <a href="../../../package/pip/user-menu/" class="md-nav__link">
1622 userMenu
1623 </a>
1624 </li>
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634 <li class="md-nav__item">
1635 <a href="../../../package/pip/user-notification-event/" class="md-nav__link">
1636 userNotificationEvent
1637 </a>
1638 </li>
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648 <li class="md-nav__item">
1649 <a href="../../../package/pip/user-option/" class="md-nav__link">
1650 userOption
1651 </a>
1652 </li>
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662 <li class="md-nav__item">
1663 <a href="../../../package/pip/user-profile-menu/" class="md-nav__link">
1664 userProfileMenu
1665 </a>
1666 </li>
1667
1668
1669
1670
1671 </ul>
1672 </nav>
1673 </li>
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683 <li class="md-nav__item">
1684 <a href="../../../package/database-php-api/" class="md-nav__link">
1685 Database PHP API
1686 </a>
1687 </li>
1688
1689
1690
1691
1692 </ul>
1693 </nav>
1694 </li>
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706 <li class="md-nav__item md-nav__item--nested">
1707
1708
1709
1710
1711 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
1712
1713
1714
1715 <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
1716 Migration
1717 <span class="md-nav__icon md-icon"></span>
1718 </label>
1719
1720 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
1721 <label class="md-nav__title" for="__nav_6">
1722 <span class="md-nav__icon md-icon"></span>
1723 Migration
1724 </label>
1725 <ul class="md-nav__list" data-md-scrollfix>
1726
1727
1728
1729
1730
1731
1732
1733 <li class="md-nav__item md-nav__item--nested">
1734
1735
1736
1737
1738 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_1" >
1739
1740
1741
1742 <label class="md-nav__link" for="__nav_6_1" id="__nav_6_1_label" tabindex="0">
1743 From WoltLab Suite 5.5
1744 <span class="md-nav__icon md-icon"></span>
1745 </label>
1746
1747 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_1_label" aria-expanded="false">
1748 <label class="md-nav__title" for="__nav_6_1">
1749 <span class="md-nav__icon md-icon"></span>
1750 From WoltLab Suite 5.5
1751 </label>
1752 <ul class="md-nav__list" data-md-scrollfix>
1753
1754
1755
1756
1757
1758
1759 <li class="md-nav__item">
1760 <a href="../../../migration/wsc55/php/" class="md-nav__link">
1761 PHP API
1762 </a>
1763 </li>
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773 <li class="md-nav__item">
1774 <a href="../../../migration/wsc55/javascript/" class="md-nav__link">
1775 TypeScript and JavaScript
1776 </a>
1777 </li>
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787 <li class="md-nav__item">
1788 <a href="../../../migration/wsc55/templates/" class="md-nav__link">
1789 Templates
1790 </a>
1791 </li>
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801 <li class="md-nav__item">
1802 <a href="../../../migration/wsc55/icons/" class="md-nav__link">
1803 Icons
1804 </a>
1805 </li>
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815 <li class="md-nav__item">
1816 <a href="../../../migration/wsc55/dialogs/" class="md-nav__link">
1817 Dialogs
1818 </a>
1819 </li>
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829 <li class="md-nav__item">
1830 <a href="../../../migration/wsc55/libraries/" class="md-nav__link">
1831 Third Party Libraries
1832 </a>
1833 </li>
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843 <li class="md-nav__item">
1844 <a href="../../../migration/wsc55/deprecations_removals/" class="md-nav__link">
1845 Deprecations and Removals
1846 </a>
1847 </li>
1848
1849
1850
1851
1852 </ul>
1853 </nav>
1854 </li>
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865 <li class="md-nav__item md-nav__item--nested">
1866
1867
1868
1869
1870 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" >
1871
1872
1873
1874 <label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="0">
1875 From WoltLab Suite 5.4
1876 <span class="md-nav__icon md-icon"></span>
1877 </label>
1878
1879 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="false">
1880 <label class="md-nav__title" for="__nav_6_2">
1881 <span class="md-nav__icon md-icon"></span>
1882 From WoltLab Suite 5.4
1883 </label>
1884 <ul class="md-nav__list" data-md-scrollfix>
1885
1886
1887
1888
1889
1890
1891 <li class="md-nav__item">
1892 <a href="../../../migration/wsc54/php/" class="md-nav__link">
1893 PHP API
1894 </a>
1895 </li>
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905 <li class="md-nav__item">
1906 <a href="../../../migration/wsc54/javascript/" class="md-nav__link">
1907 TypeScript and JavaScript
1908 </a>
1909 </li>
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919 <li class="md-nav__item">
1920 <a href="../../../migration/wsc54/templates/" class="md-nav__link">
1921 Templates
1922 </a>
1923 </li>
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933 <li class="md-nav__item">
1934 <a href="../../../migration/wsc54/libraries/" class="md-nav__link">
1935 Third Party Libraries
1936 </a>
1937 </li>
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947 <li class="md-nav__item">
1948 <a href="../../../migration/wsc54/deprecations_removals/" class="md-nav__link">
1949 Deprecations and Removals
1950 </a>
1951 </li>
1952
1953
1954
1955
1956 </ul>
1957 </nav>
1958 </li>
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969 <li class="md-nav__item md-nav__item--nested">
1970
1971
1972
1973
1974 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_3" >
1975
1976
1977
1978 <label class="md-nav__link" for="__nav_6_3" id="__nav_6_3_label" tabindex="0">
1979 From WoltLab Suite 5.3
1980 <span class="md-nav__icon md-icon"></span>
1981 </label>
1982
1983 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_3_label" aria-expanded="false">
1984 <label class="md-nav__title" for="__nav_6_3">
1985 <span class="md-nav__icon md-icon"></span>
1986 From WoltLab Suite 5.3
1987 </label>
1988 <ul class="md-nav__list" data-md-scrollfix>
1989
1990
1991
1992
1993
1994
1995 <li class="md-nav__item">
1996 <a href="../../../migration/wsc53/php/" class="md-nav__link">
1997 PHP API
1998 </a>
1999 </li>
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009 <li class="md-nav__item">
2010 <a href="../../../migration/wsc53/session/" class="md-nav__link">
2011 Session Handling and Authentication
2012 </a>
2013 </li>
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023 <li class="md-nav__item">
2024 <a href="../../../migration/wsc53/javascript/" class="md-nav__link">
2025 TypeScript and JavaScript
2026 </a>
2027 </li>
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037 <li class="md-nav__item">
2038 <a href="../../../migration/wsc53/templates/" class="md-nav__link">
2039 Templates
2040 </a>
2041 </li>
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051 <li class="md-nav__item">
2052 <a href="../../../migration/wsc53/libraries/" class="md-nav__link">
2053 Third Party Libraries
2054 </a>
2055 </li>
2056
2057
2058
2059
2060 </ul>
2061 </nav>
2062 </li>
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073 <li class="md-nav__item md-nav__item--nested">
2074
2075
2076
2077
2078 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_4" >
2079
2080
2081
2082 <label class="md-nav__link" for="__nav_6_4" id="__nav_6_4_label" tabindex="0">
2083 From WoltLab Suite 5.2
2084 <span class="md-nav__icon md-icon"></span>
2085 </label>
2086
2087 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_4_label" aria-expanded="false">
2088 <label class="md-nav__title" for="__nav_6_4">
2089 <span class="md-nav__icon md-icon"></span>
2090 From WoltLab Suite 5.2
2091 </label>
2092 <ul class="md-nav__list" data-md-scrollfix>
2093
2094
2095
2096
2097
2098
2099 <li class="md-nav__item">
2100 <a href="../../../migration/wsc52/php/" class="md-nav__link">
2101 PHP API
2102 </a>
2103 </li>
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113 <li class="md-nav__item">
2114 <a href="../../../migration/wsc52/templates/" class="md-nav__link">
2115 Templates and Languages
2116 </a>
2117 </li>
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127 <li class="md-nav__item">
2128 <a href="../../../migration/wsc52/libraries/" class="md-nav__link">
2129 Third Party Libraries
2130 </a>
2131 </li>
2132
2133
2134
2135
2136 </ul>
2137 </nav>
2138 </li>
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149 <li class="md-nav__item md-nav__item--nested">
2150
2151
2152
2153
2154 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_5" >
2155
2156
2157
2158 <label class="md-nav__link" for="__nav_6_5" id="__nav_6_5_label" tabindex="0">
2159 From WoltLab Suite 3.1
2160 <span class="md-nav__icon md-icon"></span>
2161 </label>
2162
2163 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_5_label" aria-expanded="false">
2164 <label class="md-nav__title" for="__nav_6_5">
2165 <span class="md-nav__icon md-icon"></span>
2166 From WoltLab Suite 3.1
2167 </label>
2168 <ul class="md-nav__list" data-md-scrollfix>
2169
2170
2171
2172
2173
2174
2175 <li class="md-nav__item">
2176 <a href="../../../migration/wsc31/php/" class="md-nav__link">
2177 PHP API
2178 </a>
2179 </li>
2180
2181
2182
2183
2184 </ul>
2185 </nav>
2186 </li>
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197 <li class="md-nav__item md-nav__item--nested">
2198
2199
2200
2201
2202 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_6" >
2203
2204
2205
2206 <label class="md-nav__link" for="__nav_6_6" id="__nav_6_6_label" tabindex="0">
2207 From WoltLab Suite 3.0
2208 <span class="md-nav__icon md-icon"></span>
2209 </label>
2210
2211 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_6_label" aria-expanded="false">
2212 <label class="md-nav__title" for="__nav_6_6">
2213 <span class="md-nav__icon md-icon"></span>
2214 From WoltLab Suite 3.0
2215 </label>
2216 <ul class="md-nav__list" data-md-scrollfix>
2217
2218
2219
2220
2221
2222
2223 <li class="md-nav__item">
2224 <a href="../../../migration/wsc30/php/" class="md-nav__link">
2225 PHP API
2226 </a>
2227 </li>
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237 <li class="md-nav__item">
2238 <a href="../../../migration/wsc30/javascript/" class="md-nav__link">
2239 JavaScript API
2240 </a>
2241 </li>
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251 <li class="md-nav__item">
2252 <a href="../../../migration/wsc30/templates/" class="md-nav__link">
2253 Templates
2254 </a>
2255 </li>
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265 <li class="md-nav__item">
2266 <a href="../../../migration/wsc30/css/" class="md-nav__link">
2267 CSS
2268 </a>
2269 </li>
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279 <li class="md-nav__item">
2280 <a href="../../../migration/wsc30/package/" class="md-nav__link">
2281 Package Components
2282 </a>
2283 </li>
2284
2285
2286
2287
2288 </ul>
2289 </nav>
2290 </li>
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301 <li class="md-nav__item md-nav__item--nested">
2302
2303
2304
2305
2306 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_7" >
2307
2308
2309
2310 <label class="md-nav__link" for="__nav_6_7" id="__nav_6_7_label" tabindex="0">
2311 From WCF 2.1
2312 <span class="md-nav__icon md-icon"></span>
2313 </label>
2314
2315 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_7_label" aria-expanded="false">
2316 <label class="md-nav__title" for="__nav_6_7">
2317 <span class="md-nav__icon md-icon"></span>
2318 From WCF 2.1
2319 </label>
2320 <ul class="md-nav__list" data-md-scrollfix>
2321
2322
2323
2324
2325
2326
2327 <li class="md-nav__item">
2328 <a href="../../../migration/wcf21/php/" class="md-nav__link">
2329 PHP API
2330 </a>
2331 </li>
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341 <li class="md-nav__item">
2342 <a href="../../../migration/wcf21/templates/" class="md-nav__link">
2343 Templates
2344 </a>
2345 </li>
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355 <li class="md-nav__item">
2356 <a href="../../../migration/wcf21/css/" class="md-nav__link">
2357 CSS
2358 </a>
2359 </li>
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369 <li class="md-nav__item">
2370 <a href="../../../migration/wcf21/package/" class="md-nav__link">
2371 Package Components
2372 </a>
2373 </li>
2374
2375
2376
2377
2378 </ul>
2379 </nav>
2380 </li>
2381
2382
2383
2384
2385 </ul>
2386 </nav>
2387 </li>
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
2402
2403
2404
2405
2406 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
2407
2408
2409
2410 <label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
2411 Tutorials
2412 <span class="md-nav__icon md-icon"></span>
2413 </label>
2414
2415 <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
2416 <label class="md-nav__title" for="__nav_7">
2417 <span class="md-nav__icon md-icon"></span>
2418 Tutorials
2419 </label>
2420 <ul class="md-nav__list" data-md-scrollfix>
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
2431
2432
2433
2434
2435 <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7_1" checked>
2436
2437
2438
2439 <label class="md-nav__link" for="__nav_7_1" id="__nav_7_1_label" tabindex="0">
2440 Tutorial Series
2441 <span class="md-nav__icon md-icon"></span>
2442 </label>
2443
2444 <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_7_1_label" aria-expanded="true">
2445 <label class="md-nav__title" for="__nav_7_1">
2446 <span class="md-nav__icon md-icon"></span>
2447 Tutorial Series
2448 </label>
2449 <ul class="md-nav__list" data-md-scrollfix>
2450
2451
2452
2453
2454
2455
2456 <li class="md-nav__item">
2457 <a href="../overview/" class="md-nav__link">
2458 Overview
2459 </a>
2460 </li>
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470 <li class="md-nav__item">
2471 <a href="../part_1/" class="md-nav__link">
2472 Part 1
2473 </a>
2474 </li>
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484 <li class="md-nav__item">
2485 <a href="../part_2/" class="md-nav__link">
2486 Part 2
2487 </a>
2488 </li>
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498 <li class="md-nav__item">
2499 <a href="../part_3/" class="md-nav__link">
2500 Part 3
2501 </a>
2502 </li>
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512 <li class="md-nav__item">
2513 <a href="../part_4/" class="md-nav__link">
2514 Part 4
2515 </a>
2516 </li>
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528 <li class="md-nav__item md-nav__item--active">
2529
2530 <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
2531
2532
2533
2534
2535
2536 <label class="md-nav__link md-nav__link--active" for="__toc">
2537 Part 5
2538 <span class="md-nav__icon md-icon"></span>
2539 </label>
2540
2541 <a href="./" class="md-nav__link md-nav__link--active">
2542 Part 5
2543 </a>
2544
2545
2546
2547 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2548
2549
2550
2551
2552
2553
2554 <label class="md-nav__title" for="__toc">
2555 <span class="md-nav__icon md-icon"></span>
2556 Table of contents
2557 </label>
2558 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2559
2560 <li class="md-nav__item">
2561 <a href="#package-functionality" class="md-nav__link">
2562 Package Functionality
2563 </a>
2564
2565 </li>
2566
2567 <li class="md-nav__item">
2568 <a href="#used-components" class="md-nav__link">
2569 Used Components
2570 </a>
2571
2572 </li>
2573
2574 <li class="md-nav__item">
2575 <a href="#package-structure" class="md-nav__link">
2576 Package Structure
2577 </a>
2578
2579 </li>
2580
2581 <li class="md-nav__item">
2582 <a href="#miscellaneous" class="md-nav__link">
2583 Miscellaneous
2584 </a>
2585
2586 </li>
2587
2588 <li class="md-nav__item">
2589 <a href="#person-information-model" class="md-nav__link">
2590 Person Information Model
2591 </a>
2592
2593 </li>
2594
2595 <li class="md-nav__item">
2596 <a href="#listing-and-deleting-person-information" class="md-nav__link">
2597 Listing and Deleting Person Information
2598 </a>
2599
2600 </li>
2601
2602 <li class="md-nav__item">
2603 <a href="#creating-and-editing-person-information" class="md-nav__link">
2604 Creating and Editing Person Information
2605 </a>
2606
2607 </li>
2608
2609 <li class="md-nav__item">
2610 <a href="#rebuild-data-worker" class="md-nav__link">
2611 Rebuild Data Worker
2612 </a>
2613
2614 </li>
2615
2616 <li class="md-nav__item">
2617 <a href="#username-and-ip-address-event-listeners" class="md-nav__link">
2618 Username and IP Address Event Listeners
2619 </a>
2620
2621 </li>
2622
2623 </ul>
2624
2625 </nav>
2626
2627 </li>
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637 <li class="md-nav__item">
2638 <a href="../part_6/" class="md-nav__link">
2639 Part 6
2640 </a>
2641 </li>
2642
2643
2644
2645
2646 </ul>
2647 </nav>
2648 </li>
2649
2650
2651
2652
2653 </ul>
2654 </nav>
2655 </li>
2656
2657
2658
2659 </ul>
2660 </nav>
2661 </div>
2662 </div>
2663 </div>
2664
2665
2666
2667 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2668 <div class="md-sidebar__scrollwrap">
2669 <div class="md-sidebar__inner">
2670
2671
2672 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2673
2674
2675
2676
2677
2678
2679 <label class="md-nav__title" for="__toc">
2680 <span class="md-nav__icon md-icon"></span>
2681 Table of contents
2682 </label>
2683 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2684
2685 <li class="md-nav__item">
2686 <a href="#package-functionality" class="md-nav__link">
2687 Package Functionality
2688 </a>
2689
2690 </li>
2691
2692 <li class="md-nav__item">
2693 <a href="#used-components" class="md-nav__link">
2694 Used Components
2695 </a>
2696
2697 </li>
2698
2699 <li class="md-nav__item">
2700 <a href="#package-structure" class="md-nav__link">
2701 Package Structure
2702 </a>
2703
2704 </li>
2705
2706 <li class="md-nav__item">
2707 <a href="#miscellaneous" class="md-nav__link">
2708 Miscellaneous
2709 </a>
2710
2711 </li>
2712
2713 <li class="md-nav__item">
2714 <a href="#person-information-model" class="md-nav__link">
2715 Person Information Model
2716 </a>
2717
2718 </li>
2719
2720 <li class="md-nav__item">
2721 <a href="#listing-and-deleting-person-information" class="md-nav__link">
2722 Listing and Deleting Person Information
2723 </a>
2724
2725 </li>
2726
2727 <li class="md-nav__item">
2728 <a href="#creating-and-editing-person-information" class="md-nav__link">
2729 Creating and Editing Person Information
2730 </a>
2731
2732 </li>
2733
2734 <li class="md-nav__item">
2735 <a href="#rebuild-data-worker" class="md-nav__link">
2736 Rebuild Data Worker
2737 </a>
2738
2739 </li>
2740
2741 <li class="md-nav__item">
2742 <a href="#username-and-ip-address-event-listeners" class="md-nav__link">
2743 Username and IP Address Event Listeners
2744 </a>
2745
2746 </li>
2747
2748 </ul>
2749
2750 </nav>
2751 </div>
2752 </div>
2753 </div>
2754
2755
2756
2757 <div class="md-content" data-md-component="content">
2758 <article class="md-content__inner md-typeset">
2759
2760
2761
2762
2763
2764
2765
2766 <h1 id="part-5-person-information">Part 5: Person Information<a class="headerlink" href="#part-5-person-information" title="Permanent link">#</a></h1>
2767 <p>This part of our tutorial series lays the foundation for future parts in which we will be using additional APIs, which we have not used in this series yet.
2768 To make use of those APIs, we need content generated by users in the frontend.</p>
2769 <h2 id="package-functionality">Package Functionality<a class="headerlink" href="#package-functionality" title="Permanent link">#</a></h2>
2770 <p>In addition to the existing functions from <a href="../part_4/">part 4</a>, the package will provide the following functionality after this part of the tutorial:</p>
2771 <ul>
2772 <li>Users are able to add information on the people in the frontend.</li>
2773 <li>Users are able to edit and delete the pieces of information they added.</li>
2774 <li>Moderators are able to edit and delete all pieces of information.</li>
2775 </ul>
2776 <h2 id="used-components">Used Components<a class="headerlink" href="#used-components" title="Permanent link">#</a></h2>
2777 <p>In addition to the components used in previous parts, we will use the <a href="../../../php/api/form_builder/overview/">form builder API</a> to create forms shown in dialogs instead of dedicated pages and we will, for the first time, add <a href="../../../javascript/typescript/">TypeScript code</a>.</p>
2778 <h2 id="package-structure">Package Structure<a class="headerlink" href="#package-structure" title="Permanent link">#</a></h2>
2779 <p>The package will have the following file structure <em>excluding</em> unchanged files from previous parts:</p>
2780 <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
2781 <span class="normal"> 2</span>
2782 <span class="normal"> 3</span>
2783 <span class="normal"> 4</span>
2784 <span class="normal"> 5</span>
2785 <span class="normal"> 6</span>
2786 <span class="normal"> 7</span>
2787 <span class="normal"> 8</span>
2788 <span class="normal"> 9</span>
2789 <span class="normal">10</span>
2790 <span class="normal">11</span>
2791 <span class="normal">12</span>
2792 <span class="normal">13</span>
2793 <span class="normal">14</span>
2794 <span class="normal">15</span>
2795 <span class="normal">16</span>
2796 <span class="normal">17</span>
2797 <span class="normal">18</span>
2798 <span class="normal">19</span>
2799 <span class="normal">20</span>
2800 <span class="normal">21</span>
2801 <span class="normal">22</span>
2802 <span class="normal">23</span>
2803 <span class="normal">24</span>
2804 <span class="normal">25</span>
2805 <span class="normal">26</span>
2806 <span class="normal">27</span>
2807 <span class="normal">28</span>
2808 <span class="normal">29</span>
2809 <span class="normal">30</span>
2810 <span class="normal">31</span>
2811 <span class="normal">32</span>
2812 <span class="normal">33</span>
2813 <span class="normal">34</span></pre></div></td><td class="code"><div><pre><span></span><code>├── files
2814 │ ├── acp
2815 │ │ └── database
2816 │ │ └── install_com.woltlab.wcf.people.php
2817 │ ├── js
2818 │ │ └── WoltLabSuite
2819 │ │ └── Core
2820 │ │ └── Controller
2821 │ │ └── Person.js
2822 │ └── lib
2823 │ ├── data
2824 │ │ └── person
2825 │ │ ├── Person.class.php
2826 │ │ └── information
2827 │ │ ├── PersonInformation.class.php
2828 │ │ ├── PersonInformationAction.class.php
2829 │ │ ├── PersonInformationEditor.class.php
2830 │ │ └── PersonInformationList.class.php
2831 │ └── system
2832 │ └── worker
2833 │ └── PersonRebuildDataWorker.class.php
2834 ├── language
2835 │ ├── de.xml
2836 │ └── en.xml
2837 ├── objectType.xml
2838 ├── templates
2839 │ ├── person.tpl
2840 │ └── personList.tpl
2841 ├── ts
2842 │ └── WoltLabSuite
2843 │ └── Core
2844 │ └── Controller
2845 │ └── Person.ts
2846 └── userGroupOption.xml
2847 </code></pre></div></td></tr></table></div>
2848 <p>For all changes, please refer to the <a href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5">source code on GitHub</a>.</p>
2849 <h2 id="miscellaneous">Miscellaneous<a class="headerlink" href="#miscellaneous" title="Permanent link">#</a></h2>
2850 <p>Before we focus on the main aspects of this part, we mention some minor aspects that will be used later on:</p>
2851 <ul>
2852 <li>Several new user group options and the relevant language items have been added related to creating, editing, and deleting information:<ul>
2853 <li><code>mod.person.canEditInformation</code> and <code>mod.person.canDeleteInformation</code> are moderative permissions to edit and delete any piece of information, regardless of who created it.</li>
2854 <li><code>user.person.canAddInformation</code> is the permission for users to add new pieces of information.</li>
2855 <li><code>user.person.canEditInformation</code> and <code>user.person.canDeleteInformation</code> are the user permissions to edit and the piece of information they created.</li>
2856 </ul>
2857 </li>
2858 <li>The actual information text will be entered via a WYSIWYG editor, which requires an object type of the definition <code>com.woltlab.wcf.message</code>: <code>com.woltlab.wcf.people.information</code>.</li>
2859 <li><code>personList.tpl</code> has been adjusted to show the number of pieces of information in the person statistics section.</li>
2860 <li>We have not updated the person list box to also support sorting by the number of pieces of information added for each person.</li>
2861 </ul>
2862 <h2 id="person-information-model">Person Information Model<a class="headerlink" href="#person-information-model" title="Permanent link">#</a></h2>
2863 <p>The PHP file with the database layout has been updated as follows:</p>
2864 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/acp/database/install_com.woltlab.wcf.people.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/acp/database/install_com.woltlab.wcf.people.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
2865 <span class="normal"> 2</span>
2866 <span class="normal"> 3</span>
2867 <span class="normal"> 4</span>
2868 <span class="normal"> 5</span>
2869 <span class="normal"> 6</span>
2870 <span class="normal"> 7</span>
2871 <span class="normal"> 8</span>
2872 <span class="normal"> 9</span>
2873 <span class="normal">10</span>
2874 <span class="normal">11</span>
2875 <span class="normal">12</span>
2876 <span class="normal">13</span>
2877 <span class="normal">14</span>
2878 <span class="normal">15</span>
2879 <span class="normal">16</span>
2880 <span class="normal">17</span>
2881 <span class="normal">18</span>
2882 <span class="normal">19</span>
2883 <span class="normal">20</span>
2884 <span class="normal">21</span>
2885 <span class="normal">22</span>
2886 <span class="normal">23</span>
2887 <span class="normal">24</span>
2888 <span class="normal">25</span>
2889 <span class="normal">26</span>
2890 <span class="normal">27</span>
2891 <span class="normal">28</span>
2892 <span class="normal">29</span>
2893 <span class="normal">30</span>
2894 <span class="normal">31</span>
2895 <span class="normal">32</span>
2896 <span class="normal">33</span>
2897 <span class="normal">34</span>
2898 <span class="normal">35</span>
2899 <span class="normal">36</span>
2900 <span class="normal">37</span>
2901 <span class="normal">38</span>
2902 <span class="normal">39</span>
2903 <span class="normal">40</span>
2904 <span class="normal">41</span>
2905 <span class="normal">42</span>
2906 <span class="normal">43</span>
2907 <span class="normal">44</span>
2908 <span class="normal">45</span>
2909 <span class="normal">46</span>
2910 <span class="normal">47</span>
2911 <span class="normal">48</span>
2912 <span class="normal">49</span>
2913 <span class="normal">50</span>
2914 <span class="normal">51</span>
2915 <span class="normal">52</span>
2916 <span class="normal">53</span>
2917 <span class="normal">54</span>
2918 <span class="normal">55</span>
2919 <span class="normal">56</span>
2920 <span class="normal">57</span>
2921 <span class="normal">58</span>
2922 <span class="normal">59</span>
2923 <span class="normal">60</span>
2924 <span class="normal">61</span>
2925 <span class="normal">62</span>
2926 <span class="normal">63</span>
2927 <span class="normal">64</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2928
2929 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\DefaultTrueBooleanDatabaseTableColumn</span><span class="p">;</span>
2930 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\IntDatabaseTableColumn</span><span class="p">;</span>
2931 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\NotNullInt10DatabaseTableColumn</span><span class="p">;</span>
2932 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\NotNullVarchar255DatabaseTableColumn</span><span class="p">;</span>
2933 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\ObjectIdDatabaseTableColumn</span><span class="p">;</span>
2934 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\SmallintDatabaseTableColumn</span><span class="p">;</span>
2935 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\TextDatabaseTableColumn</span><span class="p">;</span>
2936 <span class="k">use</span> <span class="nx">wcf\system\database\table\column\VarcharDatabaseTableColumn</span><span class="p">;</span>
2937 <span class="k">use</span> <span class="nx">wcf\system\database\table\DatabaseTable</span><span class="p">;</span>
2938 <span class="k">use</span> <span class="nx">wcf\system\database\table\index\DatabaseTableForeignKey</span><span class="p">;</span>
2939 <span class="k">use</span> <span class="nx">wcf\system\database\table\index\DatabaseTablePrimaryIndex</span><span class="p">;</span>
2940
2941 <span class="k">return</span> <span class="p">[</span>
2942 <span class="nx">DatabaseTable</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;wcf1_person&#39;</span><span class="p">)</span>
2943 <span class="o">-&gt;</span><span class="na">columns</span><span class="p">([</span>
2944 <span class="nx">ObjectIdDatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;personID&#39;</span><span class="p">),</span>
2945 <span class="nx">NotNullVarchar255DatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;firstName&#39;</span><span class="p">),</span>
2946 <span class="nx">NotNullVarchar255DatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;lastName&#39;</span><span class="p">),</span>
2947 <span class="nx">NotNullInt10DatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;informationCount&#39;</span><span class="p">)</span>
2948 <span class="o">-&gt;</span><span class="na">defaultValue</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
2949 <span class="nx">SmallintDatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;comments&#39;</span><span class="p">)</span>
2950 <span class="o">-&gt;</span><span class="na">length</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
2951 <span class="o">-&gt;</span><span class="na">notNull</span><span class="p">()</span>
2952 <span class="o">-&gt;</span><span class="na">defaultValue</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
2953 <span class="nx">DefaultTrueBooleanDatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;enableComments&#39;</span><span class="p">),</span>
2954 <span class="p">])</span>
2955 <span class="o">-&gt;</span><span class="na">indices</span><span class="p">([</span>
2956 <span class="nx">DatabaseTablePrimaryIndex</span><span class="o">::</span><span class="na">create</span><span class="p">()</span>
2957 <span class="o">-&gt;</span><span class="na">columns</span><span class="p">([</span><span class="s1">&#39;personID&#39;</span><span class="p">]),</span>
2958 <span class="p">]),</span>
2959
2960 <span class="nx">DatabaseTable</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;wcf1_person_information&#39;</span><span class="p">)</span>
2961 <span class="o">-&gt;</span><span class="na">columns</span><span class="p">([</span>
2962 <span class="nx">ObjectIdDatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;informationID&#39;</span><span class="p">),</span>
2963 <span class="nx">NotNullInt10DatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;personID&#39;</span><span class="p">),</span>
2964 <span class="nx">TextDatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;information&#39;</span><span class="p">),</span>
2965 <span class="nx">IntDatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;userID&#39;</span><span class="p">)</span>
2966 <span class="o">-&gt;</span><span class="na">length</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span>
2967 <span class="nx">NotNullVarchar255DatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;username&#39;</span><span class="p">),</span>
2968 <span class="nx">VarcharDatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;ipAddress&#39;</span><span class="p">)</span>
2969 <span class="o">-&gt;</span><span class="na">length</span><span class="p">(</span><span class="mi">39</span><span class="p">)</span>
2970 <span class="o">-&gt;</span><span class="na">notNull</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
2971 <span class="o">-&gt;</span><span class="na">defaultValue</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
2972 <span class="nx">NotNullInt10DatabaseTableColumn</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;time&#39;</span><span class="p">),</span>
2973 <span class="p">])</span>
2974 <span class="o">-&gt;</span><span class="na">indices</span><span class="p">([</span>
2975 <span class="nx">DatabaseTablePrimaryIndex</span><span class="o">::</span><span class="na">create</span><span class="p">()</span>
2976 <span class="o">-&gt;</span><span class="na">columns</span><span class="p">([</span><span class="s1">&#39;informationID&#39;</span><span class="p">]),</span>
2977 <span class="p">])</span>
2978 <span class="o">-&gt;</span><span class="na">foreignKeys</span><span class="p">([</span>
2979 <span class="nx">DatabaseTableForeignKey</span><span class="o">::</span><span class="na">create</span><span class="p">()</span>
2980 <span class="o">-&gt;</span><span class="na">columns</span><span class="p">([</span><span class="s1">&#39;personID&#39;</span><span class="p">])</span>
2981 <span class="o">-&gt;</span><span class="na">referencedTable</span><span class="p">(</span><span class="s1">&#39;wcf1_person&#39;</span><span class="p">)</span>
2982 <span class="o">-&gt;</span><span class="na">referencedColumns</span><span class="p">([</span><span class="s1">&#39;personID&#39;</span><span class="p">])</span>
2983 <span class="o">-&gt;</span><span class="na">onDelete</span><span class="p">(</span><span class="s1">&#39;CASCADE&#39;</span><span class="p">),</span>
2984 <span class="nx">DatabaseTableForeignKey</span><span class="o">::</span><span class="na">create</span><span class="p">()</span>
2985 <span class="o">-&gt;</span><span class="na">columns</span><span class="p">([</span><span class="s1">&#39;userID&#39;</span><span class="p">])</span>
2986 <span class="o">-&gt;</span><span class="na">referencedTable</span><span class="p">(</span><span class="s1">&#39;wcf1_user&#39;</span><span class="p">)</span>
2987 <span class="o">-&gt;</span><span class="na">referencedColumns</span><span class="p">([</span><span class="s1">&#39;userID&#39;</span><span class="p">])</span>
2988 <span class="o">-&gt;</span><span class="na">onDelete</span><span class="p">(</span><span class="s1">&#39;SET NULL&#39;</span><span class="p">),</span>
2989 <span class="p">]),</span>
2990 <span class="p">];</span>
2991 </code></pre></div></td></tr></table></div>
2992 <ul>
2993 <li>The number of pieces of information per person is tracked via the new <code>informationCount</code> column.</li>
2994 <li>The <code>wcf1_person_information</code> table has been added for the <code>PersonInformation</code> model.
2995 The meaning of the different columns is explained in the property documentation part of <code>PersonInformation</code>'s documentation (see below).
2996 The two foreign keys ensure that if a person is deleted, all of their information is also deleted, and that if a user is deleted, the <code>userID</code> column is set to <code>NULL</code>.</li>
2997 </ul>
2998 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/data/person/information/PersonInformation.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/data/person/information/PersonInformation.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
2999 <span class="normal"> 2</span>
3000 <span class="normal"> 3</span>
3001 <span class="normal"> 4</span>
3002 <span class="normal"> 5</span>
3003 <span class="normal"> 6</span>
3004 <span class="normal"> 7</span>
3005 <span class="normal"> 8</span>
3006 <span class="normal"> 9</span>
3007 <span class="normal">10</span>
3008 <span class="normal">11</span>
3009 <span class="normal">12</span>
3010 <span class="normal">13</span>
3011 <span class="normal">14</span>
3012 <span class="normal">15</span>
3013 <span class="normal">16</span>
3014 <span class="normal">17</span>
3015 <span class="normal">18</span>
3016 <span class="normal">19</span>
3017 <span class="normal">20</span>
3018 <span class="normal">21</span>
3019 <span class="normal">22</span>
3020 <span class="normal">23</span>
3021 <span class="normal">24</span>
3022 <span class="normal">25</span>
3023 <span class="normal">26</span>
3024 <span class="normal">27</span>
3025 <span class="normal">28</span>
3026 <span class="normal">29</span>
3027 <span class="normal">30</span>
3028 <span class="normal">31</span>
3029 <span class="normal">32</span>
3030 <span class="normal">33</span>
3031 <span class="normal">34</span>
3032 <span class="normal">35</span>
3033 <span class="normal">36</span>
3034 <span class="normal">37</span>
3035 <span class="normal">38</span>
3036 <span class="normal">39</span>
3037 <span class="normal">40</span>
3038 <span class="normal">41</span>
3039 <span class="normal">42</span>
3040 <span class="normal">43</span>
3041 <span class="normal">44</span>
3042 <span class="normal">45</span>
3043 <span class="normal">46</span>
3044 <span class="normal">47</span>
3045 <span class="normal">48</span>
3046 <span class="normal">49</span>
3047 <span class="normal">50</span>
3048 <span class="normal">51</span>
3049 <span class="normal">52</span>
3050 <span class="normal">53</span>
3051 <span class="normal">54</span>
3052 <span class="normal">55</span>
3053 <span class="normal">56</span>
3054 <span class="normal">57</span>
3055 <span class="normal">58</span>
3056 <span class="normal">59</span>
3057 <span class="normal">60</span>
3058 <span class="normal">61</span>
3059 <span class="normal">62</span>
3060 <span class="normal">63</span>
3061 <span class="normal">64</span>
3062 <span class="normal">65</span>
3063 <span class="normal">66</span>
3064 <span class="normal">67</span>
3065 <span class="normal">68</span>
3066 <span class="normal">69</span>
3067 <span class="normal">70</span>
3068 <span class="normal">71</span>
3069 <span class="normal">72</span>
3070 <span class="normal">73</span>
3071 <span class="normal">74</span>
3072 <span class="normal">75</span>
3073 <span class="normal">76</span>
3074 <span class="normal">77</span>
3075 <span class="normal">78</span>
3076 <span class="normal">79</span>
3077 <span class="normal">80</span>
3078 <span class="normal">81</span>
3079 <span class="normal">82</span>
3080 <span class="normal">83</span>
3081 <span class="normal">84</span>
3082 <span class="normal">85</span>
3083 <span class="normal">86</span>
3084 <span class="normal">87</span>
3085 <span class="normal">88</span>
3086 <span class="normal">89</span>
3087 <span class="normal">90</span>
3088 <span class="normal">91</span>
3089 <span class="normal">92</span>
3090 <span class="normal">93</span>
3091 <span class="normal">94</span>
3092 <span class="normal">95</span>
3093 <span class="normal">96</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
3094
3095 <span class="k">namespace</span> <span class="nx">wcf\data\person\information</span><span class="p">;</span>
3096
3097 <span class="k">use</span> <span class="nx">wcf\data\DatabaseObject</span><span class="p">;</span>
3098 <span class="k">use</span> <span class="nx">wcf\data\person\Person</span><span class="p">;</span>
3099 <span class="k">use</span> <span class="nx">wcf\data\user\UserProfile</span><span class="p">;</span>
3100 <span class="k">use</span> <span class="nx">wcf\system\cache\runtime\PersonRuntimeCache</span><span class="p">;</span>
3101 <span class="k">use</span> <span class="nx">wcf\system\cache\runtime\UserProfileRuntimeCache</span><span class="p">;</span>
3102 <span class="k">use</span> <span class="nx">wcf\system\html\output\HtmlOutputProcessor</span><span class="p">;</span>
3103 <span class="k">use</span> <span class="nx">wcf\system\WCF</span><span class="p">;</span>
3104
3105 <span class="sd">/**</span>
3106 <span class="sd"> * Represents a piece of information for a person.</span>
3107 <span class="sd"> *</span>
3108 <span class="sd"> * @author Matthias Schmidt</span>
3109 <span class="sd"> * @copyright 2001-2021 WoltLab GmbH</span>
3110 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
3111 <span class="sd"> * @package WoltLabSuite\Core\Data\Person\Information</span>
3112 <span class="sd"> *</span>
3113 <span class="sd"> * @property-read int $informationID unique id of the information</span>
3114 <span class="sd"> * @property-read int $personID id of the person the information belongs to</span>
3115 <span class="sd"> * @property-read string $information information text</span>
3116 <span class="sd"> * @property-read int|null $userID id of the user who added the information or `null` if the user no longer exists</span>
3117 <span class="sd"> * @property-read string $username name of the user who added the information</span>
3118 <span class="sd"> * @property-read int $time timestamp at which the information was created</span>
3119 <span class="sd"> */</span>
3120 <span class="k">class</span> <span class="nc">PersonInformation</span> <span class="k">extends</span> <span class="nx">DatabaseObject</span>
3121 <span class="p">{</span>
3122 <span class="sd">/**</span>
3123 <span class="sd"> * Returns `true` if the active user can delete this piece of information and `false` otherwise.</span>
3124 <span class="sd"> */</span>
3125 <span class="k">public</span> <span class="k">function</span> <span class="nf">canDelete</span><span class="p">()</span><span class="o">:</span> <span class="nx">bool</span>
3126 <span class="p">{</span>
3127 <span class="k">if</span> <span class="p">(</span>
3128 <span class="nx">WCF</span><span class="o">::</span><span class="na">getUser</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">userID</span>
3129 <span class="o">&amp;&amp;</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getUser</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">userID</span> <span class="o">==</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">userID</span>
3130 <span class="o">&amp;&amp;</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getPermission</span><span class="p">(</span><span class="s1">&#39;user.person.canDeleteInformation&#39;</span><span class="p">)</span>
3131 <span class="p">)</span> <span class="p">{</span>
3132 <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
3133 <span class="p">}</span>
3134
3135 <span class="k">return</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getPermission</span><span class="p">(</span><span class="s1">&#39;mod.person.canDeleteInformation&#39;</span><span class="p">);</span>
3136 <span class="p">}</span>
3137
3138 <span class="sd">/**</span>
3139 <span class="sd"> * Returns `true` if the active user can edit this piece of information and `false` otherwise.</span>
3140 <span class="sd"> */</span>
3141 <span class="k">public</span> <span class="k">function</span> <span class="nf">canEdit</span><span class="p">()</span><span class="o">:</span> <span class="nx">bool</span>
3142 <span class="p">{</span>
3143 <span class="k">if</span> <span class="p">(</span>
3144 <span class="nx">WCF</span><span class="o">::</span><span class="na">getUser</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">userID</span>
3145 <span class="o">&amp;&amp;</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getUser</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">userID</span> <span class="o">==</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">userID</span>
3146 <span class="o">&amp;&amp;</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getPermission</span><span class="p">(</span><span class="s1">&#39;user.person.canEditInformation&#39;</span><span class="p">)</span>
3147 <span class="p">)</span> <span class="p">{</span>
3148 <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
3149 <span class="p">}</span>
3150
3151 <span class="k">return</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getPermission</span><span class="p">(</span><span class="s1">&#39;mod.person.canEditInformation&#39;</span><span class="p">);</span>
3152 <span class="p">}</span>
3153
3154 <span class="sd">/**</span>
3155 <span class="sd"> * Returns the formatted information.</span>
3156 <span class="sd"> */</span>
3157 <span class="k">public</span> <span class="k">function</span> <span class="nf">getFormattedInformation</span><span class="p">()</span><span class="o">:</span> <span class="nx">string</span>
3158 <span class="p">{</span>
3159 <span class="nv">$processor</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">HtmlOutputProcessor</span><span class="p">();</span>
3160 <span class="nv">$processor</span><span class="o">-&gt;</span><span class="na">process</span><span class="p">(</span>
3161 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="p">,</span>
3162 <span class="s1">&#39;com.woltlab.wcf.people.information&#39;</span><span class="p">,</span>
3163 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">informationID</span>
3164 <span class="p">);</span>
3165
3166 <span class="k">return</span> <span class="nv">$processor</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">();</span>
3167 <span class="p">}</span>
3168
3169 <span class="sd">/**</span>
3170 <span class="sd"> * Returns the person the information belongs to.</span>
3171 <span class="sd"> */</span>
3172 <span class="k">public</span> <span class="k">function</span> <span class="nf">getPerson</span><span class="p">()</span><span class="o">:</span> <span class="nx">Person</span>
3173 <span class="p">{</span>
3174 <span class="k">return</span> <span class="nx">PersonRuntimeCache</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getObject</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">);</span>
3175 <span class="p">}</span>
3176
3177 <span class="sd">/**</span>
3178 <span class="sd"> * Returns the user profile of the user who added the information.</span>
3179 <span class="sd"> */</span>
3180 <span class="k">public</span> <span class="k">function</span> <span class="nf">getUserProfile</span><span class="p">()</span><span class="o">:</span> <span class="nx">UserProfile</span>
3181 <span class="p">{</span>
3182 <span class="k">if</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">userID</span><span class="p">)</span> <span class="p">{</span>
3183 <span class="k">return</span> <span class="nx">UserProfileRuntimeCache</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getObject</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">userID</span><span class="p">);</span>
3184 <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
3185 <span class="k">return</span> <span class="nx">UserProfile</span><span class="o">::</span><span class="na">getGuestUserProfile</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">username</span><span class="p">);</span>
3186 <span class="p">}</span>
3187 <span class="p">}</span>
3188 <span class="p">}</span>
3189 </code></pre></div></td></tr></table></div>
3190 <p><code>PersonInformation</code> provides two methods, <code>canDelete()</code> and <code>canEdit()</code>, to check whether the active user can delete or edit a specific piece of information.
3191 In both cases, it is checked if the current user has created the relevant piece of information to check the user-specific permissions or to fall back to the moderator-specific permissions.</p>
3192 <p>There also two getter methods for the person, the piece of information belongs to (<code>getPerson()</code>), and for the user profile of the user who created the information (<code>getUserProfile()</code>).
3193 In both cases, we use runtime caches, though in <code>getUserProfile()</code>, we also have to consider the case of the user who created the information being deleted, i.e. <code>userID</code> being <code>null</code>.
3194 For such a case, we also save the name of the user who created the information in <code>username</code>, so that we can return a guest user profile object in this case.
3195 The most interesting method is <code>getFormattedInformation()</code>, which returns the HTML code of the information text meant for output.
3196 To generate such an output, <code>HtmlOutputProcessor::process()</code> is used and here is where we first use the associated message object type <code>com.woltlab.wcf.people.information</code> mentioned <a href="#miscellaneous">before</a>.</p>
3197 <p>While <code>PersonInformationEditor</code> is simply the default implementation and thus not explicitly shown here, <code>PersonInformationList::readObjects()</code> caches the relevant ids of the associated people and users who created the pieces of information using runtime caches:</p>
3198 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/data/person/information/PersonInformationList.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/data/person/information/PersonInformationList.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
3199 <span class="normal"> 2</span>
3200 <span class="normal"> 3</span>
3201 <span class="normal"> 4</span>
3202 <span class="normal"> 5</span>
3203 <span class="normal"> 6</span>
3204 <span class="normal"> 7</span>
3205 <span class="normal"> 8</span>
3206 <span class="normal"> 9</span>
3207 <span class="normal">10</span>
3208 <span class="normal">11</span>
3209 <span class="normal">12</span>
3210 <span class="normal">13</span>
3211 <span class="normal">14</span>
3212 <span class="normal">15</span>
3213 <span class="normal">16</span>
3214 <span class="normal">17</span>
3215 <span class="normal">18</span>
3216 <span class="normal">19</span>
3217 <span class="normal">20</span>
3218 <span class="normal">21</span>
3219 <span class="normal">22</span>
3220 <span class="normal">23</span>
3221 <span class="normal">24</span>
3222 <span class="normal">25</span>
3223 <span class="normal">26</span>
3224 <span class="normal">27</span>
3225 <span class="normal">28</span>
3226 <span class="normal">29</span>
3227 <span class="normal">30</span>
3228 <span class="normal">31</span>
3229 <span class="normal">32</span>
3230 <span class="normal">33</span>
3231 <span class="normal">34</span>
3232 <span class="normal">35</span>
3233 <span class="normal">36</span>
3234 <span class="normal">37</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
3235
3236 <span class="k">namespace</span> <span class="nx">wcf\data\person\information</span><span class="p">;</span>
3237
3238 <span class="k">use</span> <span class="nx">wcf\data\DatabaseObjectList</span><span class="p">;</span>
3239 <span class="k">use</span> <span class="nx">wcf\system\cache\runtime\PersonRuntimeCache</span><span class="p">;</span>
3240 <span class="k">use</span> <span class="nx">wcf\system\cache\runtime\UserProfileRuntimeCache</span><span class="p">;</span>
3241
3242 <span class="sd">/**</span>
3243 <span class="sd"> * Represents a list of person information.</span>
3244 <span class="sd"> *</span>
3245 <span class="sd"> * @author Matthias Schmidt</span>
3246 <span class="sd"> * @copyright 2001-2021 WoltLab GmbH</span>
3247 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
3248 <span class="sd"> * @package WoltLabSuite\Core\Data\PersonInformation</span>
3249 <span class="sd"> *</span>
3250 <span class="sd"> * @method PersonInformation current()</span>
3251 <span class="sd"> * @method PersonInformation[] getObjects()</span>
3252 <span class="sd"> * @method PersonInformation|null search($objectID)</span>
3253 <span class="sd"> * @property PersonInformation[] $objects</span>
3254 <span class="sd"> */</span>
3255 <span class="k">class</span> <span class="nc">PersonInformationList</span> <span class="k">extends</span> <span class="nx">DatabaseObjectList</span>
3256 <span class="p">{</span>
3257 <span class="k">public</span> <span class="k">function</span> <span class="nf">readObjects</span><span class="p">()</span>
3258 <span class="p">{</span>
3259 <span class="k">parent</span><span class="o">::</span><span class="na">readObjects</span><span class="p">();</span>
3260
3261 <span class="nx">UserProfileRuntimeCache</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">cacheObjectIDs</span><span class="p">(</span><span class="nx">\array_unique</span><span class="p">(</span><span class="nx">\array_filter</span><span class="p">(</span><span class="nx">\array_column</span><span class="p">(</span>
3262 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objects</span><span class="p">,</span>
3263 <span class="s1">&#39;userID&#39;</span>
3264 <span class="p">))));</span>
3265 <span class="nx">PersonRuntimeCache</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">cacheObjectIDs</span><span class="p">(</span><span class="nx">\array_unique</span><span class="p">(</span><span class="nx">\array_column</span><span class="p">(</span>
3266 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objects</span><span class="p">,</span>
3267 <span class="s1">&#39;personID&#39;</span>
3268 <span class="p">)));</span>
3269 <span class="p">}</span>
3270 <span class="p">}</span>
3271 </code></pre></div></td></tr></table></div>
3272 <h2 id="listing-and-deleting-person-information">Listing and Deleting Person Information<a class="headerlink" href="#listing-and-deleting-person-information" title="Permanent link">#</a></h2>
3273 <p>The <code>person.tpl</code> template has been updated to include a block for listing the information at the beginning:</p>
3274 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">templates/person.tpl <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/templates/person.tpl" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
3275 <span class="normal"> 2</span>
3276 <span class="normal"> 3</span>
3277 <span class="normal"> 4</span>
3278 <span class="normal"> 5</span>
3279 <span class="normal"> 6</span>
3280 <span class="normal"> 7</span>
3281 <span class="normal"> 8</span>
3282 <span class="normal"> 9</span>
3283 <span class="normal"> 10</span>
3284 <span class="normal"> 11</span>
3285 <span class="normal"> 12</span>
3286 <span class="normal"> 13</span>
3287 <span class="normal"> 14</span>
3288 <span class="normal"> 15</span>
3289 <span class="normal"> 16</span>
3290 <span class="normal"> 17</span>
3291 <span class="normal"> 18</span>
3292 <span class="normal"> 19</span>
3293 <span class="normal"> 20</span>
3294 <span class="normal"> 21</span>
3295 <span class="normal"> 22</span>
3296 <span class="normal"> 23</span>
3297 <span class="normal"> 24</span>
3298 <span class="normal"> 25</span>
3299 <span class="normal"> 26</span>
3300 <span class="normal"> 27</span>
3301 <span class="normal"> 28</span>
3302 <span class="normal"> 29</span>
3303 <span class="normal"> 30</span>
3304 <span class="normal"> 31</span>
3305 <span class="normal"> 32</span>
3306 <span class="normal"> 33</span>
3307 <span class="normal"> 34</span>
3308 <span class="normal"> 35</span>
3309 <span class="normal"> 36</span>
3310 <span class="normal"> 37</span>
3311 <span class="normal"> 38</span>
3312 <span class="normal"> 39</span>
3313 <span class="normal"> 40</span>
3314 <span class="normal"> 41</span>
3315 <span class="normal"> 42</span>
3316 <span class="normal"> 43</span>
3317 <span class="normal"> 44</span>
3318 <span class="normal"> 45</span>
3319 <span class="normal"> 46</span>
3320 <span class="normal"> 47</span>
3321 <span class="normal"> 48</span>
3322 <span class="normal"> 49</span>
3323 <span class="normal"> 50</span>
3324 <span class="normal"> 51</span>
3325 <span class="normal"> 52</span>
3326 <span class="normal"> 53</span>
3327 <span class="normal"> 54</span>
3328 <span class="normal"> 55</span>
3329 <span class="normal"> 56</span>
3330 <span class="normal"> 57</span>
3331 <span class="normal"> 58</span>
3332 <span class="normal"> 59</span>
3333 <span class="normal"> 60</span>
3334 <span class="normal"> 61</span>
3335 <span class="normal"> 62</span>
3336 <span class="normal"> 63</span>
3337 <span class="normal"> 64</span>
3338 <span class="normal"> 65</span>
3339 <span class="normal"> 66</span>
3340 <span class="normal"> 67</span>
3341 <span class="normal"> 68</span>
3342 <span class="normal"> 69</span>
3343 <span class="normal"> 70</span>
3344 <span class="normal"> 71</span>
3345 <span class="normal"> 72</span>
3346 <span class="normal"> 73</span>
3347 <span class="normal"> 74</span>
3348 <span class="normal"> 75</span>
3349 <span class="normal"> 76</span>
3350 <span class="normal"> 77</span>
3351 <span class="normal"> 78</span>
3352 <span class="normal"> 79</span>
3353 <span class="normal"> 80</span>
3354 <span class="normal"> 81</span>
3355 <span class="normal"> 82</span>
3356 <span class="normal"> 83</span>
3357 <span class="normal"> 84</span>
3358 <span class="normal"> 85</span>
3359 <span class="normal"> 86</span>
3360 <span class="normal"> 87</span>
3361 <span class="normal"> 88</span>
3362 <span class="normal"> 89</span>
3363 <span class="normal"> 90</span>
3364 <span class="normal"> 91</span>
3365 <span class="normal"> 92</span>
3366 <span class="normal"> 93</span>
3367 <span class="normal"> 94</span>
3368 <span class="normal"> 95</span>
3369 <span class="normal"> 96</span>
3370 <span class="normal"> 97</span>
3371 <span class="normal"> 98</span>
3372 <span class="normal"> 99</span>
3373 <span class="normal">100</span>
3374 <span class="normal">101</span>
3375 <span class="normal">102</span>
3376 <span class="normal">103</span>
3377 <span class="normal">104</span>
3378 <span class="normal">105</span>
3379 <span class="normal">106</span>
3380 <span class="normal">107</span>
3381 <span class="normal">108</span>
3382 <span class="normal">109</span>
3383 <span class="normal">110</span>
3384 <span class="normal">111</span>
3385 <span class="normal">112</span>
3386 <span class="normal">113</span>
3387 <span class="normal">114</span>
3388 <span class="normal">115</span>
3389 <span class="normal">116</span>
3390 <span class="normal">117</span>
3391 <span class="normal">118</span>
3392 <span class="normal">119</span>
3393 <span class="normal">120</span>
3394 <span class="normal">121</span>
3395 <span class="normal">122</span>
3396 <span class="normal">123</span>
3397 <span class="normal">124</span>
3398 <span class="normal">125</span>
3399 <span class="normal">126</span>
3400 <span class="normal">127</span>
3401 <span class="normal">128</span>
3402 <span class="normal">129</span>
3403 <span class="normal">130</span>
3404 <span class="normal">131</span>
3405 <span class="normal">132</span>
3406 <span class="normal">133</span>
3407 <span class="normal">134</span>
3408 <span class="normal">135</span>
3409 <span class="normal">136</span>
3410 <span class="normal">137</span>
3411 <span class="normal">138</span>
3412 <span class="normal">139</span>
3413 <span class="normal">140</span>
3414 <span class="normal">141</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="cp">{</span><span class="nf">capture</span> <span class="na">assign</span><span class="o">=</span><span class="s1">&#39;pageTitle&#39;</span><span class="cp">}{</span><span class="nv">$person</span><span class="cp">}</span><span class="x"> - </span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.person.list</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}{</span><span class="nf">/capture</span><span class="cp">}</span>
3415
3416 <span class="cp">{</span><span class="nf">capture</span> <span class="na">assign</span><span class="o">=</span><span class="s1">&#39;contentTitle&#39;</span><span class="cp">}{</span><span class="nv">$person</span><span class="cp">}{</span><span class="nf">/capture</span><span class="cp">}</span>
3417
3418 <span class="cp">{</span><span class="nf">include</span> <span class="na">file</span><span class="o">=</span><span class="s1">&#39;header&#39;</span><span class="cp">}</span>
3419
3420 <span class="cp">{</span><span class="nf">if</span> <span class="nv">$person</span><span class="o">-&gt;</span><span class="na">informationCount</span> <span class="o">||</span> <span class="nv">$__wcf</span><span class="o">-&gt;</span><span class="na">session</span><span class="o">-&gt;</span><span class="na">getPermission</span><span class="o">(</span><span class="s1">&#39;user.person.canAddInformation&#39;</span><span class="o">)</span><span class="cp">}</span>
3421 <span class="x"> &lt;section class=&quot;section sectionContainerList&quot;&gt;</span>
3422 <span class="x"> &lt;header class=&quot;sectionHeader&quot;&gt;</span>
3423 <span class="x"> &lt;h2 class=&quot;sectionTitle&quot;&gt;</span>
3424 <span class="x"> </span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.person.information.list</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span>
3425 <span class="x"> </span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$person</span><span class="o">-&gt;</span><span class="na">informationCount</span><span class="cp">}</span>
3426 <span class="x"> &lt;span class=&quot;badge&quot;&gt;</span><span class="cp">{</span><span class="err">#</span><span class="nv">$person</span><span class="o">-&gt;</span><span class="na">informationCount</span><span class="cp">}</span><span class="x">&lt;/span&gt;</span>
3427 <span class="x"> </span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3428 <span class="x"> &lt;/h2&gt;</span>
3429 <span class="x"> &lt;/header&gt;</span>
3430
3431 <span class="x"> &lt;ul class=&quot;commentList containerList personInformationList jsObjectActionContainer&quot; </span><span class="cp">{</span><span class="c">*</span>
3432 <span class="c"> *</span><span class="cp">}</span><span class="x">data-object-action-class-name=&quot;wcf\data\person\information\PersonInformationAction&quot;</span><span class="cp">{</span><span class="c">*</span>
3433 <span class="c"> *</span><span class="cp">}</span><span class="x">&gt;</span>
3434 <span class="x"> </span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$__wcf</span><span class="o">-&gt;</span><span class="na">session</span><span class="o">-&gt;</span><span class="na">getPermission</span><span class="o">(</span><span class="s1">&#39;user.person.canAddInformation&#39;</span><span class="o">)</span><span class="cp">}</span>
3435 <span class="x"> &lt;li class=&quot;containerListButtonGroup&quot;&gt;</span>
3436 <span class="x"> &lt;ul class=&quot;buttonGroup&quot;&gt;</span>
3437 <span class="x"> &lt;li&gt;</span>
3438 <span class="x"> &lt;a href=&quot;#&quot; class=&quot;button&quot; id=&quot;personInformationAddButton&quot;&gt;</span>
3439 <span class="x"> &lt;span class=&quot;icon icon16 fa-plus&quot;&gt;&lt;/span&gt;</span>
3440 <span class="x"> &lt;span&gt;</span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.person.information.add</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span><span class="x">&lt;/span&gt;</span>
3441 <span class="x"> &lt;/a&gt;</span>
3442 <span class="x"> &lt;/li&gt;</span>
3443 <span class="x"> &lt;/ul&gt;</span>
3444 <span class="x"> &lt;/li&gt;</span>
3445 <span class="x"> </span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3446
3447 <span class="x"> </span><span class="cp">{</span><span class="nf">foreach</span> <span class="na">from</span><span class="o">=</span><span class="nv">$person</span><span class="o">-&gt;</span><span class="na">getInformation</span><span class="o">()</span> <span class="na">item</span><span class="o">=</span><span class="nv">$information</span><span class="cp">}</span>
3448 <span class="x"> &lt;li class=&quot;comment personInformation jsObjectActionObject&quot; data-object-id=&quot;</span><span class="cp">{</span><span class="o">@</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">getObjectID</span><span class="o">()</span><span class="cp">}</span><span class="x">&quot;&gt;</span>
3449 <span class="x"> &lt;div class=&quot;box48</span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$__wcf</span><span class="o">-&gt;</span><span class="na">getUserProfileHandler</span><span class="o">()-&gt;</span><span class="na">isIgnoredUser</span><span class="o">(</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">userID</span><span class="o">,</span> <span class="m">2</span><span class="o">)</span><span class="cp">}</span><span class="x"> ignoredUserContent</span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span><span class="x">&quot;&gt;</span>
3450 <span class="x"> </span><span class="cp">{</span><span class="nf">user</span> <span class="na">object</span><span class="o">=</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">getUserProfile</span><span class="o">()</span> <span class="na">type</span><span class="o">=</span><span class="s1">&#39;avatar48&#39;</span> <span class="na">ariaHidden</span><span class="o">=</span><span class="s1">&#39;true&#39;</span> <span class="na">tabindex</span><span class="o">=</span><span class="s1">&#39;-1&#39;</span><span class="cp">}</span>
3451
3452 <span class="x"> &lt;div class=&quot;commentContentContainer&quot;&gt;</span>
3453 <span class="x"> &lt;div class=&quot;commentContent&quot;&gt;</span>
3454 <span class="x"> &lt;div class=&quot;containerHeadline&quot;&gt;</span>
3455 <span class="x"> &lt;h3&gt;</span>
3456 <span class="x"> </span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$information</span><span class="o">-&gt;</span><span class="na">userID</span><span class="cp">}</span>
3457 <span class="x"> </span><span class="cp">{</span><span class="nf">user</span> <span class="na">object</span><span class="o">=</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">getUserProfile</span><span class="o">()</span><span class="cp">}</span>
3458 <span class="x"> </span><span class="cp">{</span><span class="nf">else</span><span class="cp">}</span>
3459 <span class="x"> &lt;span&gt;</span><span class="cp">{</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">username</span><span class="cp">}</span><span class="x">&lt;/span&gt;</span>
3460 <span class="x"> </span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3461
3462 <span class="x"> &lt;small class=&quot;separatorLeft&quot;&gt;</span><span class="cp">{</span><span class="o">@</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">time</span><span class="o">|</span><span class="na">time</span><span class="cp">}</span><span class="x">&lt;/small&gt;</span>
3463 <span class="x"> &lt;/h3&gt;</span>
3464 <span class="x"> &lt;/div&gt;</span>
3465
3466 <span class="x"> &lt;div class=&quot;htmlContent userMessage&quot; id=&quot;personInformation</span><span class="cp">{</span><span class="o">@</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">getObjectID</span><span class="o">()</span><span class="cp">}</span><span class="x">&quot;&gt;</span>
3467 <span class="x"> </span><span class="cp">{</span><span class="o">@</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">getFormattedInformation</span><span class="o">()</span><span class="cp">}</span>
3468 <span class="x"> &lt;/div&gt;</span>
3469
3470 <span class="x"> &lt;nav class=&quot;jsMobileNavigation buttonGroupNavigation&quot;&gt;</span>
3471 <span class="x"> &lt;ul class=&quot;buttonList iconList&quot;&gt;</span>
3472 <span class="x"> </span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$information</span><span class="o">-&gt;</span><span class="na">canEdit</span><span class="o">()</span><span class="cp">}</span>
3473 <span class="x"> &lt;li class=&quot;jsOnly&quot;&gt;</span>
3474 <span class="x"> &lt;a href=&quot;#&quot; title=&quot;</span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.global.button.edit</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span><span class="x">&quot; class=&quot;jsEditInformation jsTooltip&quot;&gt;</span>
3475 <span class="x"> &lt;span class=&quot;icon icon16 fa-pencil&quot;&gt;&lt;/span&gt;</span>
3476 <span class="x"> &lt;span class=&quot;invisible&quot;&gt;</span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.global.button.edit</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span><span class="x">&lt;/span&gt;</span>
3477 <span class="x"> &lt;/a&gt;</span>
3478 <span class="x"> &lt;/li&gt;</span>
3479 <span class="x"> </span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3480 <span class="x"> </span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$information</span><span class="o">-&gt;</span><span class="na">canDelete</span><span class="o">()</span><span class="cp">}</span>
3481 <span class="x"> &lt;li class=&quot;jsOnly&quot;&gt;</span>
3482 <span class="x"> &lt;a href=&quot;#&quot; title=&quot;</span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.global.button.delete</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span><span class="x">&quot; class=&quot;jsObjectAction jsTooltip&quot; data-object-action=&quot;delete&quot; data-confirm-message=&quot;</span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.person.information.delete.confirmMessage</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span><span class="x">&quot;&gt;</span>
3483 <span class="x"> &lt;span class=&quot;icon icon16 fa-times&quot;&gt;&lt;/span&gt;</span>
3484 <span class="x"> &lt;span class=&quot;invisible&quot;&gt;</span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.global.button.edit</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span><span class="x">&lt;/span&gt;</span>
3485 <span class="x"> &lt;/a&gt;</span>
3486 <span class="x"> &lt;/li&gt;</span>
3487 <span class="x"> </span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3488
3489 <span class="x"> </span><span class="cp">{</span><span class="nf">event</span> <span class="na">name</span><span class="o">=</span><span class="s1">&#39;informationOptions&#39;</span><span class="cp">}</span>
3490 <span class="x"> &lt;/ul&gt;</span>
3491 <span class="x"> &lt;/nav&gt;</span>
3492 <span class="x"> &lt;/div&gt;</span>
3493 <span class="x"> &lt;/div&gt;</span>
3494 <span class="x"> &lt;/div&gt;</span>
3495 <span class="x"> &lt;/li&gt;</span>
3496 <span class="x"> </span><span class="cp">{</span><span class="nf">/foreach</span><span class="cp">}</span>
3497 <span class="x"> &lt;/ul&gt;</span>
3498 <span class="x"> &lt;/section&gt;</span>
3499 <span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3500
3501 <span class="cp">{</span><span class="nf">if</span> <span class="nv">$person</span><span class="o">-&gt;</span><span class="na">enableComments</span><span class="cp">}</span>
3502 <span class="x"> </span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$commentList</span><span class="o">|</span><span class="na">count</span> <span class="o">||</span> <span class="nv">$commentCanAdd</span><span class="cp">}</span>
3503 <span class="x"> &lt;section id=&quot;comments&quot; class=&quot;section sectionContainerList&quot;&gt;</span>
3504 <span class="x"> &lt;header class=&quot;sectionHeader&quot;&gt;</span>
3505 <span class="x"> &lt;h2 class=&quot;sectionTitle&quot;&gt;</span>
3506 <span class="x"> </span><span class="cp">{</span><span class="nf">lang</span><span class="cp">}</span><span class="x">wcf.person.comments</span><span class="cp">{</span><span class="nf">/lang</span><span class="cp">}</span>
3507 <span class="x"> </span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$person</span><span class="o">-&gt;</span><span class="na">comments</span><span class="cp">}</span><span class="x">&lt;span class=&quot;badge&quot;&gt;</span><span class="cp">{</span><span class="err">#</span><span class="nv">$person</span><span class="o">-&gt;</span><span class="na">comments</span><span class="cp">}</span><span class="x">&lt;/span&gt;</span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3508 <span class="x"> &lt;/h2&gt;</span>
3509 <span class="x"> &lt;/header&gt;</span>
3510
3511 <span class="x"> </span><span class="cp">{</span><span class="nf">include</span> <span class="na">file</span><span class="o">=</span><span class="s1">&#39;__commentJavaScript&#39;</span> <span class="na">commentContainerID</span><span class="o">=</span><span class="s1">&#39;personCommentList&#39;</span><span class="cp">}</span>
3512
3513 <span class="x"> &lt;div class=&quot;personComments&quot;&gt;</span>
3514 <span class="x"> &lt;ul id=&quot;personCommentList&quot; class=&quot;commentList containerList&quot; </span><span class="cp">{</span><span class="c">*</span>
3515 <span class="c"> *</span><span class="cp">}</span><span class="x">data-can-add=&quot;</span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$commentCanAdd</span><span class="cp">}</span><span class="x">true</span><span class="cp">{</span><span class="nf">else</span><span class="cp">}</span><span class="x">false</span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span><span class="x">&quot; </span><span class="cp">{</span><span class="c">*</span>
3516 <span class="c"> *</span><span class="cp">}</span><span class="x">data-object-id=&quot;</span><span class="cp">{</span><span class="o">@</span><span class="nv">$person</span><span class="o">-&gt;</span><span class="na">personID</span><span class="cp">}</span><span class="x">&quot; </span><span class="cp">{</span><span class="c">*</span>
3517 <span class="c"> *</span><span class="cp">}</span><span class="x">data-object-type-id=&quot;</span><span class="cp">{</span><span class="o">@</span><span class="nv">$commentObjectTypeID</span><span class="cp">}</span><span class="x">&quot; </span><span class="cp">{</span><span class="c">*</span>
3518 <span class="c"> *</span><span class="cp">}</span><span class="x">data-comments=&quot;</span><span class="cp">{</span><span class="nf">if</span> <span class="nv">$person</span><span class="o">-&gt;</span><span class="na">comments</span><span class="cp">}{</span><span class="o">@</span><span class="nv">$commentList</span><span class="o">-&gt;</span><span class="na">countObjects</span><span class="o">()</span><span class="cp">}{</span><span class="nf">else</span><span class="cp">}</span><span class="x">0</span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span><span class="x">&quot; </span><span class="cp">{</span><span class="c">*</span>
3519 <span class="c"> *</span><span class="cp">}</span><span class="x">data-last-comment-time=&quot;</span><span class="cp">{</span><span class="o">@</span><span class="nv">$lastCommentTime</span><span class="cp">}</span><span class="x">&quot; </span><span class="cp">{</span><span class="c">*</span>
3520 <span class="c"> *</span><span class="cp">}</span><span class="x">&gt;</span>
3521 <span class="x"> </span><span class="cp">{</span><span class="nf">include</span> <span class="na">file</span><span class="o">=</span><span class="s1">&#39;commentListAddComment&#39;</span> <span class="na">wysiwygSelector</span><span class="o">=</span><span class="s1">&#39;personCommentListAddComment&#39;</span><span class="cp">}</span>
3522 <span class="x"> </span><span class="cp">{</span><span class="nf">include</span> <span class="na">file</span><span class="o">=</span><span class="s1">&#39;commentList&#39;</span><span class="cp">}</span>
3523 <span class="x"> &lt;/ul&gt;</span>
3524 <span class="x"> &lt;/div&gt;</span>
3525 <span class="x"> &lt;/section&gt;</span>
3526 <span class="x"> </span><span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3527 <span class="cp">{</span><span class="nf">/if</span><span class="cp">}</span>
3528
3529 <span class="x">&lt;footer class=&quot;contentFooter&quot;&gt;</span>
3530 <span class="x"> </span><span class="cp">{</span><span class="nf">hascontent</span><span class="cp">}</span>
3531 <span class="x"> &lt;nav class=&quot;contentFooterNavigation&quot;&gt;</span>
3532 <span class="x"> &lt;ul&gt;</span>
3533 <span class="x"> </span><span class="cp">{</span><span class="nf">content</span><span class="cp">}{</span><span class="nf">event</span> <span class="na">name</span><span class="o">=</span><span class="s1">&#39;contentFooterNavigation&#39;</span><span class="cp">}{</span><span class="nf">/content</span><span class="cp">}</span>
3534 <span class="x"> &lt;/ul&gt;</span>
3535 <span class="x"> &lt;/nav&gt;</span>
3536 <span class="x"> </span><span class="cp">{</span><span class="nf">/hascontent</span><span class="cp">}</span>
3537 <span class="x">&lt;/footer&gt;</span>
3538
3539 <span class="x">&lt;script data-relocate=&quot;true&quot;&gt;</span>
3540 <span class="x"> require([&#39;Language&#39;, &#39;WoltLabSuite/Core/Controller/Person&#39;], (Language, ControllerPerson) =&gt; </span><span class="cp">{</span>
3541 <span class="na">Language</span><span class="o">.</span><span class="na">addObject</span><span class="o">(</span><span class="cp">{</span>
3542 <span class="s1">&#39;wcf.person.information.add&#39;</span><span class="o">:</span> <span class="s1">&#39;{jslang}wcf.person.information.add{/jslang}&#39;</span><span class="o">,</span>
3543 <span class="s1">&#39;wcf.person.information.add.success&#39;</span><span class="o">:</span> <span class="s1">&#39;{jslang}wcf.person.information.add.success{/jslang}&#39;</span><span class="o">,</span>
3544 <span class="s1">&#39;wcf.person.information.edit&#39;</span><span class="o">:</span> <span class="s1">&#39;{jslang}wcf.person.information.edit{/jslang}&#39;</span><span class="o">,</span>
3545 <span class="s1">&#39;wcf.person.information.edit.success&#39;</span><span class="o">:</span> <span class="s1">&#39;{jslang}wcf.person.information.edit.success{/jslang}&#39;</span><span class="o">,</span>
3546 <span class="cp">}</span><span class="o">);</span>
3547
3548 <span class="na">ControllerPerson</span><span class="o">.</span><span class="na">init</span><span class="o">(</span><span class="cp">{</span><span class="o">@</span><span class="nv">$person</span><span class="o">-&gt;</span><span class="na">personID</span><span class="cp">}</span><span class="o">,</span> <span class="cp">{</span>
3549 <span class="na">canAddInformation</span><span class="o">:</span> <span class="cp">{</span><span class="na">if</span> <span class="nv">$__wcf</span><span class="o">-&gt;</span><span class="na">session</span><span class="o">-&gt;</span><span class="na">getPermission</span><span class="o">(</span><span class="s1">&#39;user.person.canAddInformation&#39;</span><span class="o">)</span><span class="cp">}</span><span class="kc">true</span><span class="cp">{</span><span class="na">else</span><span class="cp">}</span><span class="kc">false</span><span class="cp">{</span><span class="o">/</span><span class="na">if</span><span class="cp">}</span><span class="o">,</span>
3550 <span class="cp">}</span><span class="o">);</span>
3551 <span class="cp">}</span><span class="x">);</span>
3552 <span class="x">&lt;/script&gt;</span>
3553
3554 <span class="cp">{</span><span class="nf">include</span> <span class="na">file</span><span class="o">=</span><span class="s1">&#39;footer&#39;</span><span class="cp">}</span>
3555 </code></pre></div></td></tr></table></div>
3556 <p>To keep things simple here, we reuse the structure and CSS classes used for comments.
3557 Additionally, we always list all pieces of information.
3558 If there are many pieces of information, a nicer solution would be a pagination or loading more pieces of information with JavaScript.</p>
3559 <p>First, we note the <code>jsObjectActionContainer</code> class in combination with the <code>data-object-action-class-name</code> attribute, which are needed for the delete button for each piece of information, as explained <a href="../../../migration/wsc53/javascript/#wcfactiondelete-and-wcfactiontoggle">here</a>.
3560 In <code>PersonInformationAction</code>, we have overridden the default implementations of <code>validateDelete()</code> and <code>delete()</code> which are called after clicking on a delete button.
3561 In <code>validateDelete()</code>, we call <code>PersonInformation::canDelete()</code> on all pieces of information to be deleted for proper permission validation, and in <code>delete()</code>, we update the <code>informationCount</code> values of the people the deleted pieces of information belong to (see below).</p>
3562 <p>The button to add a new piece of information, <code>#personInformationAddButton</code>, and the buttons to edit existing pieces of information, <code>.jsEditInformation</code>, are controlled with JavaScript code initialized at the very end of the template.</p>
3563 <p>Lastly, in <code>create()</code> we provide default values for the <code>time</code>, <code>userID</code>, <code>username</code>, and <code>ipAddress</code> for cases like here when creating a new piece of information, where do not explicitly provide this data.
3564 Additionally, we extract the information text from the <code>information_htmlInputProcessor</code> parameter provided by the associated WYSIWYG form field and update the number of pieces of information created for the relevant person.</p>
3565 <h2 id="creating-and-editing-person-information">Creating and Editing Person Information<a class="headerlink" href="#creating-and-editing-person-information" title="Permanent link">#</a></h2>
3566 <p>To create new pieces of information or editing existing ones, we do not add new form controllers but instead use dialogs generated by the form builder API so that the user does not have to leave the person page.</p>
3567 <p>When clicking on the add button or on any of the edit buttons, a dialog opens with the relevant form:</p>
3568 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">ts/WoltLabSuite/Core/Controller/Person.ts <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/ts/WoltLabSuite/Core/Controller/Person.ts" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
3569 <span class="normal"> 2</span>
3570 <span class="normal"> 3</span>
3571 <span class="normal"> 4</span>
3572 <span class="normal"> 5</span>
3573 <span class="normal"> 6</span>
3574 <span class="normal"> 7</span>
3575 <span class="normal"> 8</span>
3576 <span class="normal"> 9</span>
3577 <span class="normal">10</span>
3578 <span class="normal">11</span>
3579 <span class="normal">12</span>
3580 <span class="normal">13</span>
3581 <span class="normal">14</span>
3582 <span class="normal">15</span>
3583 <span class="normal">16</span>
3584 <span class="normal">17</span>
3585 <span class="normal">18</span>
3586 <span class="normal">19</span>
3587 <span class="normal">20</span>
3588 <span class="normal">21</span>
3589 <span class="normal">22</span>
3590 <span class="normal">23</span>
3591 <span class="normal">24</span>
3592 <span class="normal">25</span>
3593 <span class="normal">26</span>
3594 <span class="normal">27</span>
3595 <span class="normal">28</span>
3596 <span class="normal">29</span>
3597 <span class="normal">30</span>
3598 <span class="normal">31</span>
3599 <span class="normal">32</span>
3600 <span class="normal">33</span>
3601 <span class="normal">34</span>
3602 <span class="normal">35</span>
3603 <span class="normal">36</span>
3604 <span class="normal">37</span>
3605 <span class="normal">38</span>
3606 <span class="normal">39</span>
3607 <span class="normal">40</span>
3608 <span class="normal">41</span>
3609 <span class="normal">42</span>
3610 <span class="normal">43</span>
3611 <span class="normal">44</span>
3612 <span class="normal">45</span>
3613 <span class="normal">46</span>
3614 <span class="normal">47</span>
3615 <span class="normal">48</span>
3616 <span class="normal">49</span>
3617 <span class="normal">50</span>
3618 <span class="normal">51</span>
3619 <span class="normal">52</span>
3620 <span class="normal">53</span>
3621 <span class="normal">54</span>
3622 <span class="normal">55</span>
3623 <span class="normal">56</span>
3624 <span class="normal">57</span>
3625 <span class="normal">58</span>
3626 <span class="normal">59</span>
3627 <span class="normal">60</span>
3628 <span class="normal">61</span>
3629 <span class="normal">62</span>
3630 <span class="normal">63</span>
3631 <span class="normal">64</span>
3632 <span class="normal">65</span>
3633 <span class="normal">66</span>
3634 <span class="normal">67</span>
3635 <span class="normal">68</span>
3636 <span class="normal">69</span>
3637 <span class="normal">70</span>
3638 <span class="normal">71</span>
3639 <span class="normal">72</span>
3640 <span class="normal">73</span>
3641 <span class="normal">74</span>
3642 <span class="normal">75</span>
3643 <span class="normal">76</span>
3644 <span class="normal">77</span>
3645 <span class="normal">78</span>
3646 <span class="normal">79</span>
3647 <span class="normal">80</span>
3648 <span class="normal">81</span>
3649 <span class="normal">82</span>
3650 <span class="normal">83</span>
3651 <span class="normal">84</span>
3652 <span class="normal">85</span>
3653 <span class="normal">86</span>
3654 <span class="normal">87</span>
3655 <span class="normal">88</span>
3656 <span class="normal">89</span>
3657 <span class="normal">90</span>
3658 <span class="normal">91</span>
3659 <span class="normal">92</span>
3660 <span class="normal">93</span>
3661 <span class="normal">94</span>
3662 <span class="normal">95</span>
3663 <span class="normal">96</span>
3664 <span class="normal">97</span>
3665 <span class="normal">98</span>
3666 <span class="normal">99</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="cm">/**</span>
3667 <span class="cm"> * Provides the JavaScript code for the person page.</span>
3668 <span class="cm"> *</span>
3669 <span class="cm"> * @author Matthias Schmidt</span>
3670 <span class="cm"> * @copyright 2001-2021 WoltLab GmbH</span>
3671 <span class="cm"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
3672 <span class="cm"> * @module WoltLabSuite/Core/Controller/Person</span>
3673 <span class="cm"> */</span>
3674
3675 <span class="k">import</span><span class="w"> </span><span class="nx">FormBuilderDialog</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s2">&quot;WoltLabSuite/Core/Form/Builder/Dialog&quot;</span><span class="p">;</span>
3676 <span class="k">import</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="kr">as</span><span class="w"> </span><span class="nx">Language</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s2">&quot;WoltLabSuite/Core/Language&quot;</span><span class="p">;</span>
3677 <span class="k">import</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="kr">as</span><span class="w"> </span><span class="nx">UiNotification</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s2">&quot;WoltLabSuite/Core/Ui/Notification&quot;</span><span class="p">;</span>
3678
3679 <span class="kd">let</span><span class="w"> </span><span class="nx">addDialog</span><span class="o">:</span><span class="w"> </span><span class="kt">FormBuilderDialog</span><span class="p">;</span>
3680 <span class="kd">const</span><span class="w"> </span><span class="nx">editDialogs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Map</span><span class="o">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="w"> </span><span class="nx">FormBuilderDialog</span><span class="o">&gt;</span><span class="p">();</span>
3681
3682 <span class="kd">interface</span><span class="w"> </span><span class="nx">EditReturnValues</span><span class="w"> </span><span class="p">{</span>
3683 <span class="w"> </span><span class="nx">formattedInformation</span><span class="o">:</span><span class="w"> </span><span class="kt">string</span><span class="p">;</span>
3684 <span class="w"> </span><span class="nx">informationID</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span>
3685 <span class="p">}</span>
3686
3687 <span class="kd">interface</span><span class="w"> </span><span class="nx">Options</span><span class="w"> </span><span class="p">{</span>
3688 <span class="w"> </span><span class="nx">canAddInformation</span><span class="o">:</span><span class="w"> </span><span class="kt">true</span><span class="p">;</span>
3689 <span class="p">}</span>
3690
3691 <span class="cm">/**</span>
3692 <span class="cm"> * Opens the edit dialog after clicking on the edit button for a piece of information.</span>
3693 <span class="cm"> */</span>
3694 <span class="kd">function</span><span class="w"> </span><span class="nx">editInformation</span><span class="p">(</span><span class="nx">event</span><span class="o">:</span><span class="w"> </span><span class="kt">Event</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
3695 <span class="w"> </span><span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
3696
3697 <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">currentTarget</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">event</span><span class="p">.</span><span class="nx">currentTarget</span><span class="w"> </span><span class="kr">as</span><span class="w"> </span><span class="nx">HTMLElement</span><span class="p">;</span>
3698 <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">information</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">currentTarget</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="s2">&quot;.jsObjectActionObject&quot;</span><span class="p">)</span><span class="w"> </span><span class="kr">as</span><span class="w"> </span><span class="nx">HTMLElement</span><span class="p">;</span>
3699 <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">informationId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">information</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">objectId</span><span class="o">!</span><span class="p">;</span>
3700
3701 <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">editDialogs</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">informationId</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
3702 <span class="w"> </span><span class="nx">editDialogs</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span>
3703 <span class="w"> </span><span class="nx">informationId</span><span class="p">,</span>
3704 <span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">FormBuilderDialog</span><span class="p">(</span>
3705 <span class="w"> </span><span class="sb">`personInformationEditDialog</span><span class="si">${</span><span class="nx">informationId</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
3706 <span class="w"> </span><span class="s2">&quot;wcf\\data\\person\\information\\PersonInformationAction&quot;</span><span class="p">,</span>
3707 <span class="w"> </span><span class="s2">&quot;getEditDialog&quot;</span><span class="p">,</span>
3708 <span class="w"> </span><span class="p">{</span>
3709 <span class="w"> </span><span class="nx">actionParameters</span><span class="o">:</span><span class="w"> </span><span class="p">{</span>
3710 <span class="w"> </span><span class="nx">informationID</span><span class="o">:</span><span class="w"> </span><span class="kt">informationId</span><span class="p">,</span>
3711 <span class="w"> </span><span class="p">},</span>
3712 <span class="w"> </span><span class="nx">dialog</span><span class="o">:</span><span class="w"> </span><span class="p">{</span>
3713 <span class="w"> </span><span class="nx">title</span><span class="o">:</span><span class="w"> </span><span class="kt">Language.get</span><span class="p">(</span><span class="s2">&quot;wcf.person.information.edit&quot;</span><span class="p">),</span>
3714 <span class="w"> </span><span class="p">},</span>
3715 <span class="w"> </span><span class="nx">submitActionName</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;submitEditDialog&quot;</span><span class="p">,</span>
3716 <span class="w"> </span><span class="nx">successCallback</span><span class="p">(</span><span class="nx">returnValues</span><span class="o">:</span><span class="w"> </span><span class="kt">EditReturnValues</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
3717 <span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="sb">`personInformation</span><span class="si">${</span><span class="nx">returnValues</span><span class="p">.</span><span class="nx">informationID</span><span class="si">}</span><span class="sb">`</span><span class="p">)</span><span class="o">!</span><span class="p">.</span><span class="nx">innerHTML</span><span class="w"> </span><span class="o">=</span>
3718 <span class="w"> </span><span class="nx">returnValues</span><span class="p">.</span><span class="nx">formattedInformation</span><span class="p">;</span>
3719
3720 <span class="w"> </span><span class="nx">UiNotification</span><span class="p">.</span><span class="nx">show</span><span class="p">(</span><span class="nx">Language</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;wcf.person.information.edit.success&quot;</span><span class="p">));</span>
3721 <span class="w"> </span><span class="p">},</span>
3722 <span class="w"> </span><span class="p">},</span>
3723 <span class="w"> </span><span class="p">),</span>
3724 <span class="w"> </span><span class="p">);</span>
3725 <span class="w"> </span><span class="p">}</span>
3726
3727 <span class="w"> </span><span class="nx">editDialogs</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">informationId</span><span class="p">)</span><span class="o">!</span><span class="p">.</span><span class="nx">open</span><span class="p">();</span>
3728 <span class="p">}</span>
3729
3730 <span class="cm">/**</span>
3731 <span class="cm"> * Initializes the JavaScript code for the person page.</span>
3732 <span class="cm"> */</span>
3733 <span class="k">export</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="nx">init</span><span class="p">(</span><span class="nx">personId</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">,</span><span class="w"> </span><span class="nx">options</span><span class="o">:</span><span class="w"> </span><span class="kt">Options</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
3734 <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">canAddInformation</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
3735 <span class="w"> </span><span class="c1">// Initialize the dialog to add new information.</span>
3736 <span class="w"> </span><span class="nx">addDialog</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">FormBuilderDialog</span><span class="p">(</span>
3737 <span class="w"> </span><span class="s2">&quot;personInformationAddDialog&quot;</span><span class="p">,</span>
3738 <span class="w"> </span><span class="s2">&quot;wcf\\data\\person\\information\\PersonInformationAction&quot;</span><span class="p">,</span>
3739 <span class="w"> </span><span class="s2">&quot;getAddDialog&quot;</span><span class="p">,</span>
3740 <span class="w"> </span><span class="p">{</span>
3741 <span class="w"> </span><span class="nx">actionParameters</span><span class="o">:</span><span class="w"> </span><span class="p">{</span>
3742 <span class="w"> </span><span class="nx">personID</span><span class="o">:</span><span class="w"> </span><span class="kt">personId</span><span class="p">,</span>
3743 <span class="w"> </span><span class="p">},</span>
3744 <span class="w"> </span><span class="nx">dialog</span><span class="o">:</span><span class="w"> </span><span class="p">{</span>
3745 <span class="w"> </span><span class="nx">title</span><span class="o">:</span><span class="w"> </span><span class="kt">Language.get</span><span class="p">(</span><span class="s2">&quot;wcf.person.information.add&quot;</span><span class="p">),</span>
3746 <span class="w"> </span><span class="p">},</span>
3747 <span class="w"> </span><span class="nx">submitActionName</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;submitAddDialog&quot;</span><span class="p">,</span>
3748 <span class="w"> </span><span class="nx">successCallback</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
3749 <span class="w"> </span><span class="nx">UiNotification</span><span class="p">.</span><span class="nx">show</span><span class="p">(</span><span class="nx">Language</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s2">&quot;wcf.person.information.add.success&quot;</span><span class="p">),</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">reload</span><span class="p">());</span>
3750 <span class="w"> </span><span class="p">},</span>
3751 <span class="w"> </span><span class="p">},</span>
3752 <span class="w"> </span><span class="p">);</span>
3753
3754 <span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;personInformationAddButton&quot;</span><span class="p">)</span><span class="o">!</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="nx">event</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span>
3755 <span class="w"> </span><span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
3756
3757 <span class="w"> </span><span class="nx">addDialog</span><span class="p">.</span><span class="nx">open</span><span class="p">();</span>
3758 <span class="w"> </span><span class="p">});</span>
3759 <span class="w"> </span><span class="p">}</span>
3760
3761 <span class="w"> </span><span class="nb">document</span>
3762 <span class="w"> </span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="s2">&quot;.jsEditInformation&quot;</span><span class="p">)</span>
3763 <span class="w"> </span><span class="p">.</span><span class="nx">forEach</span><span class="p">((</span><span class="nx">el</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="nx">el</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="nx">ev</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="nx">editInformation</span><span class="p">(</span><span class="nx">ev</span><span class="p">)));</span>
3764 <span class="p">}</span>
3765 </code></pre></div></td></tr></table></div>
3766 <p>We use the <a href="https://github.com/WoltLab/WCF/blob/master/ts/WoltLabSuite/Core/Form/Builder/Dialog.ts"><code>WoltLabSuite/Core/Form/Builder/Dialog</code> module</a>, which takes care of the internal handling with regard to these dialogs.
3767 We only have to provide some data during for initializing these objects and call the <code>open()</code> function after a button has been clicked.</p>
3768 <p>Explanation of the initialization arguments for <code>WoltLabSuite/Core/Form/Builder/Dialog</code> used here:</p>
3769 <ul>
3770 <li>The first argument is the id of the dialog used to identify it.</li>
3771 <li>The second argument is the PHP class name which provides the contents of the dialog's form and handles the data after the form is submitted.</li>
3772 <li>The third argument is the name of the method in the referenced PHP class in the previous argument that returns the dialog form.</li>
3773 <li>The fourth argument contains additional options:<ul>
3774 <li><code>actionParameters</code> are additional parameters send during each AJAX request.
3775 Here, we either pass the id of the person for who a new piece of information is added or the id of the edited piece of information.</li>
3776 <li><code>dialog</code> contains the options for the dialog, see the <code>DialogOptions</code> interface.
3777 Here, we only provide the title of the dialog.</li>
3778 <li><code>submitActionName</code> is the name of the method in the referenced PHP class that is called with the form data after submitting the form.</li>
3779 <li><code>successCallback</code> is called after the submit AJAX request was successful.
3780 After adding a new piece of information, we reload the page, and after editing an existing piece of information, we update the existing information text with the updated text.
3781 (Dynamically inserting a newly added piece of information instead of reloading the page would also be possible, of course, but for this tutorial series, we kept things simple.)</li>
3782 </ul>
3783 </li>
3784 </ul>
3785 <p>Next, we focus on <code>PersonInformationAction</code>, which actually provides the contents of these dialogs and creates and edits the information:</p>
3786 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/data/person/information/PersonInformationAction.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/data/person/information/PersonInformationAction.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
3787 <span class="normal"> 2</span>
3788 <span class="normal"> 3</span>
3789 <span class="normal"> 4</span>
3790 <span class="normal"> 5</span>
3791 <span class="normal"> 6</span>
3792 <span class="normal"> 7</span>
3793 <span class="normal"> 8</span>
3794 <span class="normal"> 9</span>
3795 <span class="normal"> 10</span>
3796 <span class="normal"> 11</span>
3797 <span class="normal"> 12</span>
3798 <span class="normal"> 13</span>
3799 <span class="normal"> 14</span>
3800 <span class="normal"> 15</span>
3801 <span class="normal"> 16</span>
3802 <span class="normal"> 17</span>
3803 <span class="normal"> 18</span>
3804 <span class="normal"> 19</span>
3805 <span class="normal"> 20</span>
3806 <span class="normal"> 21</span>
3807 <span class="normal"> 22</span>
3808 <span class="normal"> 23</span>
3809 <span class="normal"> 24</span>
3810 <span class="normal"> 25</span>
3811 <span class="normal"> 26</span>
3812 <span class="normal"> 27</span>
3813 <span class="normal"> 28</span>
3814 <span class="normal"> 29</span>
3815 <span class="normal"> 30</span>
3816 <span class="normal"> 31</span>
3817 <span class="normal"> 32</span>
3818 <span class="normal"> 33</span>
3819 <span class="normal"> 34</span>
3820 <span class="normal"> 35</span>
3821 <span class="normal"> 36</span>
3822 <span class="normal"> 37</span>
3823 <span class="normal"> 38</span>
3824 <span class="normal"> 39</span>
3825 <span class="normal"> 40</span>
3826 <span class="normal"> 41</span>
3827 <span class="normal"> 42</span>
3828 <span class="normal"> 43</span>
3829 <span class="normal"> 44</span>
3830 <span class="normal"> 45</span>
3831 <span class="normal"> 46</span>
3832 <span class="normal"> 47</span>
3833 <span class="normal"> 48</span>
3834 <span class="normal"> 49</span>
3835 <span class="normal"> 50</span>
3836 <span class="normal"> 51</span>
3837 <span class="normal"> 52</span>
3838 <span class="normal"> 53</span>
3839 <span class="normal"> 54</span>
3840 <span class="normal"> 55</span>
3841 <span class="normal"> 56</span>
3842 <span class="normal"> 57</span>
3843 <span class="normal"> 58</span>
3844 <span class="normal"> 59</span>
3845 <span class="normal"> 60</span>
3846 <span class="normal"> 61</span>
3847 <span class="normal"> 62</span>
3848 <span class="normal"> 63</span>
3849 <span class="normal"> 64</span>
3850 <span class="normal"> 65</span>
3851 <span class="normal"> 66</span>
3852 <span class="normal"> 67</span>
3853 <span class="normal"> 68</span>
3854 <span class="normal"> 69</span>
3855 <span class="normal"> 70</span>
3856 <span class="normal"> 71</span>
3857 <span class="normal"> 72</span>
3858 <span class="normal"> 73</span>
3859 <span class="normal"> 74</span>
3860 <span class="normal"> 75</span>
3861 <span class="normal"> 76</span>
3862 <span class="normal"> 77</span>
3863 <span class="normal"> 78</span>
3864 <span class="normal"> 79</span>
3865 <span class="normal"> 80</span>
3866 <span class="normal"> 81</span>
3867 <span class="normal"> 82</span>
3868 <span class="normal"> 83</span>
3869 <span class="normal"> 84</span>
3870 <span class="normal"> 85</span>
3871 <span class="normal"> 86</span>
3872 <span class="normal"> 87</span>
3873 <span class="normal"> 88</span>
3874 <span class="normal"> 89</span>
3875 <span class="normal"> 90</span>
3876 <span class="normal"> 91</span>
3877 <span class="normal"> 92</span>
3878 <span class="normal"> 93</span>
3879 <span class="normal"> 94</span>
3880 <span class="normal"> 95</span>
3881 <span class="normal"> 96</span>
3882 <span class="normal"> 97</span>
3883 <span class="normal"> 98</span>
3884 <span class="normal"> 99</span>
3885 <span class="normal">100</span>
3886 <span class="normal">101</span>
3887 <span class="normal">102</span>
3888 <span class="normal">103</span>
3889 <span class="normal">104</span>
3890 <span class="normal">105</span>
3891 <span class="normal">106</span>
3892 <span class="normal">107</span>
3893 <span class="normal">108</span>
3894 <span class="normal">109</span>
3895 <span class="normal">110</span>
3896 <span class="normal">111</span>
3897 <span class="normal">112</span>
3898 <span class="normal">113</span>
3899 <span class="normal">114</span>
3900 <span class="normal">115</span>
3901 <span class="normal">116</span>
3902 <span class="normal">117</span>
3903 <span class="normal">118</span>
3904 <span class="normal">119</span>
3905 <span class="normal">120</span>
3906 <span class="normal">121</span>
3907 <span class="normal">122</span>
3908 <span class="normal">123</span>
3909 <span class="normal">124</span>
3910 <span class="normal">125</span>
3911 <span class="normal">126</span>
3912 <span class="normal">127</span>
3913 <span class="normal">128</span>
3914 <span class="normal">129</span>
3915 <span class="normal">130</span>
3916 <span class="normal">131</span>
3917 <span class="normal">132</span>
3918 <span class="normal">133</span>
3919 <span class="normal">134</span>
3920 <span class="normal">135</span>
3921 <span class="normal">136</span>
3922 <span class="normal">137</span>
3923 <span class="normal">138</span>
3924 <span class="normal">139</span>
3925 <span class="normal">140</span>
3926 <span class="normal">141</span>
3927 <span class="normal">142</span>
3928 <span class="normal">143</span>
3929 <span class="normal">144</span>
3930 <span class="normal">145</span>
3931 <span class="normal">146</span>
3932 <span class="normal">147</span>
3933 <span class="normal">148</span>
3934 <span class="normal">149</span>
3935 <span class="normal">150</span>
3936 <span class="normal">151</span>
3937 <span class="normal">152</span>
3938 <span class="normal">153</span>
3939 <span class="normal">154</span>
3940 <span class="normal">155</span>
3941 <span class="normal">156</span>
3942 <span class="normal">157</span>
3943 <span class="normal">158</span>
3944 <span class="normal">159</span>
3945 <span class="normal">160</span>
3946 <span class="normal">161</span>
3947 <span class="normal">162</span>
3948 <span class="normal">163</span>
3949 <span class="normal">164</span>
3950 <span class="normal">165</span>
3951 <span class="normal">166</span>
3952 <span class="normal">167</span>
3953 <span class="normal">168</span>
3954 <span class="normal">169</span>
3955 <span class="normal">170</span>
3956 <span class="normal">171</span>
3957 <span class="normal">172</span>
3958 <span class="normal">173</span>
3959 <span class="normal">174</span>
3960 <span class="normal">175</span>
3961 <span class="normal">176</span>
3962 <span class="normal">177</span>
3963 <span class="normal">178</span>
3964 <span class="normal">179</span>
3965 <span class="normal">180</span>
3966 <span class="normal">181</span>
3967 <span class="normal">182</span>
3968 <span class="normal">183</span>
3969 <span class="normal">184</span>
3970 <span class="normal">185</span>
3971 <span class="normal">186</span>
3972 <span class="normal">187</span>
3973 <span class="normal">188</span>
3974 <span class="normal">189</span>
3975 <span class="normal">190</span>
3976 <span class="normal">191</span>
3977 <span class="normal">192</span>
3978 <span class="normal">193</span>
3979 <span class="normal">194</span>
3980 <span class="normal">195</span>
3981 <span class="normal">196</span>
3982 <span class="normal">197</span>
3983 <span class="normal">198</span>
3984 <span class="normal">199</span>
3985 <span class="normal">200</span>
3986 <span class="normal">201</span>
3987 <span class="normal">202</span>
3988 <span class="normal">203</span>
3989 <span class="normal">204</span>
3990 <span class="normal">205</span>
3991 <span class="normal">206</span>
3992 <span class="normal">207</span>
3993 <span class="normal">208</span>
3994 <span class="normal">209</span>
3995 <span class="normal">210</span>
3996 <span class="normal">211</span>
3997 <span class="normal">212</span>
3998 <span class="normal">213</span>
3999 <span class="normal">214</span>
4000 <span class="normal">215</span>
4001 <span class="normal">216</span>
4002 <span class="normal">217</span>
4003 <span class="normal">218</span>
4004 <span class="normal">219</span>
4005 <span class="normal">220</span>
4006 <span class="normal">221</span>
4007 <span class="normal">222</span>
4008 <span class="normal">223</span>
4009 <span class="normal">224</span>
4010 <span class="normal">225</span>
4011 <span class="normal">226</span>
4012 <span class="normal">227</span>
4013 <span class="normal">228</span>
4014 <span class="normal">229</span>
4015 <span class="normal">230</span>
4016 <span class="normal">231</span>
4017 <span class="normal">232</span>
4018 <span class="normal">233</span>
4019 <span class="normal">234</span>
4020 <span class="normal">235</span>
4021 <span class="normal">236</span>
4022 <span class="normal">237</span>
4023 <span class="normal">238</span>
4024 <span class="normal">239</span>
4025 <span class="normal">240</span>
4026 <span class="normal">241</span>
4027 <span class="normal">242</span>
4028 <span class="normal">243</span>
4029 <span class="normal">244</span>
4030 <span class="normal">245</span>
4031 <span class="normal">246</span>
4032 <span class="normal">247</span>
4033 <span class="normal">248</span>
4034 <span class="normal">249</span>
4035 <span class="normal">250</span>
4036 <span class="normal">251</span>
4037 <span class="normal">252</span>
4038 <span class="normal">253</span>
4039 <span class="normal">254</span>
4040 <span class="normal">255</span>
4041 <span class="normal">256</span>
4042 <span class="normal">257</span>
4043 <span class="normal">258</span>
4044 <span class="normal">259</span>
4045 <span class="normal">260</span>
4046 <span class="normal">261</span>
4047 <span class="normal">262</span>
4048 <span class="normal">263</span>
4049 <span class="normal">264</span>
4050 <span class="normal">265</span>
4051 <span class="normal">266</span>
4052 <span class="normal">267</span>
4053 <span class="normal">268</span>
4054 <span class="normal">269</span>
4055 <span class="normal">270</span>
4056 <span class="normal">271</span>
4057 <span class="normal">272</span>
4058 <span class="normal">273</span>
4059 <span class="normal">274</span>
4060 <span class="normal">275</span>
4061 <span class="normal">276</span>
4062 <span class="normal">277</span>
4063 <span class="normal">278</span>
4064 <span class="normal">279</span>
4065 <span class="normal">280</span>
4066 <span class="normal">281</span>
4067 <span class="normal">282</span>
4068 <span class="normal">283</span>
4069 <span class="normal">284</span>
4070 <span class="normal">285</span>
4071 <span class="normal">286</span>
4072 <span class="normal">287</span>
4073 <span class="normal">288</span>
4074 <span class="normal">289</span>
4075 <span class="normal">290</span>
4076 <span class="normal">291</span>
4077 <span class="normal">292</span>
4078 <span class="normal">293</span>
4079 <span class="normal">294</span>
4080 <span class="normal">295</span>
4081 <span class="normal">296</span>
4082 <span class="normal">297</span>
4083 <span class="normal">298</span>
4084 <span class="normal">299</span>
4085 <span class="normal">300</span>
4086 <span class="normal">301</span>
4087 <span class="normal">302</span>
4088 <span class="normal">303</span>
4089 <span class="normal">304</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
4090
4091 <span class="k">namespace</span> <span class="nx">wcf\data\person\information</span><span class="p">;</span>
4092
4093 <span class="k">use</span> <span class="nx">wcf\data\AbstractDatabaseObjectAction</span><span class="p">;</span>
4094 <span class="k">use</span> <span class="nx">wcf\data\person\PersonAction</span><span class="p">;</span>
4095 <span class="k">use</span> <span class="nx">wcf\data\person\PersonEditor</span><span class="p">;</span>
4096 <span class="k">use</span> <span class="nx">wcf\system\cache\runtime\PersonRuntimeCache</span><span class="p">;</span>
4097 <span class="k">use</span> <span class="nx">wcf\system\event\EventHandler</span><span class="p">;</span>
4098 <span class="k">use</span> <span class="nx">wcf\system\exception\IllegalLinkException</span><span class="p">;</span>
4099 <span class="k">use</span> <span class="nx">wcf\system\exception\PermissionDeniedException</span><span class="p">;</span>
4100 <span class="k">use</span> <span class="nx">wcf\system\exception\UserInputException</span><span class="p">;</span>
4101 <span class="k">use</span> <span class="nx">wcf\system\form\builder\container\wysiwyg\WysiwygFormContainer</span><span class="p">;</span>
4102 <span class="k">use</span> <span class="nx">wcf\system\form\builder\DialogFormDocument</span><span class="p">;</span>
4103 <span class="k">use</span> <span class="nx">wcf\system\html\input\HtmlInputProcessor</span><span class="p">;</span>
4104 <span class="k">use</span> <span class="nx">wcf\system\WCF</span><span class="p">;</span>
4105 <span class="k">use</span> <span class="nx">wcf\util\UserUtil</span><span class="p">;</span>
4106
4107 <span class="sd">/**</span>
4108 <span class="sd"> * Executes person information-related actions.</span>
4109 <span class="sd"> *</span>
4110 <span class="sd"> * @author Matthias Schmidt</span>
4111 <span class="sd"> * @copyright 2001-2021 WoltLab GmbH</span>
4112 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
4113 <span class="sd"> * @package WoltLabSuite\Core\Data\Person\Information</span>
4114 <span class="sd"> *</span>
4115 <span class="sd"> * @method PersonInformationEditor[] getObjects()</span>
4116 <span class="sd"> * @method PersonInformationEditor getSingleObject()</span>
4117 <span class="sd"> */</span>
4118 <span class="k">class</span> <span class="nc">PersonInformationAction</span> <span class="k">extends</span> <span class="nx">AbstractDatabaseObjectAction</span>
4119 <span class="p">{</span>
4120 <span class="sd">/**</span>
4121 <span class="sd"> * @var DialogFormDocument</span>
4122 <span class="sd"> */</span>
4123 <span class="k">public</span> <span class="nv">$dialog</span><span class="p">;</span>
4124
4125 <span class="sd">/**</span>
4126 <span class="sd"> * @var PersonInformation</span>
4127 <span class="sd"> */</span>
4128 <span class="k">public</span> <span class="nv">$information</span><span class="p">;</span>
4129
4130 <span class="sd">/**</span>
4131 <span class="sd"> * @return PersonInformation</span>
4132 <span class="sd"> */</span>
4133 <span class="k">public</span> <span class="k">function</span> <span class="nf">create</span><span class="p">()</span>
4134 <span class="p">{</span>
4135 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;time&#39;</span><span class="p">]))</span> <span class="p">{</span>
4136 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;time&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">TIME_NOW</span><span class="p">;</span>
4137 <span class="p">}</span>
4138 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;userID&#39;</span><span class="p">]))</span> <span class="p">{</span>
4139 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;userID&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getUser</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">userID</span><span class="p">;</span>
4140 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;username&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getUser</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">username</span><span class="p">;</span>
4141 <span class="p">}</span>
4142
4143 <span class="k">if</span> <span class="p">(</span><span class="nx">LOG_IP_ADDRESS</span><span class="p">)</span> <span class="p">{</span>
4144 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;ipAddress&#39;</span><span class="p">]))</span> <span class="p">{</span>
4145 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;ipAddress&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">UserUtil</span><span class="o">::</span><span class="na">getIpAddress</span><span class="p">();</span>
4146 <span class="p">}</span>
4147 <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
4148 <span class="nb">unset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;ipAddress&#39;</span><span class="p">]);</span>
4149 <span class="p">}</span>
4150
4151 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;information_htmlInputProcessor&#39;</span><span class="p">]))</span> <span class="p">{</span>
4152 <span class="sd">/** @var HtmlInputProcessor $htmlInputProcessor */</span>
4153 <span class="nv">$htmlInputProcessor</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;information_htmlInputProcessor&#39;</span><span class="p">];</span>
4154 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;information&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$htmlInputProcessor</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">();</span>
4155 <span class="p">}</span>
4156
4157 <span class="sd">/** @var PersonInformation $information */</span>
4158 <span class="nv">$information</span> <span class="o">=</span> <span class="k">parent</span><span class="o">::</span><span class="na">create</span><span class="p">();</span>
4159
4160 <span class="p">(</span><span class="k">new</span> <span class="nx">PersonAction</span><span class="p">([</span><span class="nv">$information</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">],</span> <span class="s1">&#39;update&#39;</span><span class="p">,</span> <span class="p">[</span>
4161 <span class="s1">&#39;counters&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
4162 <span class="s1">&#39;informationCount&#39;</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
4163 <span class="p">],</span>
4164 <span class="p">]))</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
4165
4166 <span class="k">return</span> <span class="nv">$information</span><span class="p">;</span>
4167 <span class="p">}</span>
4168
4169 <span class="sd">/**</span>
4170 <span class="sd"> * @inheritDoc</span>
4171 <span class="sd"> */</span>
4172 <span class="k">public</span> <span class="k">function</span> <span class="nf">update</span><span class="p">()</span>
4173 <span class="p">{</span>
4174 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;information_htmlInputProcessor&#39;</span><span class="p">]))</span> <span class="p">{</span>
4175 <span class="sd">/** @var HtmlInputProcessor $htmlInputProcessor */</span>
4176 <span class="nv">$htmlInputProcessor</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;information_htmlInputProcessor&#39;</span><span class="p">];</span>
4177 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">][</span><span class="s1">&#39;information&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$htmlInputProcessor</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">();</span>
4178 <span class="p">}</span>
4179
4180 <span class="k">parent</span><span class="o">::</span><span class="na">update</span><span class="p">();</span>
4181 <span class="p">}</span>
4182
4183 <span class="sd">/**</span>
4184 <span class="sd"> * @inheritDoc</span>
4185 <span class="sd"> */</span>
4186 <span class="k">public</span> <span class="k">function</span> <span class="nf">validateDelete</span><span class="p">()</span>
4187 <span class="p">{</span>
4188 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objects</span><span class="p">))</span> <span class="p">{</span>
4189 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">readObjects</span><span class="p">();</span>
4190
4191 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objects</span><span class="p">))</span> <span class="p">{</span>
4192 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">&#39;objectIDs&#39;</span><span class="p">);</span>
4193 <span class="p">}</span>
4194 <span class="p">}</span>
4195
4196 <span class="k">foreach</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getObjects</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$informationEditor</span><span class="p">)</span> <span class="p">{</span>
4197 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$informationEditor</span><span class="o">-&gt;</span><span class="na">canDelete</span><span class="p">())</span> <span class="p">{</span>
4198 <span class="k">throw</span> <span class="k">new</span> <span class="nx">PermissionDeniedException</span><span class="p">();</span>
4199 <span class="p">}</span>
4200 <span class="p">}</span>
4201 <span class="p">}</span>
4202
4203 <span class="sd">/**</span>
4204 <span class="sd"> * @inheritDoc</span>
4205 <span class="sd"> */</span>
4206 <span class="k">public</span> <span class="k">function</span> <span class="nf">delete</span><span class="p">()</span>
4207 <span class="p">{</span>
4208 <span class="nv">$deleteCount</span> <span class="o">=</span> <span class="k">parent</span><span class="o">::</span><span class="na">delete</span><span class="p">();</span>
4209
4210 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$deleteCount</span><span class="p">)</span> <span class="p">{</span>
4211 <span class="k">return</span> <span class="nv">$deleteCount</span><span class="p">;</span>
4212 <span class="p">}</span>
4213
4214 <span class="nv">$counterUpdates</span> <span class="o">=</span> <span class="p">[];</span>
4215 <span class="k">foreach</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getObjects</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$informationEditor</span><span class="p">)</span> <span class="p">{</span>
4216 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$counterUpdates</span><span class="p">[</span><span class="nv">$informationEditor</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">]))</span> <span class="p">{</span>
4217 <span class="nv">$counterUpdates</span><span class="p">[</span><span class="nv">$informationEditor</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
4218 <span class="p">}</span>
4219
4220 <span class="nv">$counterUpdates</span><span class="p">[</span><span class="nv">$informationEditor</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">]</span><span class="o">--</span><span class="p">;</span>
4221 <span class="p">}</span>
4222
4223 <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">beginTransaction</span><span class="p">();</span>
4224 <span class="k">foreach</span> <span class="p">(</span><span class="nv">$counterUpdates</span> <span class="k">as</span> <span class="nv">$personID</span> <span class="o">=&gt;</span> <span class="nv">$counterUpdate</span><span class="p">)</span> <span class="p">{</span>
4225 <span class="p">(</span><span class="k">new</span> <span class="nx">PersonEditor</span><span class="p">(</span><span class="nx">PersonRuntimeCache</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getObject</span><span class="p">(</span><span class="nv">$personID</span><span class="p">)))</span><span class="o">-&gt;</span><span class="na">updateCounters</span><span class="p">([</span>
4226 <span class="s1">&#39;informationCount&#39;</span> <span class="o">=&gt;</span> <span class="nv">$counterUpdate</span><span class="p">,</span>
4227 <span class="p">]);</span>
4228 <span class="p">}</span>
4229 <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">commitTransaction</span><span class="p">();</span>
4230
4231 <span class="k">return</span> <span class="nv">$deleteCount</span><span class="p">;</span>
4232 <span class="p">}</span>
4233
4234 <span class="sd">/**</span>
4235 <span class="sd"> * Validates the `getAddDialog` action.</span>
4236 <span class="sd"> */</span>
4237 <span class="k">public</span> <span class="k">function</span> <span class="nf">validateGetAddDialog</span><span class="p">()</span><span class="o">:</span> <span class="nx">void</span>
4238 <span class="p">{</span>
4239 <span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">checkPermissions</span><span class="p">([</span><span class="s1">&#39;user.person.canAddInformation&#39;</span><span class="p">]);</span>
4240
4241 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">readInteger</span><span class="p">(</span><span class="s1">&#39;personID&#39;</span><span class="p">);</span>
4242 <span class="k">if</span> <span class="p">(</span><span class="nx">PersonRuntimeCache</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getObject</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;personID&#39;</span><span class="p">])</span> <span class="o">===</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
4243 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">&#39;personID&#39;</span><span class="p">);</span>
4244 <span class="p">}</span>
4245 <span class="p">}</span>
4246
4247 <span class="sd">/**</span>
4248 <span class="sd"> * Returns the data to show the dialog to add a new piece of information on a person.</span>
4249 <span class="sd"> *</span>
4250 <span class="sd"> * @return string[]</span>
4251 <span class="sd"> */</span>
4252 <span class="k">public</span> <span class="k">function</span> <span class="nf">getAddDialog</span><span class="p">()</span><span class="o">:</span> <span class="k">array</span>
4253 <span class="p">{</span>
4254 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildDialog</span><span class="p">();</span>
4255
4256 <span class="k">return</span> <span class="p">[</span>
4257 <span class="s1">&#39;dialog&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">(),</span>
4258 <span class="s1">&#39;formId&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getId</span><span class="p">(),</span>
4259 <span class="p">];</span>
4260 <span class="p">}</span>
4261
4262 <span class="sd">/**</span>
4263 <span class="sd"> * Validates the `submitAddDialog` action.</span>
4264 <span class="sd"> */</span>
4265 <span class="k">public</span> <span class="k">function</span> <span class="nf">validateSubmitAddDialog</span><span class="p">()</span><span class="o">:</span> <span class="nx">void</span>
4266 <span class="p">{</span>
4267 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">validateGetAddDialog</span><span class="p">();</span>
4268
4269 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildDialog</span><span class="p">();</span>
4270 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">requestData</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;parameters&#39;</span><span class="p">][</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">??</span> <span class="p">[]);</span>
4271 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">readValues</span><span class="p">();</span>
4272 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">validate</span><span class="p">();</span>
4273 <span class="p">}</span>
4274
4275 <span class="sd">/**</span>
4276 <span class="sd"> * Creates a new piece of information on a person after submitting the dialog.</span>
4277 <span class="sd"> *</span>
4278 <span class="sd"> * @return string[]</span>
4279 <span class="sd"> */</span>
4280 <span class="k">public</span> <span class="k">function</span> <span class="nf">submitAddDialog</span><span class="p">()</span><span class="o">:</span> <span class="k">array</span>
4281 <span class="p">{</span>
4282 <span class="c1">// If there are any validation errors, show the form again.</span>
4283 <span class="k">if</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">hasValidationErrors</span><span class="p">())</span> <span class="p">{</span>
4284 <span class="k">return</span> <span class="p">[</span>
4285 <span class="s1">&#39;dialog&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">(),</span>
4286 <span class="s1">&#39;formId&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getId</span><span class="p">(),</span>
4287 <span class="p">];</span>
4288 <span class="p">}</span>
4289
4290 <span class="p">(</span><span class="k">new</span> <span class="k">static</span><span class="p">([],</span> <span class="s1">&#39;create&#39;</span><span class="p">,</span> <span class="nx">\array_merge</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getData</span><span class="p">(),</span> <span class="p">[</span>
4291 <span class="s1">&#39;data&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
4292 <span class="s1">&#39;personID&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;personID&#39;</span><span class="p">],</span>
4293 <span class="p">],</span>
4294 <span class="p">])))</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
4295
4296 <span class="k">return</span> <span class="p">[];</span>
4297 <span class="p">}</span>
4298
4299 <span class="sd">/**</span>
4300 <span class="sd"> * Validates the `getEditDialog` action.</span>
4301 <span class="sd"> */</span>
4302 <span class="k">public</span> <span class="k">function</span> <span class="nf">validateGetEditDialog</span><span class="p">()</span><span class="o">:</span> <span class="nx">void</span>
4303 <span class="p">{</span>
4304 <span class="nx">WCF</span><span class="o">::</span><span class="na">getSession</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">checkPermissions</span><span class="p">([</span><span class="s1">&#39;user.person.canAddInformation&#39;</span><span class="p">]);</span>
4305
4306 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">readInteger</span><span class="p">(</span><span class="s1">&#39;informationID&#39;</span><span class="p">);</span>
4307 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PersonInformation</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">parameters</span><span class="p">[</span><span class="s1">&#39;informationID&#39;</span><span class="p">]);</span>
4308 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="o">-&gt;</span><span class="na">getObjectID</span><span class="p">())</span> <span class="p">{</span>
4309 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">&#39;informationID&#39;</span><span class="p">);</span>
4310 <span class="p">}</span>
4311 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="o">-&gt;</span><span class="na">canEdit</span><span class="p">())</span> <span class="p">{</span>
4312 <span class="k">throw</span> <span class="k">new</span> <span class="nx">IllegalLinkException</span><span class="p">();</span>
4313 <span class="p">}</span>
4314 <span class="p">}</span>
4315
4316 <span class="sd">/**</span>
4317 <span class="sd"> * Returns the data to show the dialog to edit a piece of information on a person.</span>
4318 <span class="sd"> *</span>
4319 <span class="sd"> * @return string[]</span>
4320 <span class="sd"> */</span>
4321 <span class="k">public</span> <span class="k">function</span> <span class="nf">getEditDialog</span><span class="p">()</span><span class="o">:</span> <span class="k">array</span>
4322 <span class="p">{</span>
4323 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildDialog</span><span class="p">();</span>
4324 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">updatedObject</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="p">);</span>
4325
4326 <span class="k">return</span> <span class="p">[</span>
4327 <span class="s1">&#39;dialog&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">(),</span>
4328 <span class="s1">&#39;formId&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getId</span><span class="p">(),</span>
4329 <span class="p">];</span>
4330 <span class="p">}</span>
4331
4332 <span class="sd">/**</span>
4333 <span class="sd"> * Validates the `submitEditDialog` action.</span>
4334 <span class="sd"> */</span>
4335 <span class="k">public</span> <span class="k">function</span> <span class="nf">validateSubmitEditDialog</span><span class="p">()</span><span class="o">:</span> <span class="nx">void</span>
4336 <span class="p">{</span>
4337 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">validateGetEditDialog</span><span class="p">();</span>
4338
4339 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildDialog</span><span class="p">();</span>
4340 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">updatedObject</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="p">,</span> <span class="k">false</span><span class="p">);</span>
4341 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">requestData</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;parameters&#39;</span><span class="p">][</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">??</span> <span class="p">[]);</span>
4342 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">readValues</span><span class="p">();</span>
4343 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">validate</span><span class="p">();</span>
4344 <span class="p">}</span>
4345
4346 <span class="sd">/**</span>
4347 <span class="sd"> * Updates a piece of information on a person after submitting the edit dialog.</span>
4348 <span class="sd"> *</span>
4349 <span class="sd"> * @return string[]</span>
4350 <span class="sd"> */</span>
4351 <span class="k">public</span> <span class="k">function</span> <span class="nf">submitEditDialog</span><span class="p">()</span><span class="o">:</span> <span class="k">array</span>
4352 <span class="p">{</span>
4353 <span class="c1">// If there are any validation errors, show the form again.</span>
4354 <span class="k">if</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">hasValidationErrors</span><span class="p">())</span> <span class="p">{</span>
4355 <span class="k">return</span> <span class="p">[</span>
4356 <span class="s1">&#39;dialog&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">(),</span>
4357 <span class="s1">&#39;formId&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getId</span><span class="p">(),</span>
4358 <span class="p">];</span>
4359 <span class="p">}</span>
4360
4361 <span class="p">(</span><span class="k">new</span> <span class="k">static</span><span class="p">([</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="p">],</span> <span class="s1">&#39;update&#39;</span><span class="p">,</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">getData</span><span class="p">()))</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
4362
4363 <span class="c1">// Reload the information with the updated data.</span>
4364 <span class="nv">$information</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PersonInformation</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="o">-&gt;</span><span class="na">getObjectID</span><span class="p">());</span>
4365
4366 <span class="k">return</span> <span class="p">[</span>
4367 <span class="s1">&#39;formattedInformation&#39;</span> <span class="o">=&gt;</span> <span class="nv">$information</span><span class="o">-&gt;</span><span class="na">getFormattedInformation</span><span class="p">(),</span>
4368 <span class="s1">&#39;informationID&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">information</span><span class="o">-&gt;</span><span class="na">getObjectID</span><span class="p">(),</span>
4369 <span class="p">];</span>
4370 <span class="p">}</span>
4371
4372 <span class="sd">/**</span>
4373 <span class="sd"> * Builds the dialog to create or edit person information.</span>
4374 <span class="sd"> */</span>
4375 <span class="k">protected</span> <span class="k">function</span> <span class="nf">buildDialog</span><span class="p">()</span><span class="o">:</span> <span class="nx">void</span>
4376 <span class="p">{</span>
4377 <span class="k">if</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span> <span class="o">!==</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
4378 <span class="k">return</span><span class="p">;</span>
4379 <span class="p">}</span>
4380
4381 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span> <span class="o">=</span> <span class="nx">DialogFormDocument</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;personInformationAddDialog&#39;</span><span class="p">)</span>
4382 <span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span>
4383 <span class="nx">WysiwygFormContainer</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;information&#39;</span><span class="p">)</span>
4384 <span class="o">-&gt;</span><span class="na">messageObjectType</span><span class="p">(</span><span class="s1">&#39;com.woltlab.wcf.people.information&#39;</span><span class="p">)</span>
4385 <span class="o">-&gt;</span><span class="na">required</span><span class="p">()</span>
4386 <span class="p">);</span>
4387
4388 <span class="nx">EventHandler</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">fireAction</span><span class="p">(</span><span class="nv">$this</span><span class="p">,</span> <span class="s1">&#39;buildDialog&#39;</span><span class="p">);</span>
4389
4390 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dialog</span><span class="o">-&gt;</span><span class="na">build</span><span class="p">();</span>
4391 <span class="p">}</span>
4392 <span class="p">}</span>
4393 </code></pre></div></td></tr></table></div>
4394 <p>When setting up the <code>WoltLabSuite/Core/Form/Builder/Dialog</code> object for adding new pieces of information, we specified <code>getAddDialog</code> and <code>submitAddDialog</code> as the names of the dialog getter and submit handler.
4395 In addition to these two methods, the matching validation methods <code>validateGetAddDialog()</code> and <code>validateGetAddDialog()</code> are also added.
4396 As the forms for adding and editing pieces of information have the same structure, this form is created in <code>buildDialog()</code> using a <code>DialogFormDocument</code> object, which is intended for forms in dialogs.
4397 We fire an event in <code>buildDialog()</code> so that plugins are able to easily extend the dialog with additional data.</p>
4398 <p><code>validateGetAddDialog()</code> checks if the user has the permission to create new pieces of information and if a valid id for the person, the information will belong to, is given.
4399 The method configured in the <code>WoltLabSuite/Core/Form/Builder/Dialog</code> object returning the dialog is expected to return two values:
4400 the id of the form (<code>formId</code>) and the contents of form shown in the dialog (<code>dialog</code>).
4401 This data is returned by <code>getAddDialog</code> using the dialog build previously by <code>buildDialog()</code>.</p>
4402 <p>After the form is submitted, <code>validateSubmitAddDialog()</code> has to do the same basic validation as <code>validateGetAddDialog()</code> so that <code>validateGetAddDialog()</code> is simply called.
4403 Additionally, the form data is read and validated.
4404 In <code>submitAddDialog()</code>, we first check if there have been any validation errors:
4405 If any error occured during validation, we return the same data as in <code>getAddDialog()</code> so that the dialog is shown again with the erroneous fields marked as such.
4406 Otherwise, if the validation succeeded, the form data is used to create the new piece of information.
4407 In addition to the form data, we manually add the id of the person to whom the information belongs to.
4408 Lastly, we could return some data that we could access in the JavaScript callback function after successfully submitting the dialog.
4409 As we will simply be reloading the page, no such data is returned.
4410 An alternative to reloading to the page would be dynamically inserting the new piece of information in the list so that we would have to return the rendered list item for the new piece of information.</p>
4411 <p>The process for getting and submitting the dialog to edit existing pieces of information is similar to the process for adding new pieces of information.
4412 Instead of the id of the person, however, we now pass the id of the edited piece of information and in <code>submitEditDialog()</code>, we update the edited information instead of creating a new one like in <code>submitAddDialog()</code>.
4413 After editing a piece of information, we do not reload the page but dynamically update the text of the information in the TypeScript code so that we return the updated rendered information text and id of the edited pieced of information in <code>submitAddDialog()</code>.</p>
4414 <h2 id="rebuild-data-worker">Rebuild Data Worker<a class="headerlink" href="#rebuild-data-worker" title="Permanent link">#</a></h2>
4415 <p>To ensure the integrity of the person data, <code>PersonRebuildDataWorker</code> updates the <code>informationCount</code> counter:</p>
4416 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/system/worker/PersonRebuildDataWorker.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/system/worker/PersonRebuildDataWorker.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
4417 <span class="normal"> 2</span>
4418 <span class="normal"> 3</span>
4419 <span class="normal"> 4</span>
4420 <span class="normal"> 5</span>
4421 <span class="normal"> 6</span>
4422 <span class="normal"> 7</span>
4423 <span class="normal"> 8</span>
4424 <span class="normal"> 9</span>
4425 <span class="normal">10</span>
4426 <span class="normal">11</span>
4427 <span class="normal">12</span>
4428 <span class="normal">13</span>
4429 <span class="normal">14</span>
4430 <span class="normal">15</span>
4431 <span class="normal">16</span>
4432 <span class="normal">17</span>
4433 <span class="normal">18</span>
4434 <span class="normal">19</span>
4435 <span class="normal">20</span>
4436 <span class="normal">21</span>
4437 <span class="normal">22</span>
4438 <span class="normal">23</span>
4439 <span class="normal">24</span>
4440 <span class="normal">25</span>
4441 <span class="normal">26</span>
4442 <span class="normal">27</span>
4443 <span class="normal">28</span>
4444 <span class="normal">29</span>
4445 <span class="normal">30</span>
4446 <span class="normal">31</span>
4447 <span class="normal">32</span>
4448 <span class="normal">33</span>
4449 <span class="normal">34</span>
4450 <span class="normal">35</span>
4451 <span class="normal">36</span>
4452 <span class="normal">37</span>
4453 <span class="normal">38</span>
4454 <span class="normal">39</span>
4455 <span class="normal">40</span>
4456 <span class="normal">41</span>
4457 <span class="normal">42</span>
4458 <span class="normal">43</span>
4459 <span class="normal">44</span>
4460 <span class="normal">45</span>
4461 <span class="normal">46</span>
4462 <span class="normal">47</span>
4463 <span class="normal">48</span>
4464 <span class="normal">49</span>
4465 <span class="normal">50</span>
4466 <span class="normal">51</span>
4467 <span class="normal">52</span>
4468 <span class="normal">53</span>
4469 <span class="normal">54</span>
4470 <span class="normal">55</span>
4471 <span class="normal">56</span>
4472 <span class="normal">57</span>
4473 <span class="normal">58</span>
4474 <span class="normal">59</span>
4475 <span class="normal">60</span>
4476 <span class="normal">61</span>
4477 <span class="normal">62</span>
4478 <span class="normal">63</span>
4479 <span class="normal">64</span>
4480 <span class="normal">65</span>
4481 <span class="normal">66</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
4482
4483 <span class="k">namespace</span> <span class="nx">wcf\system\worker</span><span class="p">;</span>
4484
4485 <span class="k">use</span> <span class="nx">wcf\data\person\PersonList</span><span class="p">;</span>
4486 <span class="k">use</span> <span class="nx">wcf\system\WCF</span><span class="p">;</span>
4487
4488 <span class="sd">/**</span>
4489 <span class="sd"> * Worker implementation for updating people.</span>
4490 <span class="sd"> *</span>
4491 <span class="sd"> * @author Matthias Schmidt</span>
4492 <span class="sd"> * @copyright 2001-2022 WoltLab GmbH</span>
4493 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
4494 <span class="sd"> * @package WoltLabSuite\Core\System\Worker</span>
4495 <span class="sd"> *</span>
4496 <span class="sd"> * @method PersonList getObjectList()</span>
4497 <span class="sd"> */</span>
4498 <span class="k">final</span> <span class="k">class</span> <span class="nc">PersonRebuildDataWorker</span> <span class="k">extends</span> <span class="nx">AbstractRebuildDataWorker</span>
4499 <span class="p">{</span>
4500 <span class="sd">/**</span>
4501 <span class="sd"> * @inheritDoc</span>
4502 <span class="sd"> */</span>
4503 <span class="k">protected</span> <span class="nv">$limit</span> <span class="o">=</span> <span class="mi">500</span><span class="p">;</span>
4504
4505 <span class="sd">/**</span>
4506 <span class="sd"> * @inheritDoc</span>
4507 <span class="sd"> */</span>
4508 <span class="k">protected</span> <span class="nv">$objectListClassName</span> <span class="o">=</span> <span class="nx">PersonList</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
4509
4510 <span class="sd">/**</span>
4511 <span class="sd"> * @inheritDoc</span>
4512 <span class="sd"> */</span>
4513 <span class="k">protected</span> <span class="k">function</span> <span class="nf">initObjectList</span><span class="p">()</span>
4514 <span class="p">{</span>
4515 <span class="k">parent</span><span class="o">::</span><span class="na">initObjectList</span><span class="p">();</span>
4516
4517 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectList</span><span class="o">-&gt;</span><span class="na">sqlOrderBy</span> <span class="o">=</span> <span class="s1">&#39;person.personID&#39;</span><span class="p">;</span>
4518 <span class="p">}</span>
4519
4520 <span class="sd">/**</span>
4521 <span class="sd"> * @inheritDoc</span>
4522 <span class="sd"> */</span>
4523 <span class="k">public</span> <span class="k">function</span> <span class="nf">execute</span><span class="p">()</span>
4524 <span class="p">{</span>
4525 <span class="k">parent</span><span class="o">::</span><span class="na">execute</span><span class="p">();</span>
4526
4527 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">\count</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectList</span><span class="p">))</span> <span class="p">{</span>
4528 <span class="k">return</span><span class="p">;</span>
4529 <span class="p">}</span>
4530
4531 <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">&quot;UPDATE wcf1_person person</span>
4532 <span class="s2"> SET informationCount = (</span>
4533 <span class="s2"> SELECT COUNT(*)</span>
4534 <span class="s2"> FROM wcf1_person_information person_information</span>
4535 <span class="s2"> WHERE person_information.personID = person.personID</span>
4536 <span class="s2"> )</span>
4537 <span class="s2"> WHERE person.personID = ?&quot;</span><span class="p">;</span>
4538 <span class="nv">$statement</span> <span class="o">=</span> <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">prepare</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span>
4539
4540 <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">beginTransaction</span><span class="p">();</span>
4541 <span class="k">foreach</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getObjectList</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$person</span><span class="p">)</span> <span class="p">{</span>
4542 <span class="nv">$statement</span><span class="o">-&gt;</span><span class="na">execute</span><span class="p">([</span><span class="nv">$person</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">]);</span>
4543 <span class="p">}</span>
4544 <span class="nx">WCF</span><span class="o">::</span><span class="na">getDB</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">commitTransaction</span><span class="p">();</span>
4545 <span class="p">}</span>
4546 <span class="p">}</span>
4547 </code></pre></div></td></tr></table></div>
4548 <h2 id="username-and-ip-address-event-listeners">Username and IP Address Event Listeners<a class="headerlink" href="#username-and-ip-address-event-listeners" title="Permanent link">#</a></h2>
4549 <p>As we store the name of the user who create a new piece of information and store their IP address, we have to add event listeners to properly handle the following scenarios:</p>
4550 <ol>
4551 <li>If the user is renamed, the value of <code>username</code> stored with the person information has to be updated, which can be achieved by a simple event listener that only has to specify the name of relevant database table if <code>AbstractUserActionRenameListener</code> is extended:</li>
4552 </ol>
4553 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/system/event/listener/PersonUserActionRenameListener.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonUserActionRenameListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
4554 <span class="normal"> 2</span>
4555 <span class="normal"> 3</span>
4556 <span class="normal"> 4</span>
4557 <span class="normal"> 5</span>
4558 <span class="normal"> 6</span>
4559 <span class="normal"> 7</span>
4560 <span class="normal"> 8</span>
4561 <span class="normal"> 9</span>
4562 <span class="normal">10</span>
4563 <span class="normal">11</span>
4564 <span class="normal">12</span>
4565 <span class="normal">13</span>
4566 <span class="normal">14</span>
4567 <span class="normal">15</span>
4568 <span class="normal">16</span>
4569 <span class="normal">17</span>
4570 <span class="normal">18</span>
4571 <span class="normal">19</span>
4572 <span class="normal">20</span>
4573 <span class="normal">21</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
4574
4575 <span class="k">namespace</span> <span class="nx">wcf\system\event\listener</span><span class="p">;</span>
4576
4577 <span class="sd">/**</span>
4578 <span class="sd"> * Updates person information during user renaming.</span>
4579 <span class="sd"> *</span>
4580 <span class="sd"> * @author Matthias Schmidt</span>
4581 <span class="sd"> * @copyright 2001-2022 WoltLab GmbH</span>
4582 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
4583 <span class="sd"> * @package WoltLabSuite\Core\System\Event\Listener</span>
4584 <span class="sd"> */</span>
4585 <span class="k">final</span> <span class="k">class</span> <span class="nc">PersonUserActionRenameListener</span> <span class="k">extends</span> <span class="nx">AbstractUserActionRenameListener</span>
4586 <span class="p">{</span>
4587 <span class="sd">/**</span>
4588 <span class="sd"> * @inheritDoc</span>
4589 <span class="sd"> */</span>
4590 <span class="k">protected</span> <span class="nv">$databaseTables</span> <span class="o">=</span> <span class="p">[</span>
4591 <span class="s1">&#39;wcf{WCF_N}_person_information&#39;</span><span class="p">,</span>
4592 <span class="p">];</span>
4593 <span class="p">}</span>
4594 </code></pre></div></td></tr></table></div>
4595 <ol>
4596 <li>If users are merged, all pieces of information need to be assigned to the target user of the merging.
4597 Again, we only have to specify the name of relevant database table if <code>AbstractUserMergeListener</code> is extended:</li>
4598 </ol>
4599 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/system/event/listener/PersonUserMergeListener.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonUserMergeListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
4600 <span class="normal"> 2</span>
4601 <span class="normal"> 3</span>
4602 <span class="normal"> 4</span>
4603 <span class="normal"> 5</span>
4604 <span class="normal"> 6</span>
4605 <span class="normal"> 7</span>
4606 <span class="normal"> 8</span>
4607 <span class="normal"> 9</span>
4608 <span class="normal">10</span>
4609 <span class="normal">11</span>
4610 <span class="normal">12</span>
4611 <span class="normal">13</span>
4612 <span class="normal">14</span>
4613 <span class="normal">15</span>
4614 <span class="normal">16</span>
4615 <span class="normal">17</span>
4616 <span class="normal">18</span>
4617 <span class="normal">19</span>
4618 <span class="normal">20</span>
4619 <span class="normal">21</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
4620
4621 <span class="k">namespace</span> <span class="nx">wcf\system\event\listener</span><span class="p">;</span>
4622
4623 <span class="sd">/**</span>
4624 <span class="sd"> * Updates person information during user merging.</span>
4625 <span class="sd"> *</span>
4626 <span class="sd"> * @author Matthias Schmidt</span>
4627 <span class="sd"> * @copyright 2001-2022 WoltLab GmbH</span>
4628 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
4629 <span class="sd"> * @package WoltLabSuite\Core\System\Event\Listener</span>
4630 <span class="sd"> */</span>
4631 <span class="k">final</span> <span class="k">class</span> <span class="nc">PersonUserMergeListener</span> <span class="k">extends</span> <span class="nx">AbstractUserMergeListener</span>
4632 <span class="p">{</span>
4633 <span class="sd">/**</span>
4634 <span class="sd"> * @inheritDoc</span>
4635 <span class="sd"> */</span>
4636 <span class="k">protected</span> <span class="nv">$databaseTables</span> <span class="o">=</span> <span class="p">[</span>
4637 <span class="s1">&#39;wcf{WCF_N}_person_information&#39;</span><span class="p">,</span>
4638 <span class="p">];</span>
4639 <span class="p">}</span>
4640 </code></pre></div></td></tr></table></div>
4641 <ol>
4642 <li>If the option to prune stored ip addresses after a certain period of time is enabled, we also have to prune them in the person information database table.
4643 Here we also only have to specify the name of the relevant database table and provide the mapping from the <code>ipAddress</code> column to the <code>time</code> column:</li>
4644 </ol>
4645 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/system/event/listener/PersonPruneIpAddressesCronjobListener.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonPruneIpAddressesCronjobListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
4646 <span class="normal"> 2</span>
4647 <span class="normal"> 3</span>
4648 <span class="normal"> 4</span>
4649 <span class="normal"> 5</span>
4650 <span class="normal"> 6</span>
4651 <span class="normal"> 7</span>
4652 <span class="normal"> 8</span>
4653 <span class="normal"> 9</span>
4654 <span class="normal">10</span>
4655 <span class="normal">11</span>
4656 <span class="normal">12</span>
4657 <span class="normal">13</span>
4658 <span class="normal">14</span>
4659 <span class="normal">15</span>
4660 <span class="normal">16</span>
4661 <span class="normal">17</span>
4662 <span class="normal">18</span>
4663 <span class="normal">19</span>
4664 <span class="normal">20</span>
4665 <span class="normal">21</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
4666
4667 <span class="k">namespace</span> <span class="nx">wcf\system\event\listener</span><span class="p">;</span>
4668
4669 <span class="k">use</span> <span class="nx">wcf\system\cronjob\PruneIpAddressesCronjob</span><span class="p">;</span>
4670
4671 <span class="sd">/**</span>
4672 <span class="sd"> * Prunes old ip addresses.</span>
4673 <span class="sd"> *</span>
4674 <span class="sd"> * @author Matthias Schmidt</span>
4675 <span class="sd"> * @copyright 2001-2022 WoltLab GmbH</span>
4676 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
4677 <span class="sd"> * @package WoltLabSuite\Core\System\Event\Listener</span>
4678 <span class="sd"> */</span>
4679 <span class="k">final</span> <span class="k">class</span> <span class="nc">PersonPruneIpAddressesCronjobListener</span> <span class="k">extends</span> <span class="nx">AbstractEventListener</span>
4680 <span class="p">{</span>
4681 <span class="k">protected</span> <span class="k">function</span> <span class="nf">onExecute</span><span class="p">(</span><span class="nx">PruneIpAddressesCronjob</span> <span class="nv">$cronjob</span><span class="p">)</span><span class="o">:</span> <span class="nx">void</span>
4682 <span class="p">{</span>
4683 <span class="nv">$cronjob</span><span class="o">-&gt;</span><span class="na">columns</span><span class="p">[</span><span class="s1">&#39;wcf&#39;</span> <span class="o">.</span> <span class="nx">WCF_N</span> <span class="o">.</span> <span class="s1">&#39;_person_information&#39;</span><span class="p">][</span><span class="s1">&#39;ipAddress&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;time&#39;</span><span class="p">;</span>
4684 <span class="p">}</span>
4685 <span class="p">}</span>
4686 </code></pre></div></td></tr></table></div>
4687 <ol>
4688 <li>The ip addresses in the person information database table also have to be considered for the user data export which can also be done with minimal effort by providing the name of the relevant database table:</li>
4689 </ol>
4690 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/system/event/listener/PersonUserExportGdprListener.class.php <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/files/lib/system/event/listener/PersonUserExportGdprListener.class.php" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
4691 <span class="normal"> 2</span>
4692 <span class="normal"> 3</span>
4693 <span class="normal"> 4</span>
4694 <span class="normal"> 5</span>
4695 <span class="normal"> 6</span>
4696 <span class="normal"> 7</span>
4697 <span class="normal"> 8</span>
4698 <span class="normal"> 9</span>
4699 <span class="normal">10</span>
4700 <span class="normal">11</span>
4701 <span class="normal">12</span>
4702 <span class="normal">13</span>
4703 <span class="normal">14</span>
4704 <span class="normal">15</span>
4705 <span class="normal">16</span>
4706 <span class="normal">17</span>
4707 <span class="normal">18</span>
4708 <span class="normal">19</span>
4709 <span class="normal">20</span>
4710 <span class="normal">21</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
4711
4712 <span class="k">namespace</span> <span class="nx">wcf\system\event\listener</span><span class="p">;</span>
4713
4714 <span class="k">use</span> <span class="nx">wcf\acp\action\UserExportGdprAction</span><span class="p">;</span>
4715
4716 <span class="sd">/**</span>
4717 <span class="sd"> * Adds the ip addresses stored with the person information during user data export.</span>
4718 <span class="sd"> *</span>
4719 <span class="sd"> * @author Matthias Schmidt</span>
4720 <span class="sd"> * @copyright 2001-2022 WoltLab GmbH</span>
4721 <span class="sd"> * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;</span>
4722 <span class="sd"> * @package WoltLabSuite\Core\System\Event\Listener</span>
4723 <span class="sd"> */</span>
4724 <span class="k">final</span> <span class="k">class</span> <span class="nc">PersonUserExportGdprListener</span> <span class="k">extends</span> <span class="nx">AbstractEventListener</span>
4725 <span class="p">{</span>
4726 <span class="k">protected</span> <span class="k">function</span> <span class="nf">onExport</span><span class="p">(</span><span class="nx">UserExportGdprAction</span> <span class="nv">$action</span><span class="p">)</span><span class="o">:</span> <span class="nx">void</span>
4727 <span class="p">{</span>
4728 <span class="nv">$action</span><span class="o">-&gt;</span><span class="na">ipAddresses</span><span class="p">[</span><span class="s1">&#39;com.woltlab.wcf.people&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;wcf&#39;</span> <span class="o">.</span> <span class="nx">WCF_N</span> <span class="o">.</span> <span class="s1">&#39;_person_information&#39;</span><span class="p">];</span>
4729 <span class="p">}</span>
4730 <span class="p">}</span>
4731 </code></pre></div></td></tr></table></div>
4732 <p>Lastly, we present the updated <code>eventListener.xml</code> file with new entries for all of these event listeners:</p>
4733 <div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">eventListener.xml <a class="codeBoxTitleGitHubLink" href="https://github.com/WoltLab/docs.woltlab.com/tree/6.0/snippets/tutorial/tutorial-series/part-5/eventListener.xml" title="View on GitHub"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8v2m9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.71-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5Z"/></svg></span></a></span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
4734 <span class="normal"> 2</span>
4735 <span class="normal"> 3</span>
4736 <span class="normal"> 4</span>
4737 <span class="normal"> 5</span>
4738 <span class="normal"> 6</span>
4739 <span class="normal"> 7</span>
4740 <span class="normal"> 8</span>
4741 <span class="normal"> 9</span>
4742 <span class="normal">10</span>
4743 <span class="normal">11</span>
4744 <span class="normal">12</span>
4745 <span class="normal">13</span>
4746 <span class="normal">14</span>
4747 <span class="normal">15</span>
4748 <span class="normal">16</span>
4749 <span class="normal">17</span>
4750 <span class="normal">18</span>
4751 <span class="normal">19</span>
4752 <span class="normal">20</span>
4753 <span class="normal">21</span>
4754 <span class="normal">22</span>
4755 <span class="normal">23</span>
4756 <span class="normal">24</span>
4757 <span class="normal">25</span>
4758 <span class="normal">26</span>
4759 <span class="normal">27</span>
4760 <span class="normal">28</span>
4761 <span class="normal">29</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
4762 <span class="nt">&lt;data</span><span class="w"> </span><span class="na">xmlns=</span><span class="s">&quot;http://www.woltlab.com&quot;</span><span class="w"> </span><span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span class="w"> </span><span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://www.woltlab.com http://www.woltlab.com/XSD/5.4/eventListener.xsd&quot;</span><span class="nt">&gt;</span>
4763 <span class="w"> </span><span class="nt">&lt;import&gt;</span>
4764 <span class="w"> </span><span class="nt">&lt;eventlistener</span><span class="w"> </span><span class="na">name=</span><span class="s">&quot;rename@wcf\data\user\UserAction&quot;</span><span class="nt">&gt;</span>
4765 <span class="w"> </span><span class="nt">&lt;eventclassname&gt;</span>wcf\data\user\UserAction<span class="nt">&lt;/eventclassname&gt;</span>
4766 <span class="w"> </span><span class="nt">&lt;eventname&gt;</span>rename<span class="nt">&lt;/eventname&gt;</span>
4767 <span class="w"> </span><span class="nt">&lt;listenerclassname&gt;</span>wcf\system\event\listener\PersonUserActionRenameListener<span class="nt">&lt;/listenerclassname&gt;</span>
4768 <span class="w"> </span><span class="nt">&lt;environment&gt;</span>all<span class="nt">&lt;/environment&gt;</span>
4769 <span class="w"> </span><span class="nt">&lt;/eventlistener&gt;</span>
4770 <span class="w"> </span><span class="nt">&lt;eventlistener</span><span class="w"> </span><span class="na">name=</span><span class="s">&quot;save@wcf\acp\form\UserMergeForm&quot;</span><span class="nt">&gt;</span>
4771 <span class="w"> </span><span class="nt">&lt;eventclassname&gt;</span>wcf\acp\form\UserMergeForm<span class="nt">&lt;/eventclassname&gt;</span>
4772 <span class="w"> </span><span class="nt">&lt;eventname&gt;</span>save<span class="nt">&lt;/eventname&gt;</span>
4773 <span class="w"> </span><span class="nt">&lt;listenerclassname&gt;</span>wcf\system\event\listener\PersonUserMergeListener<span class="nt">&lt;/listenerclassname&gt;</span>
4774 <span class="w"> </span><span class="nt">&lt;environment&gt;</span>admin<span class="nt">&lt;/environment&gt;</span>
4775 <span class="w"> </span><span class="nt">&lt;/eventlistener&gt;</span>
4776 <span class="w"> </span><span class="nt">&lt;eventlistener</span><span class="w"> </span><span class="na">name=</span><span class="s">&quot;execute@wcf\system\cronjob\PruneIpAddressesCronjob&quot;</span><span class="nt">&gt;</span>
4777 <span class="w"> </span><span class="nt">&lt;eventclassname&gt;</span>wcf\system\cronjob\PruneIpAddressesCronjob<span class="nt">&lt;/eventclassname&gt;</span>
4778 <span class="w"> </span><span class="nt">&lt;eventname&gt;</span>execute<span class="nt">&lt;/eventname&gt;</span>
4779 <span class="w"> </span><span class="nt">&lt;listenerclassname&gt;</span>wcf\system\event\listener\PersonPruneIpAddressesCronjobListener<span class="nt">&lt;/listenerclassname&gt;</span>
4780 <span class="w"> </span><span class="nt">&lt;environment&gt;</span>all<span class="nt">&lt;/environment&gt;</span>
4781 <span class="w"> </span><span class="nt">&lt;/eventlistener&gt;</span>
4782 <span class="w"> </span><span class="nt">&lt;eventlistener</span><span class="w"> </span><span class="na">name=</span><span class="s">&quot;export@wcf\acp\action\UserExportGdprAction&quot;</span><span class="nt">&gt;</span>
4783 <span class="w"> </span><span class="nt">&lt;eventclassname&gt;</span>wcf\acp\action\UserExportGdprAction<span class="nt">&lt;/eventclassname&gt;</span>
4784 <span class="w"> </span><span class="nt">&lt;eventname&gt;</span>export<span class="nt">&lt;/eventname&gt;</span>
4785 <span class="w"> </span><span class="nt">&lt;listenerclassname&gt;</span>wcf\system\event\listener\PersonUserExportGdprListener<span class="nt">&lt;/listenerclassname&gt;</span>
4786 <span class="w"> </span><span class="nt">&lt;environment&gt;</span>admin<span class="nt">&lt;/environment&gt;</span>
4787 <span class="w"> </span><span class="nt">&lt;/eventlistener&gt;</span>
4788 <span class="w"> </span><span class="nt">&lt;/import&gt;</span>
4789 <span class="nt">&lt;/data&gt;</span>
4790 </code></pre></div></td></tr></table></div>
4791
4792 <hr>
4793 <div class="md-source-file">
4794 <small>
4795
4796 Last update:
4797 2021-05-03
4798
4799 </small>
4800 </div>
4801
4802
4803
4804
4805
4806
4807 </article>
4808 </div>
4809
4810
4811 </div>
4812
4813 </main>
4814
4815 <footer class="md-footer">
4816
4817 <div class="md-footer-meta md-typeset">
4818 <div class="md-footer-meta__inner md-grid">
4819 <div class="md-copyright">
4820
4821 <div class="md-copyright__highlight">
4822 Copyright © 2020 WoltLab GmbH
4823 </div>
4824
4825
4826 Made with
4827 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
4828 Material for MkDocs
4829 </a>
4830
4831 </div>
4832
4833 <div class="md-copyright">
4834 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
4835 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
4836 </div>
4837
4838 </div>
4839 </div>
4840 </footer>
4841
4842 </div>
4843 <div class="md-dialog" data-md-component="dialog">
4844 <div class="md-dialog__inner md-typeset"></div>
4845 </div>
4846
4847 <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.tracking"], "search": "../../../assets/javascripts/workers/search.208ed371.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script>
4848
4849
4850 <script src="../../../assets/javascripts/bundle.b4d07000.min.js"></script>
4851
4852
4853 </body>
4854 </html>