Deployed 6e5599ce to 6.0 with MkDocs 1.4.1 and mike 1.1.2
[GitHub/WoltLab/woltlab.github.io.git] / 6.0 / migration / wsc55 / php / index.html
CommitLineData
9aa5da67
WG
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/migration/wsc55/php/">
12
13 <link rel="icon" href="../../../assets/default.favicon.ico">
537f5cbf 14 <meta name="generator" content="mkdocs-1.4.1, mkdocs-material-8.5.7">
9aa5da67
WG
15
16
17
18 <title>PHP API - WoltLab Suite Documentation</title>
19
20
21
d7f375d7 22 <link rel="stylesheet" href="../../../assets/stylesheets/main.20d9efc8.min.css">
9aa5da67
WG
23
24
25 <link rel="stylesheet" href="../../../assets/stylesheets/palette.cbb835fc.min.css">
26
27
28
29 <meta name="theme-color" content="#009485">
30
31
32
7f9945cf 33
9aa5da67
WG
34
35
36
37
38
39
40 <link rel="stylesheet" href="../../../stylesheets/extra.css">
41
a06fd3b1 42 <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>
9aa5da67
WG
43
44
45
46
47
7f9945cf 48
9aa5da67
WG
49 </head>
50
51
52
53
54
55
56
57 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="">
58
59
60
61 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
62 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
63 <label class="md-overlay" for="__drawer"></label>
64 <div data-md-component="skip">
65
66
67 <a href="#migrating-from-woltlab-suite-55-php" class="md-skip">
68 Skip to content
69 </a>
70
71 </div>
72 <div data-md-component="announce">
73
74 <aside class="md-banner">
75 <div class="md-banner__inner md-grid md-typeset">
76
a06fd3b1 77
9aa5da67
WG
78 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
79
80 </div>
a06fd3b1 81
9aa5da67
WG
82 </aside>
83
84 </div>
85
86 <div data-md-component="outdated" hidden>
a06fd3b1 87
9aa5da67
WG
88 </div>
89
90
91
92
93<header class="md-header" data-md-component="header">
94 <nav class="md-header__inner md-grid" aria-label="Header">
95 <a href="../../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
96
97 <img src="../../../assets/logo.png" alt="logo">
98
99 </a>
100 <label class="md-header__button md-icon" for="__drawer">
101 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
102 </label>
103 <div class="md-header__title" data-md-component="header-title">
104 <div class="md-header__ellipsis">
105 <div class="md-header__topic">
106 <span class="md-ellipsis">
107 WoltLab Suite Documentation
108 </span>
109 </div>
110 <div class="md-header__topic" data-md-component="header-topic">
111 <span class="md-ellipsis">
112
113 PHP API
114
115 </span>
116 </div>
117 </div>
118 </div>
119
120
121
122 <label class="md-header__button md-icon" for="__search">
123 <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>
124 </label>
125 <div class="md-search" data-md-component="search" role="dialog">
126 <label class="md-search__overlay" for="__search"></label>
127 <div class="md-search__inner" role="search">
128 <form class="md-search__form" name="search">
129 <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>
130 <label class="md-search__icon md-icon" for="__search">
131 <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>
132 <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>
133 </label>
134 <nav class="md-search__options" aria-label="Search">
135
7f9945cf 136 <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
9aa5da67
WG
137 <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>
138 </button>
139 </nav>
140
141 </form>
142 <div class="md-search__output">
143 <div class="md-search__scrollwrap" data-md-scrollfix>
144 <div class="md-search-result" data-md-component="search-result">
145 <div class="md-search-result__meta">
146 Initializing search
147 </div>
148 <ol class="md-search-result__list"></ol>
149 </div>
150 </div>
151 </div>
152 </div>
153</div>
154
155
156 <div class="md-header__source">
157 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
158 <div class="md-source__icon md-icon">
159
7f9945cf 160 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.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 2022 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>
9aa5da67
WG
161 </div>
162 <div class="md-source__repository">
163 GitHub
164 </div>
165</a>
166 </div>
167
168 </nav>
169
170</header>
171
172 <div class="md-container" data-md-component="container">
173
174
175
176
177
178
179 <main class="md-main" data-md-component="main">
180 <div class="md-main__inner md-grid">
181
182
183
184 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
185 <div class="md-sidebar__scrollwrap">
186 <div class="md-sidebar__inner">
187
188
189
190<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
191 <label class="md-nav__title" for="__drawer">
192 <a href="../../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
193
194 <img src="../../../assets/logo.png" alt="logo">
195
196 </a>
197 WoltLab Suite Documentation
198 </label>
199
200 <div class="md-nav__source">
201 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
202 <div class="md-source__icon md-icon">
203
7f9945cf 204 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.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 2022 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>
9aa5da67
WG
205 </div>
206 <div class="md-source__repository">
207 GitHub
208 </div>
209</a>
210 </div>
211
212 <ul class="md-nav__list" data-md-scrollfix>
213
214
215
216
217
218
219
220
221 <li class="md-nav__item">
222 <a href="../../../getting-started/" class="md-nav__link">
223 Getting Started
224 </a>
225 </li>
226
227
228
229
230
231
232
233
234
235
236
237 <li class="md-nav__item md-nav__item--nested">
238
239
240 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" >
241
242
243
244
245 <label class="md-nav__link" for="__nav_2">
246 PHP API
247 <span class="md-nav__icon md-icon"></span>
248 </label>
249
250 <nav class="md-nav" aria-label="PHP API" data-md-level="1">
251 <label class="md-nav__title" for="__nav_2">
252 <span class="md-nav__icon md-icon"></span>
253 PHP API
254 </label>
255 <ul class="md-nav__list" data-md-scrollfix>
256
257
258
259
260
261
262 <li class="md-nav__item">
263 <a href="../../../php/pages/" class="md-nav__link">
264 Pages
265 </a>
266 </li>
267
268
269
270
271
272
273
274
275
276 <li class="md-nav__item">
277 <a href="../../../php/database-objects/" class="md-nav__link">
278 Database Objects
279 </a>
280 </li>
281
282
283
284
285
286
287
288
289
290 <li class="md-nav__item">
291 <a href="../../../php/database-access/" class="md-nav__link">
292 Database Access
293 </a>
294 </li>
295
296
297
298
299
300
301
302
303
304 <li class="md-nav__item">
305 <a href="../../../php/exceptions/" class="md-nav__link">
306 Exceptions
307 </a>
308 </li>
309
310
311
312
313
314
315
316
317
318
319 <li class="md-nav__item md-nav__item--nested">
320
321
322 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" >
323
324
325
326
327 <label class="md-nav__link" for="__nav_2_5">
328 API
329 <span class="md-nav__icon md-icon"></span>
330 </label>
331
332 <nav class="md-nav" aria-label="API" data-md-level="2">
333 <label class="md-nav__title" for="__nav_2_5">
334 <span class="md-nav__icon md-icon"></span>
335 API
336 </label>
337 <ul class="md-nav__list" data-md-scrollfix>
338
339
340
341
342
343
344
345 <li class="md-nav__item md-nav__item--nested">
346
347
348 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_1" type="checkbox" id="__nav_2_5_1" >
349
350
351
352
353 <label class="md-nav__link" for="__nav_2_5_1">
354 Caches
355 <span class="md-nav__icon md-icon"></span>
356 </label>
357
358 <nav class="md-nav" aria-label="Caches" data-md-level="3">
359 <label class="md-nav__title" for="__nav_2_5_1">
360 <span class="md-nav__icon md-icon"></span>
361 Caches
362 </label>
363 <ul class="md-nav__list" data-md-scrollfix>
364
365
366
367
368
369
370 <li class="md-nav__item">
371 <a href="../../../php/api/caches/" class="md-nav__link">
372 Overview
373 </a>
374 </li>
375
376
377
378
379
380
381
382
383
384 <li class="md-nav__item">
385 <a href="../../../php/api/caches_persistent-caches/" class="md-nav__link">
386 Persistent Caches
387 </a>
388 </li>
389
390
391
392
393
394
395
396
397
398 <li class="md-nav__item">
399 <a href="../../../php/api/caches_runtime-caches/" class="md-nav__link">
400 Runtime Caches
401 </a>
402 </li>
403
404
405
406
407 </ul>
408 </nav>
409 </li>
410
411
412
413
414
415
416
417
418
419 <li class="md-nav__item">
420 <a href="../../../php/api/comments/" class="md-nav__link">
421 Comments
422 </a>
423 </li>
424
425
426
427
428
429
430
431
432
433 <li class="md-nav__item">
434 <a href="../../../php/api/cronjobs/" class="md-nav__link">
435 Cronjobs
436 </a>
437 </li>
438
439
440
441
442
443
444
445
446
447 <li class="md-nav__item">
448 <a href="../../../php/api/events/" class="md-nav__link">
449 Events
450 </a>
451 </li>
452
453
454
455
456
457
458
459
460
461
462 <li class="md-nav__item md-nav__item--nested">
463
464
465 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" >
466
467
468
469
470 <label class="md-nav__link" for="__nav_2_5_5">
471 Form Builder
472 <span class="md-nav__icon md-icon"></span>
473 </label>
474
475 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
476 <label class="md-nav__title" for="__nav_2_5_5">
477 <span class="md-nav__icon md-icon"></span>
478 Form Builder
479 </label>
480 <ul class="md-nav__list" data-md-scrollfix>
481
482
483
484
485
486
487 <li class="md-nav__item">
488 <a href="../../../php/api/form_builder/overview/" class="md-nav__link">
489 Overview
490 </a>
491 </li>
492
493
494
495
496
497
498
499
500
501 <li class="md-nav__item">
502 <a href="../../../php/api/form_builder/structure/" class="md-nav__link">
503 Structure
504 </a>
505 </li>
506
507
508
509
510
511
512
513
514
515 <li class="md-nav__item">
516 <a href="../../../php/api/form_builder/form_fields/" class="md-nav__link">
517 Fields
518 </a>
519 </li>
520
521
522
523
524
525
526
527
528
529 <li class="md-nav__item">
530 <a href="../../../php/api/form_builder/validation_data/" class="md-nav__link">
531 Validation and Data
532 </a>
533 </li>
534
535
536
537
538
539
540
541
542
543 <li class="md-nav__item">
544 <a href="../../../php/api/form_builder/dependencies/" class="md-nav__link">
545 Dependencies
546 </a>
547 </li>
548
549
550
551
552 </ul>
553 </nav>
554 </li>
555
556
557
558
559
560
561
562
563
564 <li class="md-nav__item">
565 <a href="../../../php/api/package_installation_plugins/" class="md-nav__link">
566 Package Installation Plugins
567 </a>
568 </li>
569
570
571
572
573
574
575
576
577
578 <li class="md-nav__item">
579 <a href="../../../php/api/user_activity_points/" class="md-nav__link">
580 User Activity Points
581 </a>
582 </li>
583
584
585
586
587
588
589
590
591
592 <li class="md-nav__item">
593 <a href="../../../php/api/user_notifications/" class="md-nav__link">
594 User Notifications
595 </a>
596 </li>
597
598
599
600
601
602
603
604
605
606 <li class="md-nav__item">
607 <a href="../../../php/api/sitemaps/" class="md-nav__link">
608 Sitemaps
609 </a>
610 </li>
611
612
613
614
615 </ul>
616 </nav>
617 </li>
618
619
620
621
622
623
624
625
626
627 <li class="md-nav__item">
628 <a href="../../../php/code-style/" class="md-nav__link">
629 Code Style
630 </a>
631 </li>
632
633
634
635
636
637
638
639
640
641 <li class="md-nav__item">
642 <a href="../../../php/apps/" class="md-nav__link">
643 Apps
644 </a>
645 </li>
646
647
648
649
650
651
652
653
654
655 <li class="md-nav__item">
656 <a href="../../../php/gdpr/" class="md-nav__link">
657 GDPR
658 </a>
659 </li>
660
661
662
663
664 </ul>
665 </nav>
666 </li>
667
668
669
670
671
672
673
674
675
676
677
678 <li class="md-nav__item md-nav__item--nested">
679
680
681 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
682
683
684
685
686 <label class="md-nav__link" for="__nav_3">
687 Languages, Templates & CSS
688 <span class="md-nav__icon md-icon"></span>
689 </label>
690
691 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
692 <label class="md-nav__title" for="__nav_3">
693 <span class="md-nav__icon md-icon"></span>
694 Languages, Templates & CSS
695 </label>
696 <ul class="md-nav__list" data-md-scrollfix>
697
698
699
700
701
702
703 <li class="md-nav__item">
704 <a href="../../../view/languages/" class="md-nav__link">
705 Languages
706 </a>
707 </li>
708
709
710
711
712
713
714
715
716
717 <li class="md-nav__item">
718 <a href="../../../view/templates/" class="md-nav__link">
719 Templates
720 </a>
721 </li>
722
723
724
725
726
727
728
729
730
731 <li class="md-nav__item">
732 <a href="../../../view/template-plugins/" class="md-nav__link">
733 Template Plugins
734 </a>
735 </li>
736
737
738
739
740
741
742
743
744
745 <li class="md-nav__item">
746 <a href="../../../view/css/" class="md-nav__link">
747 CSS
748 </a>
749 </li>
750
751
752
753
754 </ul>
755 </nav>
756 </li>
757
758
759
760
761
762
763
764
765
766
767
768 <li class="md-nav__item md-nav__item--nested">
769
770
771 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
772
773
774
775
776 <label class="md-nav__link" for="__nav_4">
777 TypeScript and JavaScript API
778 <span class="md-nav__icon md-icon"></span>
779 </label>
780
781 <nav class="md-nav" aria-label="TypeScript and JavaScript API" data-md-level="1">
782 <label class="md-nav__title" for="__nav_4">
783 <span class="md-nav__icon md-icon"></span>
784 TypeScript and JavaScript API
785 </label>
786 <ul class="md-nav__list" data-md-scrollfix>
787
788
789
790
791
792
793 <li class="md-nav__item">
794 <a href="../../../javascript/general-usage/" class="md-nav__link">
795 General Usage
796 </a>
797 </li>
798
799
800
801
802
803
804
805
806
807 <li class="md-nav__item">
808 <a href="../../../javascript/typescript/" class="md-nav__link">
809 TypeScript
810 </a>
811 </li>
812
813
814
815
816
817
818
819
820
821
822 <li class="md-nav__item md-nav__item--nested">
823
824
825 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
826
827
828
829
830 <label class="md-nav__link" for="__nav_4_3">
9f399714
WG
831 Components
832 <span class="md-nav__icon md-icon"></span>
833 </label>
834
835 <nav class="md-nav" aria-label="Components" data-md-level="2">
836 <label class="md-nav__title" for="__nav_4_3">
837 <span class="md-nav__icon md-icon"></span>
838 Components
839 </label>
840 <ul class="md-nav__list" data-md-scrollfix>
841
842
843
844
845
846
847 <li class="md-nav__item">
848 <a href="../../../javascript/components_confirmation/" class="md-nav__link">
849 Confirmation
850 </a>
851 </li>
852
853
854
855
856
857
858
859
860
861 <li class="md-nav__item">
862 <a href="../../../javascript/components_dialog/" class="md-nav__link">
863 Dialog
864 </a>
865 </li>
866
867
868
869
870 </ul>
871 </nav>
872 </li>
873
874
875
876
877
878
879
880
881
882
883 <li class="md-nav__item md-nav__item--nested">
884
885
886 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_4" type="checkbox" id="__nav_4_4" >
887
888
889
890
891 <label class="md-nav__link" for="__nav_4_4">
9aa5da67
WG
892 New API
893 <span class="md-nav__icon md-icon"></span>
894 </label>
895
896 <nav class="md-nav" aria-label="New API" data-md-level="2">
9f399714 897 <label class="md-nav__title" for="__nav_4_4">
9aa5da67
WG
898 <span class="md-nav__icon md-icon"></span>
899 New API
900 </label>
901 <ul class="md-nav__list" data-md-scrollfix>
902
903
904
905
906
907
908 <li class="md-nav__item">
909 <a href="../../../javascript/new-api_writing-a-module/" class="md-nav__link">
910 Writing a module
911 </a>
912 </li>
913
914
915
916
917
918
919
920
921
922 <li class="md-nav__item">
923 <a href="../../../javascript/new-api_data-structures/" class="md-nav__link">
924 Data Structures
925 </a>
926 </li>
927
928
929
930
931
932
933
934
935
936 <li class="md-nav__item">
937 <a href="../../../javascript/new-api_core/" class="md-nav__link">
938 Core Functions
939 </a>
940 </li>
941
942
943
944
945
946
947
948
949
950 <li class="md-nav__item">
951 <a href="../../../javascript/new-api_dom/" class="md-nav__link">
952 DOM
953 </a>
954 </li>
955
956
957
958
959
960
961
962
963
964 <li class="md-nav__item">
965 <a href="../../../javascript/new-api_events/" class="md-nav__link">
966 Event Handling
967 </a>
968 </li>
969
970
971
972
973
974
975
976
977
978 <li class="md-nav__item">
979 <a href="../../../javascript/new-api_ajax/" class="md-nav__link">
980 Ajax
981 </a>
982 </li>
983
984
985
986
987
988
989
990
991
992 <li class="md-nav__item">
993 <a href="../../../javascript/new-api_dialogs/" class="md-nav__link">
994 Dialogs
995 </a>
996 </li>
997
998
999
1000
1001
1002
1003
1004
1005
1006 <li class="md-nav__item">
1007 <a href="../../../javascript/new-api_browser/" class="md-nav__link">
1008 Browser and Screen Sizes
1009 </a>
1010 </li>
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020 <li class="md-nav__item">
1021 <a href="../../../javascript/new-api_ui/" class="md-nav__link">
1022 User Interface
1023 </a>
1024 </li>
1025
1026
1027
1028
1029 </ul>
1030 </nav>
1031 </li>
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041 <li class="md-nav__item">
1042 <a href="../../../javascript/legacy-api/" class="md-nav__link">
1043 Legacy API
1044 </a>
1045 </li>
1046
1047
1048
1049
1050
1051
1052
1053
1054
9aa5da67
WG
1055 <li class="md-nav__item">
1056 <a href="../../../javascript/code-snippets/" class="md-nav__link">
1057 Code Snippets
1058 </a>
1059 </li>
1060
1061
1062
1063
1064 </ul>
1065 </nav>
1066 </li>
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078 <li class="md-nav__item md-nav__item--nested">
1079
1080
1081 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
1082
1083
1084
1085
1086 <label class="md-nav__link" for="__nav_5">
1087 Package Components
1088 <span class="md-nav__icon md-icon"></span>
1089 </label>
1090
1091 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
1092 <label class="md-nav__title" for="__nav_5">
1093 <span class="md-nav__icon md-icon"></span>
1094 Package Components
1095 </label>
1096 <ul class="md-nav__list" data-md-scrollfix>
1097
1098
1099
1100
1101
1102
1103 <li class="md-nav__item">
1104 <a href="../../../package/package-xml/" class="md-nav__link">
1105 package.xml
1106 </a>
1107 </li>
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118 <li class="md-nav__item md-nav__item--nested">
1119
1120
1121 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
1122
1123
1124
1125
1126 <label class="md-nav__link" for="__nav_5_2">
1127 PIPs
1128 <span class="md-nav__icon md-icon"></span>
1129 </label>
1130
1131 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
1132 <label class="md-nav__title" for="__nav_5_2">
1133 <span class="md-nav__icon md-icon"></span>
1134 PIPs
1135 </label>
1136 <ul class="md-nav__list" data-md-scrollfix>
1137
1138
1139
1140
1141
1142
1143 <li class="md-nav__item">
1144 <a href="../../../package/pip/" class="md-nav__link">
1145 Overview
1146 </a>
1147 </li>
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157 <li class="md-nav__item">
1158 <a href="../../../package/pip/acl-option/" class="md-nav__link">
1159 aclOption
1160 </a>
1161 </li>
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 <li class="md-nav__item">
1172 <a href="../../../package/pip/acp-menu/" class="md-nav__link">
1173 acpMenu
1174 </a>
1175 </li>
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185 <li class="md-nav__item">
1186 <a href="../../../package/pip/acp-search-provider/" class="md-nav__link">
1187 acpSearchProvider
1188 </a>
1189 </li>
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199 <li class="md-nav__item">
1200 <a href="../../../package/pip/acp-template/" class="md-nav__link">
1201 acpTemplate
1202 </a>
1203 </li>
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213 <li class="md-nav__item">
1214 <a href="../../../package/pip/acp-template-delete/" class="md-nav__link">
1215 acpTemplateDelete
1216 </a>
1217 </li>
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227 <li class="md-nav__item">
1228 <a href="../../../package/pip/bbcode/" class="md-nav__link">
1229 bbcode
1230 </a>
1231 </li>
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 <li class="md-nav__item">
1242 <a href="../../../package/pip/box/" class="md-nav__link">
1243 box
1244 </a>
1245 </li>
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255 <li class="md-nav__item">
1256 <a href="../../../package/pip/clipboard-action/" class="md-nav__link">
1257 clipboardAction
1258 </a>
1259 </li>
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269 <li class="md-nav__item">
1270 <a href="../../../package/pip/core-object/" class="md-nav__link">
1271 coreObject
1272 </a>
1273 </li>
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283 <li class="md-nav__item">
1284 <a href="../../../package/pip/cronjob/" class="md-nav__link">
1285 cronjob
1286 </a>
1287 </li>
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297 <li class="md-nav__item">
1298 <a href="../../../package/pip/database/" class="md-nav__link">
1299 database
1300 </a>
1301 </li>
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311 <li class="md-nav__item">
1312 <a href="../../../package/pip/event-listener/" class="md-nav__link">
1313 eventListener
1314 </a>
1315 </li>
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325 <li class="md-nav__item">
1326 <a href="../../../package/pip/file/" class="md-nav__link">
1327 file
1328 </a>
1329 </li>
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339 <li class="md-nav__item">
1340 <a href="../../../package/pip/file-delete/" class="md-nav__link">
1341 fileDelete
1342 </a>
1343 </li>
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353 <li class="md-nav__item">
1354 <a href="../../../package/pip/language/" class="md-nav__link">
1355 language
1356 </a>
1357 </li>
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367 <li class="md-nav__item">
1368 <a href="../../../package/pip/media-provider/" class="md-nav__link">
1369 mediaProvider
1370 </a>
1371 </li>
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381 <li class="md-nav__item">
1382 <a href="../../../package/pip/menu/" class="md-nav__link">
1383 menu
1384 </a>
1385 </li>
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395 <li class="md-nav__item">
1396 <a href="../../../package/pip/menu-item/" class="md-nav__link">
1397 menuItem
1398 </a>
1399 </li>
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409 <li class="md-nav__item">
1410 <a href="../../../package/pip/object-type/" class="md-nav__link">
1411 objectType
1412 </a>
1413 </li>
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423 <li class="md-nav__item">
1424 <a href="../../../package/pip/object-type-definition/" class="md-nav__link">
1425 objectTypeDefinition
1426 </a>
1427 </li>
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437 <li class="md-nav__item">
1438 <a href="../../../package/pip/option/" class="md-nav__link">
1439 option
1440 </a>
1441 </li>
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451 <li class="md-nav__item">
1452 <a href="../../../package/pip/page/" class="md-nav__link">
1453 page
1454 </a>
1455 </li>
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465 <li class="md-nav__item">
1466 <a href="../../../package/pip/pip/" class="md-nav__link">
1467 pip
1468 </a>
1469 </li>
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479 <li class="md-nav__item">
1480 <a href="../../../package/pip/script/" class="md-nav__link">
1481 script
1482 </a>
1483 </li>
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493 <li class="md-nav__item">
1494 <a href="../../../package/pip/smiley/" class="md-nav__link">
1495 smiley
1496 </a>
1497 </li>
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507 <li class="md-nav__item">
1508 <a href="../../../package/pip/sql/" class="md-nav__link">
1509 sql
1510 </a>
1511 </li>
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521 <li class="md-nav__item">
1522 <a href="../../../package/pip/style/" class="md-nav__link">
1523 style
1524 </a>
1525 </li>
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535 <li class="md-nav__item">
1536 <a href="../../../package/pip/template/" class="md-nav__link">
1537 template
1538 </a>
1539 </li>
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549 <li class="md-nav__item">
1550 <a href="../../../package/pip/template-delete/" class="md-nav__link">
1551 templateDelete
1552 </a>
1553 </li>
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563 <li class="md-nav__item">
1564 <a href="../../../package/pip/template-listener/" class="md-nav__link">
1565 templateListener
1566 </a>
1567 </li>
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577 <li class="md-nav__item">
1578 <a href="../../../package/pip/user-group-option/" class="md-nav__link">
1579 userGroupOption
1580 </a>
1581 </li>
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591 <li class="md-nav__item">
1592 <a href="../../../package/pip/user-menu/" class="md-nav__link">
1593 userMenu
1594 </a>
1595 </li>
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605 <li class="md-nav__item">
1606 <a href="../../../package/pip/user-notification-event/" class="md-nav__link">
1607 userNotificationEvent
1608 </a>
1609 </li>
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619 <li class="md-nav__item">
1620 <a href="../../../package/pip/user-option/" class="md-nav__link">
1621 userOption
1622 </a>
1623 </li>
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633 <li class="md-nav__item">
1634 <a href="../../../package/pip/user-profile-menu/" class="md-nav__link">
1635 userProfileMenu
1636 </a>
1637 </li>
1638
1639
1640
1641
1642 </ul>
1643 </nav>
1644 </li>
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654 <li class="md-nav__item">
1655 <a href="../../../package/database-php-api/" class="md-nav__link">
1656 Database PHP API
1657 </a>
1658 </li>
1659
1660
1661
1662
1663 </ul>
1664 </nav>
1665 </li>
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
1680
1681
1682 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" checked>
1683
1684
1685
1686
1687 <label class="md-nav__link" for="__nav_6">
1688 Migration
1689 <span class="md-nav__icon md-icon"></span>
1690 </label>
1691
1692 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1693 <label class="md-nav__title" for="__nav_6">
1694 <span class="md-nav__icon md-icon"></span>
1695 Migration
1696 </label>
1697 <ul class="md-nav__list" data-md-scrollfix>
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
1708
1709
1710 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" checked>
1711
1712
1713
1714
1715 <label class="md-nav__link" for="__nav_6_1">
1716 From WoltLab Suite 5.5
1717 <span class="md-nav__icon md-icon"></span>
1718 </label>
1719
1720 <nav class="md-nav" aria-label="From WoltLab Suite 5.5" data-md-level="2">
1721 <label class="md-nav__title" for="__nav_6_1">
1722 <span class="md-nav__icon md-icon"></span>
1723 From WoltLab Suite 5.5
1724 </label>
1725 <ul class="md-nav__list" data-md-scrollfix>
1726
1727
1728
1729
1730
1731
1732
1733
1734 <li class="md-nav__item md-nav__item--active">
1735
1736 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
1737
1738
1739
1740
1741
1742 <label class="md-nav__link md-nav__link--active" for="__toc">
1743 PHP API
1744 <span class="md-nav__icon md-icon"></span>
1745 </label>
1746
1747 <a href="./" class="md-nav__link md-nav__link--active">
1748 PHP API
1749 </a>
1750
1751
1752
1753<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1754
1755
1756
1757
1758
1759
1760 <label class="md-nav__title" for="__toc">
1761 <span class="md-nav__icon md-icon"></span>
1762 Table of contents
1763 </label>
1764 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1765
1766 <li class="md-nav__item">
1767 <a href="#minimum-requirements" class="md-nav__link">
1768 Minimum requirements
1769 </a>
1770
62c84650
WG
1771</li>
1772
1773 <li class="md-nav__item">
1774 <a href="#inheritance" class="md-nav__link">
1775 Inheritance
1776 </a>
1777
40af2ded
WG
1778 <nav class="md-nav" aria-label="Inheritance">
1779 <ul class="md-nav__list">
1780
1781 <li class="md-nav__item">
1782 <a href="#parameter-return-property-types" class="md-nav__link">
1783 Parameter / Return / Property Types
1784 </a>
1785
1786</li>
1787
1788 <li class="md-nav__item">
1789 <a href="#final" class="md-nav__link">
1790 final
1791 </a>
1792
1793</li>
1794
1795 </ul>
1796 </nav>
1797
52c6d74b
WG
1798</li>
1799
1800 <li class="md-nav__item">
1801 <a href="#application-boot" class="md-nav__link">
1802 Application Boot
1803 </a>
1804
1805 <nav class="md-nav" aria-label="Application Boot">
1806 <ul class="md-nav__list">
1807
1808 <li class="md-nav__item">
1809 <a href="#request-specific-logic-will-no-longer-happen-during-boot" class="md-nav__link">
1810 Request-specific logic will no longer happen during boot
1811 </a>
1812
f6f96f21
WG
1813</li>
1814
1815 <li class="md-nav__item">
1816 <a href="#bootstrap-scripts" class="md-nav__link">
1817 Bootstrap Scripts
1818 </a>
1819
1820 <nav class="md-nav" aria-label="Bootstrap Scripts">
1821 <ul class="md-nav__list">
1822
1823 <li class="md-nav__item">
1824 <a href="#registering-ievent-listeners" class="md-nav__link">
1825 Registering IEvent listeners
1826 </a>
1827
1828</li>
1829
1830 </ul>
1831 </nav>
1832
52c6d74b
WG
1833</li>
1834
1835 </ul>
1836 </nav>
1837
a99b7289
WG
1838</li>
1839
1840 <li class="md-nav__item">
1841 <a href="#package-system" class="md-nav__link">
1842 Package System
1843 </a>
1844
1845 <nav class="md-nav" aria-label="Package System">
1846 <ul class="md-nav__list">
1847
81d424ce
WG
1848 <li class="md-nav__item">
1849 <a href="#required-minversion-for-required-packages" class="md-nav__link">
1850 Required “minversion” for required packages
1851 </a>
1852
1853</li>
1854
b99b8f08
WG
1855 <li class="md-nav__item">
1856 <a href="#rejection-of-pl-versions" class="md-nav__link">
1857 Rejection of “pl” versions
1858 </a>
1859
1860</li>
1861
a99b7289
WG
1862 <li class="md-nav__item">
1863 <a href="#removal-of-api-compatibility" class="md-nav__link">
1864 Removal of API compatibility
1865 </a>
1866
c72bda6c
WG
1867</li>
1868
1869 <li class="md-nav__item">
1870 <a href="#package-installation-plugins" class="md-nav__link">
1871 Package Installation Plugins
1872 </a>
1873
1874 <nav class="md-nav" aria-label="Package Installation Plugins">
1875 <ul class="md-nav__list">
1876
1877 <li class="md-nav__item">
1878 <a href="#database" class="md-nav__link">
1879 Database
1880 </a>
1881
1882</li>
1883
1884 </ul>
1885 </nav>
1886
a99b7289
WG
1887</li>
1888
1889 </ul>
1890 </nav>
1891
9aa5da67
WG
1892</li>
1893
1894 <li class="md-nav__item">
1895 <a href="#indicating-parameters-that-hold-sensitive-information" class="md-nav__link">
1896 Indicating parameters that hold sensitive information
1897 </a>
1898
3ef4d6aa
WG
1899</li>
1900
1901 <li class="md-nav__item">
1902 <a href="#conditions" class="md-nav__link">
1903 Conditions
1904 </a>
1905
1906 <nav class="md-nav" aria-label="Conditions">
1907 <ul class="md-nav__list">
1908
1909 <li class="md-nav__item">
1910 <a href="#abstractintegercondition" class="md-nav__link">
1911 AbstractIntegerCondition
1912 </a>
1913
1914</li>
1915
1916 </ul>
1917 </nav>
1918
9aa5da67
WG
1919</li>
1920
1921 </ul>
1922
1923</nav>
1924
1925 </li>
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935 <li class="md-nav__item">
1936 <a href="../javascript/" class="md-nav__link">
1937 TypeScript and JavaScript
1938 </a>
1939 </li>
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949 <li class="md-nav__item">
1950 <a href="../templates/" class="md-nav__link">
1951 Templates
1952 </a>
1953 </li>
1954
1955
1956
1957
1958
1959
1960
1961
1962
024038ef
WG
1963 <li class="md-nav__item">
1964 <a href="../icons/" class="md-nav__link">
1965 Icons
1966 </a>
1967 </li>
1968
1969
1970
1971
1972
1973
1974
1975
1976
6d611e8a
WG
1977 <li class="md-nav__item">
1978 <a href="../dialogs/" class="md-nav__link">
1979 Dialogs
1980 </a>
1981 </li>
1982
1983
1984
1985
1986
1987
1988
1989
1990
9aa5da67
WG
1991 <li class="md-nav__item">
1992 <a href="../libraries/" class="md-nav__link">
1993 Third Party Libraries
1994 </a>
1995 </li>
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005 <li class="md-nav__item">
2006 <a href="../deprecations_removals/" class="md-nav__link">
2007 Deprecations and Removals
2008 </a>
2009 </li>
2010
2011
2012
2013
2014 </ul>
2015 </nav>
2016 </li>
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027 <li class="md-nav__item md-nav__item--nested">
2028
2029
2030 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
2031
2032
2033
2034
2035 <label class="md-nav__link" for="__nav_6_2">
2036 From WoltLab Suite 5.4
2037 <span class="md-nav__icon md-icon"></span>
2038 </label>
2039
2040 <nav class="md-nav" aria-label="From WoltLab Suite 5.4" data-md-level="2">
2041 <label class="md-nav__title" for="__nav_6_2">
2042 <span class="md-nav__icon md-icon"></span>
2043 From WoltLab Suite 5.4
2044 </label>
2045 <ul class="md-nav__list" data-md-scrollfix>
2046
2047
2048
2049
2050
2051
2052 <li class="md-nav__item">
2053 <a href="../../wsc54/php/" class="md-nav__link">
2054 PHP API
2055 </a>
2056 </li>
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066 <li class="md-nav__item">
2067 <a href="../../wsc54/javascript/" class="md-nav__link">
2068 TypeScript and JavaScript
2069 </a>
2070 </li>
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080 <li class="md-nav__item">
2081 <a href="../../wsc54/templates/" class="md-nav__link">
2082 Templates
2083 </a>
2084 </li>
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094 <li class="md-nav__item">
2095 <a href="../../wsc54/libraries/" class="md-nav__link">
2096 Third Party Libraries
2097 </a>
2098 </li>
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108 <li class="md-nav__item">
2109 <a href="../../wsc54/deprecations_removals/" class="md-nav__link">
2110 Deprecations and Removals
2111 </a>
2112 </li>
2113
2114
2115
2116
2117 </ul>
2118 </nav>
2119 </li>
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130 <li class="md-nav__item md-nav__item--nested">
2131
2132
2133 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" >
2134
2135
2136
2137
2138 <label class="md-nav__link" for="__nav_6_3">
2139 From WoltLab Suite 5.3
2140 <span class="md-nav__icon md-icon"></span>
2141 </label>
2142
2143 <nav class="md-nav" aria-label="From WoltLab Suite 5.3" data-md-level="2">
2144 <label class="md-nav__title" for="__nav_6_3">
2145 <span class="md-nav__icon md-icon"></span>
2146 From WoltLab Suite 5.3
2147 </label>
2148 <ul class="md-nav__list" data-md-scrollfix>
2149
2150
2151
2152
2153
2154
2155 <li class="md-nav__item">
2156 <a href="../../wsc53/php/" class="md-nav__link">
2157 PHP API
2158 </a>
2159 </li>
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169 <li class="md-nav__item">
2170 <a href="../../wsc53/session/" class="md-nav__link">
2171 Session Handling and Authentication
2172 </a>
2173 </li>
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183 <li class="md-nav__item">
2184 <a href="../../wsc53/javascript/" class="md-nav__link">
2185 TypeScript and JavaScript
2186 </a>
2187 </li>
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197 <li class="md-nav__item">
2198 <a href="../../wsc53/templates/" class="md-nav__link">
2199 Templates
2200 </a>
2201 </li>
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211 <li class="md-nav__item">
2212 <a href="../../wsc53/libraries/" class="md-nav__link">
2213 Third Party Libraries
2214 </a>
2215 </li>
2216
2217
2218
2219
2220 </ul>
2221 </nav>
2222 </li>
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233 <li class="md-nav__item md-nav__item--nested">
2234
2235
2236 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
2237
2238
2239
2240
2241 <label class="md-nav__link" for="__nav_6_4">
2242 From WoltLab Suite 5.2
2243 <span class="md-nav__icon md-icon"></span>
2244 </label>
2245
2246 <nav class="md-nav" aria-label="From WoltLab Suite 5.2" data-md-level="2">
2247 <label class="md-nav__title" for="__nav_6_4">
2248 <span class="md-nav__icon md-icon"></span>
2249 From WoltLab Suite 5.2
2250 </label>
2251 <ul class="md-nav__list" data-md-scrollfix>
2252
2253
2254
2255
2256
2257
2258 <li class="md-nav__item">
2259 <a href="../../wsc52/php/" class="md-nav__link">
2260 PHP API
2261 </a>
2262 </li>
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272 <li class="md-nav__item">
2273 <a href="../../wsc52/templates/" class="md-nav__link">
2274 Templates and Languages
2275 </a>
2276 </li>
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286 <li class="md-nav__item">
2287 <a href="../../wsc52/libraries/" class="md-nav__link">
2288 Third Party Libraries
2289 </a>
2290 </li>
2291
2292
2293
2294
2295 </ul>
2296 </nav>
2297 </li>
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308 <li class="md-nav__item md-nav__item--nested">
2309
2310
2311 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
2312
2313
2314
2315
2316 <label class="md-nav__link" for="__nav_6_5">
2317 From WoltLab Suite 3.1
2318 <span class="md-nav__icon md-icon"></span>
2319 </label>
2320
2321 <nav class="md-nav" aria-label="From WoltLab Suite 3.1" data-md-level="2">
2322 <label class="md-nav__title" for="__nav_6_5">
2323 <span class="md-nav__icon md-icon"></span>
2324 From WoltLab Suite 3.1
2325 </label>
2326 <ul class="md-nav__list" data-md-scrollfix>
2327
2328
2329
2330
2331
2332
2333 <li class="md-nav__item">
2334 <a href="../../wsc31/php/" class="md-nav__link">
2335 PHP API
2336 </a>
2337 </li>
2338
2339
2340
2341
2342 </ul>
2343 </nav>
2344 </li>
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355 <li class="md-nav__item md-nav__item--nested">
2356
2357
2358 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_6" type="checkbox" id="__nav_6_6" >
2359
2360
2361
2362
2363 <label class="md-nav__link" for="__nav_6_6">
2364 From WoltLab Suite 3.0
2365 <span class="md-nav__icon md-icon"></span>
2366 </label>
2367
2368 <nav class="md-nav" aria-label="From WoltLab Suite 3.0" data-md-level="2">
2369 <label class="md-nav__title" for="__nav_6_6">
2370 <span class="md-nav__icon md-icon"></span>
2371 From WoltLab Suite 3.0
2372 </label>
2373 <ul class="md-nav__list" data-md-scrollfix>
2374
2375
2376
2377
2378
2379
2380 <li class="md-nav__item">
2381 <a href="../../wsc30/php/" class="md-nav__link">
2382 PHP API
2383 </a>
2384 </li>
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394 <li class="md-nav__item">
2395 <a href="../../wsc30/javascript/" class="md-nav__link">
2396 JavaScript API
2397 </a>
2398 </li>
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408 <li class="md-nav__item">
2409 <a href="../../wsc30/templates/" class="md-nav__link">
2410 Templates
2411 </a>
2412 </li>
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422 <li class="md-nav__item">
2423 <a href="../../wsc30/css/" class="md-nav__link">
2424 CSS
2425 </a>
2426 </li>
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436 <li class="md-nav__item">
2437 <a href="../../wsc30/package/" class="md-nav__link">
2438 Package Components
2439 </a>
2440 </li>
2441
2442
2443
2444
2445 </ul>
2446 </nav>
2447 </li>
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458 <li class="md-nav__item md-nav__item--nested">
2459
2460
2461 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_7" type="checkbox" id="__nav_6_7" >
2462
2463
2464
2465
2466 <label class="md-nav__link" for="__nav_6_7">
2467 From WCF 2.1
2468 <span class="md-nav__icon md-icon"></span>
2469 </label>
2470
2471 <nav class="md-nav" aria-label="From WCF 2.1" data-md-level="2">
2472 <label class="md-nav__title" for="__nav_6_7">
2473 <span class="md-nav__icon md-icon"></span>
2474 From WCF 2.1
2475 </label>
2476 <ul class="md-nav__list" data-md-scrollfix>
2477
2478
2479
2480
2481
2482
2483 <li class="md-nav__item">
2484 <a href="../../wcf21/php/" class="md-nav__link">
2485 PHP API
2486 </a>
2487 </li>
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497 <li class="md-nav__item">
2498 <a href="../../wcf21/templates/" class="md-nav__link">
2499 Templates
2500 </a>
2501 </li>
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511 <li class="md-nav__item">
2512 <a href="../../wcf21/css/" class="md-nav__link">
2513 CSS
2514 </a>
2515 </li>
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525 <li class="md-nav__item">
2526 <a href="../../wcf21/package/" class="md-nav__link">
2527 Package Components
2528 </a>
2529 </li>
2530
2531
2532
2533
2534 </ul>
2535 </nav>
2536 </li>
2537
2538
2539
2540
2541 </ul>
2542 </nav>
2543 </li>
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555 <li class="md-nav__item md-nav__item--nested">
2556
2557
2558 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
2559
2560
2561
2562
2563 <label class="md-nav__link" for="__nav_7">
2564 Tutorials
2565 <span class="md-nav__icon md-icon"></span>
2566 </label>
2567
2568 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
2569 <label class="md-nav__title" for="__nav_7">
2570 <span class="md-nav__icon md-icon"></span>
2571 Tutorials
2572 </label>
2573 <ul class="md-nav__list" data-md-scrollfix>
2574
2575
2576
2577
2578
2579
2580
2581 <li class="md-nav__item md-nav__item--nested">
2582
2583
2584 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
2585
2586
2587
2588
2589 <label class="md-nav__link" for="__nav_7_1">
2590 Tutorial Series
2591 <span class="md-nav__icon md-icon"></span>
2592 </label>
2593
2594 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
2595 <label class="md-nav__title" for="__nav_7_1">
2596 <span class="md-nav__icon md-icon"></span>
2597 Tutorial Series
2598 </label>
2599 <ul class="md-nav__list" data-md-scrollfix>
2600
2601
2602
2603
2604
2605
2606 <li class="md-nav__item">
2607 <a href="../../../tutorial/series/overview/" class="md-nav__link">
2608 Overview
2609 </a>
2610 </li>
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620 <li class="md-nav__item">
2621 <a href="../../../tutorial/series/part_1/" class="md-nav__link">
2622 Part 1
2623 </a>
2624 </li>
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634 <li class="md-nav__item">
2635 <a href="../../../tutorial/series/part_2/" class="md-nav__link">
2636 Part 2
2637 </a>
2638 </li>
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648 <li class="md-nav__item">
2649 <a href="../../../tutorial/series/part_3/" class="md-nav__link">
2650 Part 3
2651 </a>
2652 </li>
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662 <li class="md-nav__item">
2663 <a href="../../../tutorial/series/part_4/" class="md-nav__link">
2664 Part 4
2665 </a>
2666 </li>
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676 <li class="md-nav__item">
2677 <a href="../../../tutorial/series/part_5/" class="md-nav__link">
2678 Part 5
2679 </a>
2680 </li>
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690 <li class="md-nav__item">
2691 <a href="../../../tutorial/series/part_6/" class="md-nav__link">
2692 Part 6
2693 </a>
2694 </li>
2695
2696
2697
2698
2699 </ul>
2700 </nav>
2701 </li>
2702
2703
2704
2705
2706 </ul>
2707 </nav>
2708 </li>
2709
2710
2711
2712 </ul>
2713</nav>
2714 </div>
2715 </div>
2716 </div>
2717
2718
2719
2720 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2721 <div class="md-sidebar__scrollwrap">
2722 <div class="md-sidebar__inner">
2723
2724
2725<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2726
2727
2728
2729
2730
2731
2732 <label class="md-nav__title" for="__toc">
2733 <span class="md-nav__icon md-icon"></span>
2734 Table of contents
2735 </label>
2736 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2737
2738 <li class="md-nav__item">
2739 <a href="#minimum-requirements" class="md-nav__link">
2740 Minimum requirements
2741 </a>
2742
62c84650
WG
2743</li>
2744
2745 <li class="md-nav__item">
2746 <a href="#inheritance" class="md-nav__link">
2747 Inheritance
2748 </a>
2749
40af2ded
WG
2750 <nav class="md-nav" aria-label="Inheritance">
2751 <ul class="md-nav__list">
2752
2753 <li class="md-nav__item">
2754 <a href="#parameter-return-property-types" class="md-nav__link">
2755 Parameter / Return / Property Types
2756 </a>
2757
2758</li>
2759
2760 <li class="md-nav__item">
2761 <a href="#final" class="md-nav__link">
2762 final
2763 </a>
2764
2765</li>
2766
2767 </ul>
2768 </nav>
2769
52c6d74b
WG
2770</li>
2771
2772 <li class="md-nav__item">
2773 <a href="#application-boot" class="md-nav__link">
2774 Application Boot
2775 </a>
2776
2777 <nav class="md-nav" aria-label="Application Boot">
2778 <ul class="md-nav__list">
2779
2780 <li class="md-nav__item">
2781 <a href="#request-specific-logic-will-no-longer-happen-during-boot" class="md-nav__link">
2782 Request-specific logic will no longer happen during boot
2783 </a>
2784
f6f96f21
WG
2785</li>
2786
2787 <li class="md-nav__item">
2788 <a href="#bootstrap-scripts" class="md-nav__link">
2789 Bootstrap Scripts
2790 </a>
2791
2792 <nav class="md-nav" aria-label="Bootstrap Scripts">
2793 <ul class="md-nav__list">
2794
2795 <li class="md-nav__item">
2796 <a href="#registering-ievent-listeners" class="md-nav__link">
2797 Registering IEvent listeners
2798 </a>
2799
2800</li>
2801
2802 </ul>
2803 </nav>
2804
52c6d74b
WG
2805</li>
2806
2807 </ul>
2808 </nav>
2809
a99b7289
WG
2810</li>
2811
2812 <li class="md-nav__item">
2813 <a href="#package-system" class="md-nav__link">
2814 Package System
2815 </a>
2816
2817 <nav class="md-nav" aria-label="Package System">
2818 <ul class="md-nav__list">
2819
81d424ce
WG
2820 <li class="md-nav__item">
2821 <a href="#required-minversion-for-required-packages" class="md-nav__link">
2822 Required “minversion” for required packages
2823 </a>
2824
2825</li>
2826
b99b8f08
WG
2827 <li class="md-nav__item">
2828 <a href="#rejection-of-pl-versions" class="md-nav__link">
2829 Rejection of “pl” versions
2830 </a>
2831
2832</li>
2833
a99b7289
WG
2834 <li class="md-nav__item">
2835 <a href="#removal-of-api-compatibility" class="md-nav__link">
2836 Removal of API compatibility
2837 </a>
2838
c72bda6c
WG
2839</li>
2840
2841 <li class="md-nav__item">
2842 <a href="#package-installation-plugins" class="md-nav__link">
2843 Package Installation Plugins
2844 </a>
2845
2846 <nav class="md-nav" aria-label="Package Installation Plugins">
2847 <ul class="md-nav__list">
2848
2849 <li class="md-nav__item">
2850 <a href="#database" class="md-nav__link">
2851 Database
2852 </a>
2853
2854</li>
2855
2856 </ul>
2857 </nav>
2858
a99b7289
WG
2859</li>
2860
2861 </ul>
2862 </nav>
2863
9aa5da67
WG
2864</li>
2865
2866 <li class="md-nav__item">
2867 <a href="#indicating-parameters-that-hold-sensitive-information" class="md-nav__link">
2868 Indicating parameters that hold sensitive information
2869 </a>
2870
3ef4d6aa
WG
2871</li>
2872
2873 <li class="md-nav__item">
2874 <a href="#conditions" class="md-nav__link">
2875 Conditions
2876 </a>
2877
2878 <nav class="md-nav" aria-label="Conditions">
2879 <ul class="md-nav__list">
2880
2881 <li class="md-nav__item">
2882 <a href="#abstractintegercondition" class="md-nav__link">
2883 AbstractIntegerCondition
2884 </a>
2885
2886</li>
2887
2888 </ul>
2889 </nav>
2890
9aa5da67
WG
2891</li>
2892
2893 </ul>
2894
2895</nav>
2896 </div>
2897 </div>
2898 </div>
2899
2900
7f9945cf
WG
2901
2902 <div class="md-content" data-md-component="content">
2903 <article class="md-content__inner md-typeset">
9aa5da67 2904
7f9945cf
WG
2905
2906
9aa5da67 2907 <a href="https://github.com/WoltLab/docs.woltlab.com/edit/6.0/docs/migration/wsc55/php.md" title="Edit this page" class="md-content__button md-icon">
7f9945cf 2908
9aa5da67
WG
2909 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
2910 </a>
2911
2912
9aa5da67
WG
2913<h1 id="migrating-from-woltlab-suite-55-php">Migrating from WoltLab Suite 5.5 - PHP<a class="headerlink" href="#migrating-from-woltlab-suite-55-php" title="Permanent link">#</a></h1>
2914<h2 id="minimum-requirements">Minimum requirements<a class="headerlink" href="#minimum-requirements" title="Permanent link">#</a></h2>
2915<p>The minimum requirements have been increased to the following:</p>
2916<ul>
af52397a 2917<li><strong>PHP:</strong> 8.1.2 (64 bit only); <code>intl</code> extension</li>
9aa5da67
WG
2918<li><strong>MySQL:</strong> 8.0.29</li>
2919<li><strong>MariaDB:</strong> 10.5.12</li>
2920</ul>
2921<p>It is recommended to make use of the newly introduced features whereever possible.
2922Please refer to the PHP documentation for details.</p>
62c84650 2923<h2 id="inheritance">Inheritance<a class="headerlink" href="#inheritance" title="Permanent link">#</a></h2>
40af2ded 2924<h3 id="parameter-return-property-types">Parameter / Return / Property Types<a class="headerlink" href="#parameter-return-property-types" title="Permanent link">#</a></h3>
62c84650
WG
2925<p>Parameter, return, and property types have been added to methods of various classes/interfaces.
2926This might cause errors during inheritance, because the types are not compatible with the newly added types in the parent class.</p>
2927<p>Return types may already be added in package versions for older WoltLab Suite branches to be forward compatible, because return types are covariant.</p>
40af2ded
WG
2928<h3 id="final">final<a class="headerlink" href="#final" title="Permanent link">#</a></h3>
2929<p>The <code>final</code> modifier was added to several classes that were not usefully set up for inheritance in the first place to make it explicit that inheriting from these classes is unsupported.</p>
52c6d74b
WG
2930<h2 id="application-boot">Application Boot<a class="headerlink" href="#application-boot" title="Permanent link">#</a></h2>
2931<h3 id="request-specific-logic-will-no-longer-happen-during-boot">Request-specific logic will no longer happen during boot<a class="headerlink" href="#request-specific-logic-will-no-longer-happen-during-boot" title="Permanent link">#</a></h3>
2932<p>Historically the application boot in <code>WCF</code>’s constructor performed processing based on fundamentally request-specific values, such as the accessed URL, the request body, or cookies.
2933This is problematic, because this makes the boot dependent on the HTTP environment which may not be be available, e.g. when using the CLI interface for maintenance jobs.
2934The latter needs to emulate certain aspects of the HTTP environment for the boot to succeed.
2935Furthermore one of the goals of the introduction of PSR-7/PSR-15-based request processing that <a href="../../wsc54/php/#initial-psr-7-support">was started in WoltLab Suite 5.5</a> is the removal of implicit global state in favor of explicitly provided values by means of a <code>ServerRequestInterface</code> and thus to achieve a cleaner architecture.</p>
2936<p>To achieve a clean separation this type of request-specific logic will incrementally be moved out of the application boot in <code>WCF</code>’s constructor and into the request processing stack that is launched by <code>RequestHandler</code>, e.g. by running appropriate PSR-15 middleware.</p>
2937<p>An example of this type of request-specific logic that was previously happening during application boot is the check that verifies whether a user is banned and denies access otherwise.
2938This check is based on a request-specific value, namely the user’s session which in turn is based on a provided (HTTP) cookie.
2939It is now <a href="https://github.com/WoltLab/WCF/commit/51154ba3f8f1d09b54560d5d1933f9053ef409cb">moved into the <code>CheckUserBan</code> middleware</a>.</p>
2940<p>This move implies that custom scripts that include WoltLab Suite Core’s <code>global.php</code>, without also invoking <code>RequestHandler</code> will no longer be able to rely on this type of access control having happened and will need to implement it themselves, e.g. by manually running the appropriate middlewares.</p>
2941<p>Notably the following checks have been moved into a middleware:</p>
2942<ul>
2943<li>Denying access to banned users (<a href="https://github.com/WoltLab/WCF/pull/4935">WoltLab/WCF#4935</a>)</li>
2944<li>ACP authentication (<a href="https://github.com/WoltLab/WCF/pull/4939">WoltLab/WCF#4939</a>)</li>
2945</ul>
2946<p>The initialization of the session itself and dependent subsystems (e.g. the user object and thus the current language) is still running during application boot for now.
2947However it is planned to also move the session initialization into the middleware in a future version and then providing access to the session by adding an attribute on the <code>ServerRequestInterface</code>, instead of querying the session via <code>WCF::getSession()</code>.
2948As such you should begin to stop relying on the session and user outside of <code>RequestHandler</code>’s middleware stack and should also avoid calling <code>WCF::getUser()</code> and <code>WCF::getSession()</code> outside of a controller, instead adding a <code>User</code> parameter to your methods to allow an appropriate user to be passed from the outside.</p>
2949<p>An example of a method that implicitly relies on these global values is the <a href="https://github.com/WoltLab/WCF/blob/7cfd5578ede22e798b770262c0cdf1e9dfe25d36/wcfsetup/install/files/lib/system/visitTracker/VisitTracker.class.php#L199">VisitTracker's <code>trackObjectVisit()</code> method</a>.
2950It only takes the object type, object ID and timestamp as the parameter and will determine the <code>userID</code> by itself.
2951The <code>trackObjectVisitByUserIDs()</code> method on the other hand does not rely on global values.
2952Instead the relevant user IDs need to be passed explicitly from the controller as parameters, thus making the information the method works with explicit.
2953This also makes the method reusable for use cases where an object should be marked as visited for a user other than the active user, without needing to temporarily switch the active user in the session.</p>
2954<p>The same is true for “permission checking” methods on <code>DatabaseObject</code>s.
2955Instead of having a <code>$myObject-&gt;canView()</code> method that uses <code>WCF::getSession()</code> or <code>WCF::getUser()</code> internally, the user should explicitly be passed to the method as a parameter, allowing for permission checks to happen in a different context, for example send sending notification emails.</p>
2956<p>Likewise event listeners should not access these request-specific values at all, because they are unable to know whether the event was fired based on these request-specific values or whether some programmatic action fired the event for another arbitrary user.
2957Instead they must retrieve the appropriate information from the event data only.</p>
f6f96f21
WG
2958<h3 id="bootstrap-scripts">Bootstrap Scripts<a class="headerlink" href="#bootstrap-scripts" title="Permanent link">#</a></h3>
2959<p>WoltLab Suite 6.0 adds package-specific bootstrap scripts allowing a package to execute logic during the application boot to prepare the environment before the request is passed through the middleware pipeline into the controller in <code>RequestHandler</code>.</p>
2960<p>Bootstrap scripts are stored in the <code>lib/bootstrap/</code> directory of WoltLab Suite Core with the package identifier as the file name.
2961They do not need to be registered explicitly, as one future goal of the bootstrap scripts is reducing the amount of system state that needs to be stored within the database.
2962Instead WoltLab Suite Core will automatically create a bootstrap loader that includes all installed bootstrap scripts as part of the package installation and uninstallation process.</p>
2963<p>Bootstrap scripts will be loaded and the bootstrap functions will executed based on a topological sorting of all installed packages.
2964A package can rely on all bootstrap scripts of its dependencies being loaded before its own bootstrap script is loaded.
2965It can also rely on all bootstrap functions of its dependencies having executed before its own bootstrap functions is executed.
2966However it cannot rely on any specific loading and execution order of non-dependencies.</p>
2967<p>As hinted at in the previous paragraph, executing the bootstrap scripts happens in two phases:</p>
2968<ol>
2969<li>All bootstrap scripts will be <code>include()</code>d in topological order. The script is expected to return a <code>Closure</code> that is executed in phase 2.</li>
2970<li>Once all bootstrap scripts have been included, the returned <code>Closure</code>s will be executed in the same order the bootstrap scripts were loaded.</li>
2971</ol>
2972<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/bootstrap/com.example.foo.php</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
2973<span class="normal">2</span>
2974<span class="normal">3</span>
2975<span class="normal">4</span>
2976<span class="normal">5</span>
2977<span class="normal">6</span>
2978<span class="normal">7</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2979
2980<span class="c1">// Phase (1).</span>
2981
2982<span class="k">return</span> <span class="k">static</span> <span class="k">function</span> <span class="p">()</span><span class="o">:</span> <span class="nx">void</span> <span class="p">{</span>
2983 <span class="c1">// Phase (2).</span>
2984<span class="p">};</span>
2985</code></pre></div></td></tr></table></div>
2986<p>For the vast majority of packages it is expected that the phase (1) bootstrapping is not used, except to return the <code>Closure</code>.
2987Instead the logic should reside in the <code>Closure</code>s body that is executed in phase (2).</p>
2988<h4 id="registering-ievent-listeners">Registering <code>IEvent</code> listeners<a class="headerlink" href="#registering-ievent-listeners" title="Permanent link">#</a></h4>
2989<p>An example use case for bootstrap scripts with WoltLab Suite 6.0 is registering event listeners for <code>IEvent</code>-based events that <a href="../../wsc54/php/#events">were added with WoltLab Suite 5.5</a>, instead of using the <a href="../../../package/pip/event-listener/">eventListener PIP</a>.
2990Registering event listeners within the bootstrap script allows you to leverage your IDE’s autocompletion for class names and and prevents forgetting the explicit uninstallation of old event listeners during a package upgrade.</p>
2991<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">files/lib/bootstrap/com.example.bar.php</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
2992<span class="normal"> 2</span>
2993<span class="normal"> 3</span>
2994<span class="normal"> 4</span>
2995<span class="normal"> 5</span>
2996<span class="normal"> 6</span>
2997<span class="normal"> 7</span>
2998<span class="normal"> 8</span>
2999<span class="normal"> 9</span>
3000<span class="normal">10</span>
3001<span class="normal">11</span>
3002<span class="normal">12</span>
3003<span class="normal">13</span>
1a3e25b5
WG
3004<span class="normal">14</span>
3005<span class="normal">15</span>
3006<span class="normal">16</span>
3007<span class="normal">17</span>
3008<span class="normal">18</span>
3009<span class="normal">19</span>
3010<span class="normal">20</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
f6f96f21
WG
3011
3012<span class="k">use</span> <span class="nx">wcf\system\event\EventHandler</span><span class="p">;</span>
3013<span class="k">use</span> <span class="nx">wcf\system\event\listener\ValueDumpListener</span><span class="p">;</span>
3014<span class="k">use</span> <span class="nx">wcf\system\foo\event\ValueAvailable</span><span class="p">;</span>
3015
3016<span class="k">return</span> <span class="k">static</span> <span class="k">function</span> <span class="p">()</span><span class="o">:</span> <span class="nx">void</span> <span class="p">{</span>
1a3e25b5
WG
3017 <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">register</span><span class="p">(</span>
3018 <span class="nx">ValueAvailable</span><span class="o">::</span><span class="na">class</span><span class="p">,</span>
3019 <span class="nx">ValueDumpListener</span><span class="o">::</span><span class="na">class</span>
3020 <span class="p">);</span>
3021
3022 <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">register</span><span class="p">(</span>
3023 <span class="nx">ValueAvailable</span><span class="o">::</span><span class="na">class</span><span class="p">,</span>
3024 <span class="k">static</span> <span class="k">function</span> <span class="p">(</span><span class="nx">ValueAvailable</span> <span class="nv">$event</span><span class="p">)</span><span class="o">:</span> <span class="nx">void</span> <span class="p">{</span>
3025 <span class="c1">// For simple use cases a `Closure` instead of a class name may be used.</span>
3026 <span class="nx">\var_dump</span><span class="p">(</span><span class="nv">$event</span><span class="o">-&gt;</span><span class="na">getValue</span><span class="p">());</span>
3027 <span class="p">}</span>
3028 <span class="p">);</span>
f6f96f21
WG
3029<span class="p">};</span>
3030</code></pre></div></td></tr></table></div>
a99b7289 3031<h2 id="package-system">Package System<a class="headerlink" href="#package-system" title="Permanent link">#</a></h2>
81d424ce
WG
3032<h3 id="required-minversion-for-required-packages">Required “minversion” for required packages<a class="headerlink" href="#required-minversion-for-required-packages" title="Permanent link">#</a></h3>
3033<p>The <code>minversion</code> attribute of the <code>&lt;requiredpackage&gt;</code> tag is now required.</p>
b99b8f08
WG
3034<h3 id="rejection-of-pl-versions">Rejection of “pl” versions<a class="headerlink" href="#rejection-of-pl-versions" title="Permanent link">#</a></h3>
3035<p>Woltlab Suite 6.0 no longer accepts package versions with the “pl” suffix as valid.</p>
a99b7289
WG
3036<h3 id="removal-of-api-compatibility">Removal of API compatibility<a class="headerlink" href="#removal-of-api-compatibility" title="Permanent link">#</a></h3>
3037<p>WoltLab Suite 6.0 removes support for the deprecated API compatibility functionality.
3038Any packages with a <code>&lt;compatibility&gt;</code> tag in their package.xml are assumed to not have been updated for WoltLab Suite 6.0 and will be rejected during installation.
3039Furthermore any packages without an explicit requirement for <code>com.woltlab.wcf</code> in at least version <code>5.4.22</code> are also assumed to not have been updated for WoltLab Suite 6.0 and will also be rejected.
3040The latter check is intended to reject old and most likely incompatible packages where the author forgot to add either an <code>&lt;excludedpackage&gt;</code> or a <code>&lt;compatibility&gt;</code> tag before releasing it.</p>
c72bda6c
WG
3041<h3 id="package-installation-plugins">Package Installation Plugins<a class="headerlink" href="#package-installation-plugins" title="Permanent link">#</a></h3>
3042<h4 id="database">Database<a class="headerlink" href="#database" title="Permanent link">#</a></h4>
3043<p>The <code>$name</code> parameter of <code>DatabaseTableIndex::create()</code> is no longer optional.
3044Relying on the auto-generated index name is strongly discouraged, because of unfixable inconsistent behavior between the SQL PIP and the PHP DDL API.
3045See <a href="https://github.com/WoltLab/WCF/issues/4505">WoltLab/WCF#4505</a> for further background information.</p>
3046<p>The autogenerated name can still be requested by passing an empty string as the <code>$name</code>.
3047This should only be done for backwards compatibility purposes and to migrate an index with an autogenerated name to an index with an explicit name.
3048An example script can be found in <a href="https://github.com/WoltLab/com.woltlab.wcf.conversation/commit/a33677ca051f76e1ddda1de7f8dc62a5484de16e">WoltLab/com.woltlab.wcf.conversation@a33677ca051f</a>.</p>
9aa5da67
WG
3049<h2 id="indicating-parameters-that-hold-sensitive-information">Indicating parameters that hold sensitive information<a class="headerlink" href="#indicating-parameters-that-hold-sensitive-information" title="Permanent link">#</a></h2>
3050<p>PHP 8.2 adds native support for redacting parameters holding sensitive information in stack traces.
3051Parameters with the <code>#[\SensitiveParameter]</code> attribute will show a placeholder value within the stack trace and the error log.</p>
3052<p>WoltLab Suite’s exception handler contains logic to manually apply the sanitization for PHP versions before 8.2.</p>
3053<p>It is strongly recommended to add this attribute to all parameters holding sensitive information.
3054Examples for sensitive parameters include passwords/passphrases, access tokens, plaintext values to be encrypted, or private keys.</p>
3055<p>As attributes are fully backwards and forwards compatible it is possible to apply the attribute to packages targeting older WoltLab Suite or PHP versions without causing errors.</p>
3056<p>Example:</p>
3057<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
3058<span class="normal">2</span>
3059<span class="normal">3</span>
3060<span class="normal">4</span>
3061<span class="normal">5</span>
3062<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">function</span> <span class="nf">checkPassword</span><span class="p">(</span>
3063 <span class="c1">#[\SensitiveParameter]</span>
3064 <span class="nv">$password</span><span class="p">,</span>
3065<span class="p">)</span><span class="o">:</span> <span class="nx">bool</span> <span class="p">{</span>
3066 <span class="c1">// …</span>
3067<span class="p">}</span>
3068</code></pre></div></td></tr></table></div>
3069<p>See the <a href="https://wiki.php.net/rfc/redact_parameters_in_back_traces">PHP RFC: Redacting parameters in back traces</a> for more details.</p>
3ef4d6aa
WG
3070<h2 id="conditions">Conditions<a class="headerlink" href="#conditions" title="Permanent link">#</a></h2>
3071<h3 id="abstractintegercondition">AbstractIntegerCondition<a class="headerlink" href="#abstractintegercondition" title="Permanent link">#</a></h3>
3072<p>Deriving from <code>AbstractIntegerCondition</code> now requires to explicitly implement <code>protected function getIdentifier(): string</code>, instead of setting the <code>$identifier</code> property.
3073This is to ensure that all conditions specify a unique identifier, instead of accidentally relying on a default value.
3074The <code>$identifier</code> property will no longer be used and may be removed.</p>
3075<p>See <a href="https://github.com/WoltLab/WCF/pull/5077">WoltLab/WCF#5077</a> for details.</p>
9aa5da67
WG
3076
3077 <hr>
3078<div class="md-source-file">
3079 <small>
3080
3081 Last update:
1a3e25b5 3082 2022-11-02
9aa5da67
WG
3083
3084 </small>
3085</div>
3086
a06fd3b1
WG
3087
3088
3089
7f9945cf
WG
3090
3091
3092 </article>
3093 </div>
3094
3095
9aa5da67
WG
3096 </div>
3097
3098 </main>
3099
3100 <footer class="md-footer">
3101
3102
3103 <nav class="md-footer__inner md-grid" aria-label="Footer" >
3104
3105
3106 <a href="../../../package/database-php-api/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Database PHP API" rel="prev">
3107 <div class="md-footer__button md-icon">
3108 <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>
3109 </div>
3110 <div class="md-footer__title">
3111 <div class="md-ellipsis">
3112 <span class="md-footer__direction">
3113 Previous
3114 </span>
3115 Database PHP API
3116 </div>
3117 </div>
3118 </a>
3119
3120
3121
3122 <a href="../javascript/" class="md-footer__link md-footer__link--next" aria-label="Next: TypeScript and JavaScript" rel="next">
3123 <div class="md-footer__title">
3124 <div class="md-ellipsis">
3125 <span class="md-footer__direction">
3126 Next
3127 </span>
3128 TypeScript and JavaScript
3129 </div>
3130 </div>
3131 <div class="md-footer__button md-icon">
3132 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
3133 </div>
3134 </a>
3135
3136 </nav>
3137
3138 <div class="md-footer-meta md-typeset">
3139 <div class="md-footer-meta__inner md-grid">
3140 <div class="md-copyright">
3141
3142 <div class="md-copyright__highlight">
3143 Copyright © 2020 WoltLab GmbH
3144 </div>
3145
3146
3147 Made with
3148 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
3149 Material for MkDocs
3150 </a>
3151
3152</div>
3153
3154 <div class="md-copyright">
3155 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
3156 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
3157</div>
3158
3159 </div>
3160 </div>
3161</footer>
3162
3163 </div>
3164 <div class="md-dialog" data-md-component="dialog">
3165 <div class="md-dialog__inner md-typeset"></div>
3166 </div>
a06fd3b1 3167
d7f375d7 3168 <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.tracking"], "search": "../../../assets/javascripts/workers/search.16e2a7d4.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "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.title": "Select version"}, "version": {"provider": "mike"}}</script>
9aa5da67
WG
3169
3170
d7f375d7 3171 <script src="../../../assets/javascripts/bundle.8492ddcf.min.js"></script>
9aa5da67
WG
3172
3173
3174 </body>
3175</html>