Deployed 506b5bb to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / latest / php / api / user_notifications / 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
12 <link rel="shortcut icon" href="../../../assets/default.favicon.ico">
13 <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.0.5">
14
15
16
17 <title>User Notifications - WoltLab Suite Documentation</title>
18
19
20
21 <link rel="stylesheet" href="../../../assets/stylesheets/main.77f3fd56.min.css">
22
23
24 <link rel="stylesheet" href="../../../assets/stylesheets/palette.7fa14f5b.min.css">
25
26
27
28 <meta name="theme-color" content="#009485">
29
30
31
32
33
34
35
36
37 <link rel="stylesheet" href="../../../stylesheets/extra.css">
38
39
40
41
42
43 </head>
44
45
46
47
48
49
50
51 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="">
52
53
54
55 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
56 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
57 <label class="md-overlay" for="__drawer"></label>
58 <div data-md-component="skip">
59
60
61 <a href="#user-notifications" class="md-skip">
62 Skip to content
63 </a>
64
65 </div>
66 <div data-md-component="announce">
67
68 <aside class="md-announce">
69 <div class="md-announce__inner md-grid md-typeset">
70
71 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
72
73 </div>
74 </aside>
75
76 </div>
77
78
79
80 <header class="md-header" data-md-component="header">
81 <nav class="md-header__inner md-grid" aria-label="Header">
82 <a href="../../.." title="WoltLab Suite Documentation" class="md-header__button md-logo" aria-label="WoltLab Suite Documentation">
83
84 <img src="../../../assets/logo.png" alt="logo">
85
86 </a>
87 <label class="md-header__button md-icon" for="__drawer">
88 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
89 </label>
90 <div class="md-header__title" data-md-component="header-title">
91 <div class="md-header__ellipsis">
92 <div class="md-header__topic">
93 <span class="md-ellipsis">
94 WoltLab Suite Documentation
95 </span>
96 </div>
97 <div class="md-header__topic" data-md-component="header-topic">
98 <span class="md-ellipsis">
99
100 User Notifications
101
102 </span>
103 </div>
104 </div>
105 </div>
106 <div class="md-header__options">
107
108 </div>
109
110 <label class="md-header__button md-icon" for="__search">
111 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
112 </label>
113
114 <div class="md-search" data-md-component="search" role="dialog">
115 <label class="md-search__overlay" for="__search"></label>
116 <div class="md-search__inner" role="search">
117 <form class="md-search__form" name="search">
118 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active" required>
119 <label class="md-search__icon md-icon" for="__search">
120 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
121 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
122 </label>
123 <button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
124 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
125 </button>
126 </form>
127 <div class="md-search__output">
128 <div class="md-search__scrollwrap" data-md-scrollfix>
129 <div class="md-search-result" data-md-component="search-result">
130 <div class="md-search-result__meta">
131 Initializing search
132 </div>
133 <ol class="md-search-result__list"></ol>
134 </div>
135 </div>
136 </div>
137 </div>
138 </div>
139
140
141 </nav>
142 </header>
143
144 <div class="md-container" data-md-component="container">
145
146
147
148
149 <main class="md-main" data-md-component="main">
150 <div class="md-main__inner md-grid">
151
152
153
154 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
155 <div class="md-sidebar__scrollwrap">
156 <div class="md-sidebar__inner">
157
158
159
160
161
162 <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
163 <label class="md-nav__title" for="__drawer">
164 <a href="../../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation">
165
166 <img src="../../../assets/logo.png" alt="logo">
167
168 </a>
169 WoltLab Suite Documentation
170 </label>
171
172 <ul class="md-nav__list" data-md-scrollfix>
173
174
175
176
177
178
179
180
181 <li class="md-nav__item">
182 <a href="../../../getting-started/" class="md-nav__link">
183 Getting Started
184 </a>
185 </li>
186
187
188
189
190
191
192
193
194
195
196
197
198
199 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
200
201
202 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" checked>
203
204 <label class="md-nav__link" for="__nav_2">
205 PHP API
206 <span class="md-nav__icon md-icon"></span>
207 </label>
208 <nav class="md-nav" aria-label="PHP API" data-md-level="1">
209 <label class="md-nav__title" for="__nav_2">
210 <span class="md-nav__icon md-icon"></span>
211 PHP API
212 </label>
213 <ul class="md-nav__list" data-md-scrollfix>
214
215
216
217
218
219 <li class="md-nav__item">
220 <a href="../../pages/" class="md-nav__link">
221 Pages
222 </a>
223 </li>
224
225
226
227
228
229
230
231 <li class="md-nav__item">
232 <a href="../../database-objects/" class="md-nav__link">
233 Database Objects
234 </a>
235 </li>
236
237
238
239
240
241
242
243 <li class="md-nav__item">
244 <a href="../../database-access/" class="md-nav__link">
245 Database Access
246 </a>
247 </li>
248
249
250
251
252
253
254
255 <li class="md-nav__item">
256 <a href="../../exceptions/" class="md-nav__link">
257 Exceptions
258 </a>
259 </li>
260
261
262
263
264
265
266
267
268
269
270 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
271
272
273 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" checked>
274
275 <label class="md-nav__link" for="__nav_2_5">
276 API
277 <span class="md-nav__icon md-icon"></span>
278 </label>
279 <nav class="md-nav" aria-label="API" data-md-level="2">
280 <label class="md-nav__title" for="__nav_2_5">
281 <span class="md-nav__icon md-icon"></span>
282 API
283 </label>
284 <ul class="md-nav__list" data-md-scrollfix>
285
286
287
288
289
290 <li class="md-nav__item">
291 <a href="../caches/" class="md-nav__link">
292 Caches
293 </a>
294 </li>
295
296
297
298
299
300
301
302 <li class="md-nav__item">
303 <a href="../comments/" class="md-nav__link">
304 Comments
305 </a>
306 </li>
307
308
309
310
311
312
313
314 <li class="md-nav__item">
315 <a href="../cronjobs/" class="md-nav__link">
316 Cronjobs
317 </a>
318 </li>
319
320
321
322
323
324
325
326 <li class="md-nav__item">
327 <a href="../events/" class="md-nav__link">
328 Events
329 </a>
330 </li>
331
332
333
334
335
336
337
338
339 <li class="md-nav__item md-nav__item--nested">
340
341
342 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" >
343
344 <label class="md-nav__link" for="__nav_2_5_5">
345 Form Builder
346 <span class="md-nav__icon md-icon"></span>
347 </label>
348 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
349 <label class="md-nav__title" for="__nav_2_5_5">
350 <span class="md-nav__icon md-icon"></span>
351 Form Builder
352 </label>
353 <ul class="md-nav__list" data-md-scrollfix>
354
355
356
357
358
359 <li class="md-nav__item">
360 <a href="../form_builder/overview/" class="md-nav__link">
361 Overview
362 </a>
363 </li>
364
365
366
367
368
369
370
371 <li class="md-nav__item">
372 <a href="../form_builder/structure/" class="md-nav__link">
373 Structure
374 </a>
375 </li>
376
377
378
379
380
381
382
383 <li class="md-nav__item">
384 <a href="../form_builder/form_fields/" class="md-nav__link">
385 Fields
386 </a>
387 </li>
388
389
390
391
392
393
394
395 <li class="md-nav__item">
396 <a href="../form_builder/validation_data/" class="md-nav__link">
397 Validation and Data
398 </a>
399 </li>
400
401
402
403
404
405
406
407 <li class="md-nav__item">
408 <a href="../form_builder/dependencies/" class="md-nav__link">
409 Dependencies
410 </a>
411 </li>
412
413
414
415 </ul>
416 </nav>
417 </li>
418
419
420
421
422
423
424
425 <li class="md-nav__item">
426 <a href="../package_installation_plugins/" class="md-nav__link">
427 Package Installation Plugins
428 </a>
429 </li>
430
431
432
433
434
435
436
437 <li class="md-nav__item">
438 <a href="../user_activity_points/" class="md-nav__link">
439 User Activity Points
440 </a>
441 </li>
442
443
444
445
446
447
448
449
450
451 <li class="md-nav__item md-nav__item--active">
452
453 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
454
455
456
457
458 <label class="md-nav__link md-nav__link--active" for="__toc">
459 User Notifications
460 <span class="md-nav__icon md-icon"></span>
461 </label>
462
463 <a href="./" class="md-nav__link md-nav__link--active">
464 User Notifications
465 </a>
466
467
468 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
469
470
471
472
473
474 <label class="md-nav__title" for="__toc">
475 <span class="md-nav__icon md-icon"></span>
476 Table of contents
477 </label>
478 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
479
480 <li class="md-nav__item">
481 <a href="#objecttypexml" class="md-nav__link">
482 objectType.xml
483 </a>
484
485 </li>
486
487 <li class="md-nav__item">
488 <a href="#usernotificationeventxml" class="md-nav__link">
489 userNotificationEvent.xml
490 </a>
491
492 </li>
493
494 <li class="md-nav__item">
495 <a href="#firing-events" class="md-nav__link">
496 Firing Events
497 </a>
498
499 </li>
500
501 <li class="md-nav__item">
502 <a href="#marking-notifications-as-confirmed" class="md-nav__link">
503 Marking Notifications as Confirmed
504 </a>
505
506 </li>
507
508 </ul>
509
510 </nav>
511
512 </li>
513
514
515
516
517
518
519
520 <li class="md-nav__item">
521 <a href="../sitemaps/" class="md-nav__link">
522 Sitemaps
523 </a>
524 </li>
525
526
527
528 </ul>
529 </nav>
530 </li>
531
532
533
534
535
536
537
538 <li class="md-nav__item">
539 <a href="../../code-style/" class="md-nav__link">
540 Code Style
541 </a>
542 </li>
543
544
545
546
547
548
549
550 <li class="md-nav__item">
551 <a href="../../apps/" class="md-nav__link">
552 Apps
553 </a>
554 </li>
555
556
557
558
559
560
561
562 <li class="md-nav__item">
563 <a href="../../gdpr/" class="md-nav__link">
564 GDPR
565 </a>
566 </li>
567
568
569
570 </ul>
571 </nav>
572 </li>
573
574
575
576
577
578
579
580
581
582
583
584 <li class="md-nav__item md-nav__item--nested">
585
586
587 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
588
589 <label class="md-nav__link" for="__nav_3">
590 Languages, Templates & CSS
591 <span class="md-nav__icon md-icon"></span>
592 </label>
593 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
594 <label class="md-nav__title" for="__nav_3">
595 <span class="md-nav__icon md-icon"></span>
596 Languages, Templates & CSS
597 </label>
598 <ul class="md-nav__list" data-md-scrollfix>
599
600
601
602
603
604 <li class="md-nav__item">
605 <a href="../../../view/languages/" class="md-nav__link">
606 Languages
607 </a>
608 </li>
609
610
611
612
613
614
615
616 <li class="md-nav__item">
617 <a href="../../../view/templates/" class="md-nav__link">
618 Templates
619 </a>
620 </li>
621
622
623
624
625
626
627
628 <li class="md-nav__item">
629 <a href="../../../view/css/" class="md-nav__link">
630 CSS
631 </a>
632 </li>
633
634
635
636 </ul>
637 </nav>
638 </li>
639
640
641
642
643
644
645
646
647
648
649
650 <li class="md-nav__item md-nav__item--nested">
651
652
653 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
654
655 <label class="md-nav__link" for="__nav_4">
656 JavaScript API
657 <span class="md-nav__icon md-icon"></span>
658 </label>
659 <nav class="md-nav" aria-label="JavaScript API" data-md-level="1">
660 <label class="md-nav__title" for="__nav_4">
661 <span class="md-nav__icon md-icon"></span>
662 JavaScript API
663 </label>
664 <ul class="md-nav__list" data-md-scrollfix>
665
666
667
668
669
670 <li class="md-nav__item">
671 <a href="../../../javascript/general-usage/" class="md-nav__link">
672 General Usage
673 </a>
674 </li>
675
676
677
678
679
680
681
682
683 <li class="md-nav__item md-nav__item--nested">
684
685
686 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
687
688 <label class="md-nav__link" for="__nav_4_2">
689 New API
690 <span class="md-nav__icon md-icon"></span>
691 </label>
692 <nav class="md-nav" aria-label="New API" data-md-level="2">
693 <label class="md-nav__title" for="__nav_4_2">
694 <span class="md-nav__icon md-icon"></span>
695 New API
696 </label>
697 <ul class="md-nav__list" data-md-scrollfix>
698
699
700
701
702
703 <li class="md-nav__item">
704 <a href="../../../javascript/new-api_writing-a-module/" class="md-nav__link">
705 Writing a module
706 </a>
707 </li>
708
709
710
711
712
713
714
715 <li class="md-nav__item">
716 <a href="../../../javascript/new-api_data-structures/" class="md-nav__link">
717 Data Structures
718 </a>
719 </li>
720
721
722
723
724
725
726
727 <li class="md-nav__item">
728 <a href="../../../javascript/new-api_core/" class="md-nav__link">
729 Core Functions
730 </a>
731 </li>
732
733
734
735
736
737
738
739 <li class="md-nav__item">
740 <a href="../../../javascript/new-api_dom/" class="md-nav__link">
741 DOM
742 </a>
743 </li>
744
745
746
747
748
749
750
751 <li class="md-nav__item">
752 <a href="../../../javascript/new-api_events/" class="md-nav__link">
753 Event Handling
754 </a>
755 </li>
756
757
758
759
760
761
762
763 <li class="md-nav__item">
764 <a href="../../../javascript/new-api_ajax/" class="md-nav__link">
765 Ajax
766 </a>
767 </li>
768
769
770
771
772
773
774
775 <li class="md-nav__item">
776 <a href="../../../javascript/new-api_dialogs/" class="md-nav__link">
777 Dialogs
778 </a>
779 </li>
780
781
782
783
784
785
786
787 <li class="md-nav__item">
788 <a href="../../../javascript/new-api_browser/" class="md-nav__link">
789 Browser and Screen Sizes
790 </a>
791 </li>
792
793
794
795
796
797
798
799 <li class="md-nav__item">
800 <a href="../../../javascript/new-api_ui/" class="md-nav__link">
801 User Interface
802 </a>
803 </li>
804
805
806
807 </ul>
808 </nav>
809 </li>
810
811
812
813
814
815
816
817 <li class="md-nav__item">
818 <a href="../../../javascript/legacy-api/" class="md-nav__link">
819 Legacy API
820 </a>
821 </li>
822
823
824
825
826
827
828
829 <li class="md-nav__item">
830 <a href="../../../javascript/helper-functions/" class="md-nav__link">
831 Helper Functions
832 </a>
833 </li>
834
835
836
837
838
839
840
841 <li class="md-nav__item">
842 <a href="../../../javascript/code-snippets/" class="md-nav__link">
843 Code Snippets
844 </a>
845 </li>
846
847
848
849 </ul>
850 </nav>
851 </li>
852
853
854
855
856
857
858
859
860
861
862
863 <li class="md-nav__item md-nav__item--nested">
864
865
866 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
867
868 <label class="md-nav__link" for="__nav_5">
869 Package Components
870 <span class="md-nav__icon md-icon"></span>
871 </label>
872 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
873 <label class="md-nav__title" for="__nav_5">
874 <span class="md-nav__icon md-icon"></span>
875 Package Components
876 </label>
877 <ul class="md-nav__list" data-md-scrollfix>
878
879
880
881
882
883 <li class="md-nav__item">
884 <a href="../../../package/package-xml/" class="md-nav__link">
885 package.xml
886 </a>
887 </li>
888
889
890
891
892
893
894
895
896 <li class="md-nav__item md-nav__item--nested">
897
898
899 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
900
901 <label class="md-nav__link" for="__nav_5_2">
902 PIPs
903 <span class="md-nav__icon md-icon"></span>
904 </label>
905 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
906 <label class="md-nav__title" for="__nav_5_2">
907 <span class="md-nav__icon md-icon"></span>
908 PIPs
909 </label>
910 <ul class="md-nav__list" data-md-scrollfix>
911
912
913
914
915
916 <li class="md-nav__item">
917 <a href="../../../package/pip/" class="md-nav__link">
918 Overview
919 </a>
920 </li>
921
922
923
924
925
926
927
928 <li class="md-nav__item">
929 <a href="../../../package/pip/acl-option/" class="md-nav__link">
930 aclOption
931 </a>
932 </li>
933
934
935
936
937
938
939
940 <li class="md-nav__item">
941 <a href="../../../package/pip/acp-menu/" class="md-nav__link">
942 acpMenu
943 </a>
944 </li>
945
946
947
948
949
950
951
952 <li class="md-nav__item">
953 <a href="../../../package/pip/acp-search-provider/" class="md-nav__link">
954 acpSearchProvider
955 </a>
956 </li>
957
958
959
960
961
962
963
964 <li class="md-nav__item">
965 <a href="../../../package/pip/acp-template/" class="md-nav__link">
966 acpTemplate
967 </a>
968 </li>
969
970
971
972
973
974
975
976 <li class="md-nav__item">
977 <a href="../../../package/pip/bbcode/" class="md-nav__link">
978 bbcode
979 </a>
980 </li>
981
982
983
984
985
986
987
988 <li class="md-nav__item">
989 <a href="../../../package/pip/box/" class="md-nav__link">
990 box
991 </a>
992 </li>
993
994
995
996
997
998
999
1000 <li class="md-nav__item">
1001 <a href="../../../package/pip/clipboard-action/" class="md-nav__link">
1002 clipboardAction
1003 </a>
1004 </li>
1005
1006
1007
1008
1009
1010
1011
1012 <li class="md-nav__item">
1013 <a href="../../../package/pip/core-object/" class="md-nav__link">
1014 coreObject
1015 </a>
1016 </li>
1017
1018
1019
1020
1021
1022
1023
1024 <li class="md-nav__item">
1025 <a href="../../../package/pip/cronjob/" class="md-nav__link">
1026 cronjob
1027 </a>
1028 </li>
1029
1030
1031
1032
1033
1034
1035
1036 <li class="md-nav__item">
1037 <a href="../../../package/pip/event-listener/" class="md-nav__link">
1038 eventListener
1039 </a>
1040 </li>
1041
1042
1043
1044
1045
1046
1047
1048 <li class="md-nav__item">
1049 <a href="../../../package/pip/file/" class="md-nav__link">
1050 file
1051 </a>
1052 </li>
1053
1054
1055
1056
1057
1058
1059
1060 <li class="md-nav__item">
1061 <a href="../../../package/pip/language/" class="md-nav__link">
1062 language
1063 </a>
1064 </li>
1065
1066
1067
1068
1069
1070
1071
1072 <li class="md-nav__item">
1073 <a href="../../../package/pip/media-provider/" class="md-nav__link">
1074 mediaProvider
1075 </a>
1076 </li>
1077
1078
1079
1080
1081
1082
1083
1084 <li class="md-nav__item">
1085 <a href="../../../package/pip/menu/" class="md-nav__link">
1086 menu
1087 </a>
1088 </li>
1089
1090
1091
1092
1093
1094
1095
1096 <li class="md-nav__item">
1097 <a href="../../../package/pip/menu-item/" class="md-nav__link">
1098 menuItem
1099 </a>
1100 </li>
1101
1102
1103
1104
1105
1106
1107
1108 <li class="md-nav__item">
1109 <a href="../../../package/pip/object-type/" class="md-nav__link">
1110 objectType
1111 </a>
1112 </li>
1113
1114
1115
1116
1117
1118
1119
1120 <li class="md-nav__item">
1121 <a href="../../../package/pip/object-type-definition/" class="md-nav__link">
1122 objectTypeDefinition
1123 </a>
1124 </li>
1125
1126
1127
1128
1129
1130
1131
1132 <li class="md-nav__item">
1133 <a href="../../../package/pip/option/" class="md-nav__link">
1134 option
1135 </a>
1136 </li>
1137
1138
1139
1140
1141
1142
1143
1144 <li class="md-nav__item">
1145 <a href="../../../package/pip/page/" class="md-nav__link">
1146 page
1147 </a>
1148 </li>
1149
1150
1151
1152
1153
1154
1155
1156 <li class="md-nav__item">
1157 <a href="../../../package/pip/pip/" class="md-nav__link">
1158 pip
1159 </a>
1160 </li>
1161
1162
1163
1164
1165
1166
1167
1168 <li class="md-nav__item">
1169 <a href="../../../package/pip/script/" class="md-nav__link">
1170 script
1171 </a>
1172 </li>
1173
1174
1175
1176
1177
1178
1179
1180 <li class="md-nav__item">
1181 <a href="../../../package/pip/smiley/" class="md-nav__link">
1182 smiley
1183 </a>
1184 </li>
1185
1186
1187
1188
1189
1190
1191
1192 <li class="md-nav__item">
1193 <a href="../../../package/pip/sql/" class="md-nav__link">
1194 sql
1195 </a>
1196 </li>
1197
1198
1199
1200
1201
1202
1203
1204 <li class="md-nav__item">
1205 <a href="../../../package/pip/style/" class="md-nav__link">
1206 style
1207 </a>
1208 </li>
1209
1210
1211
1212
1213
1214
1215
1216 <li class="md-nav__item">
1217 <a href="../../../package/pip/template/" class="md-nav__link">
1218 template
1219 </a>
1220 </li>
1221
1222
1223
1224
1225
1226
1227
1228 <li class="md-nav__item">
1229 <a href="../../../package/pip/template-listener/" class="md-nav__link">
1230 templateListener
1231 </a>
1232 </li>
1233
1234
1235
1236
1237
1238
1239
1240 <li class="md-nav__item">
1241 <a href="../../../package/pip/user-group-option/" class="md-nav__link">
1242 userGroupOption
1243 </a>
1244 </li>
1245
1246
1247
1248
1249
1250
1251
1252 <li class="md-nav__item">
1253 <a href="../../../package/pip/user-menu/" class="md-nav__link">
1254 userMenu
1255 </a>
1256 </li>
1257
1258
1259
1260
1261
1262
1263
1264 <li class="md-nav__item">
1265 <a href="../../../package/pip/user-notification-event/" class="md-nav__link">
1266 userNotificationEvent
1267 </a>
1268 </li>
1269
1270
1271
1272
1273
1274
1275
1276 <li class="md-nav__item">
1277 <a href="../../../package/pip/user-option/" class="md-nav__link">
1278 userOption
1279 </a>
1280 </li>
1281
1282
1283
1284
1285
1286
1287
1288 <li class="md-nav__item">
1289 <a href="../../../package/pip/user-profile-menu/" class="md-nav__link">
1290 userProfileMenu
1291 </a>
1292 </li>
1293
1294
1295
1296 </ul>
1297 </nav>
1298 </li>
1299
1300
1301
1302
1303
1304
1305
1306 <li class="md-nav__item">
1307 <a href="../../../package/database-php-api/" class="md-nav__link">
1308 Database PHP API
1309 </a>
1310 </li>
1311
1312
1313
1314 </ul>
1315 </nav>
1316 </li>
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328 <li class="md-nav__item md-nav__item--nested">
1329
1330
1331 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
1332
1333 <label class="md-nav__link" for="__nav_6">
1334 Migration
1335 <span class="md-nav__icon md-icon"></span>
1336 </label>
1337 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1338 <label class="md-nav__title" for="__nav_6">
1339 <span class="md-nav__icon md-icon"></span>
1340 Migration
1341 </label>
1342 <ul class="md-nav__list" data-md-scrollfix>
1343
1344
1345
1346
1347
1348
1349 <li class="md-nav__item md-nav__item--nested">
1350
1351
1352 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" >
1353
1354 <label class="md-nav__link" for="__nav_6_1">
1355 Migrating from WSC 5.3
1356 <span class="md-nav__icon md-icon"></span>
1357 </label>
1358 <nav class="md-nav" aria-label="Migrating from WSC 5.3" data-md-level="2">
1359 <label class="md-nav__title" for="__nav_6_1">
1360 <span class="md-nav__icon md-icon"></span>
1361 Migrating from WSC 5.3
1362 </label>
1363 <ul class="md-nav__list" data-md-scrollfix>
1364
1365
1366
1367
1368
1369 <li class="md-nav__item">
1370 <a href="../../../migration/wsc53/php/" class="md-nav__link">
1371 PHP API
1372 </a>
1373 </li>
1374
1375
1376
1377
1378
1379
1380
1381 <li class="md-nav__item">
1382 <a href="../../../migration/wsc53/session/" class="md-nav__link">
1383 Session Handling and Authentication
1384 </a>
1385 </li>
1386
1387
1388
1389
1390
1391
1392
1393 <li class="md-nav__item">
1394 <a href="../../../migration/wsc53/javascript/" class="md-nav__link">
1395 JavaScript
1396 </a>
1397 </li>
1398
1399
1400
1401
1402
1403
1404
1405 <li class="md-nav__item">
1406 <a href="../../../migration/wsc53/templates/" class="md-nav__link">
1407 Templates
1408 </a>
1409 </li>
1410
1411
1412
1413
1414
1415
1416
1417 <li class="md-nav__item">
1418 <a href="../../../migration/wsc53/libraries/" class="md-nav__link">
1419 Third Party Libraries
1420 </a>
1421 </li>
1422
1423
1424
1425 </ul>
1426 </nav>
1427 </li>
1428
1429
1430
1431
1432
1433
1434
1435
1436 <li class="md-nav__item md-nav__item--nested">
1437
1438
1439 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
1440
1441 <label class="md-nav__link" for="__nav_6_2">
1442 Migrating from WSC 5.2
1443 <span class="md-nav__icon md-icon"></span>
1444 </label>
1445 <nav class="md-nav" aria-label="Migrating from WSC 5.2" data-md-level="2">
1446 <label class="md-nav__title" for="__nav_6_2">
1447 <span class="md-nav__icon md-icon"></span>
1448 Migrating from WSC 5.2
1449 </label>
1450 <ul class="md-nav__list" data-md-scrollfix>
1451
1452
1453
1454
1455
1456 <li class="md-nav__item">
1457 <a href="../../../migration/wsc52/php/" class="md-nav__link">
1458 PHP API
1459 </a>
1460 </li>
1461
1462
1463
1464
1465
1466
1467
1468 <li class="md-nav__item">
1469 <a href="../../../migration/wsc52/templates/" class="md-nav__link">
1470 Templates and Languages
1471 </a>
1472 </li>
1473
1474
1475
1476
1477
1478
1479
1480 <li class="md-nav__item">
1481 <a href="../../../migration/wsc52/libraries/" class="md-nav__link">
1482 Third Party Libraries
1483 </a>
1484 </li>
1485
1486
1487
1488 </ul>
1489 </nav>
1490 </li>
1491
1492
1493
1494
1495
1496
1497
1498
1499 <li class="md-nav__item md-nav__item--nested">
1500
1501
1502 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" >
1503
1504 <label class="md-nav__link" for="__nav_6_3">
1505 Migrating from WSC 3.1
1506 <span class="md-nav__icon md-icon"></span>
1507 </label>
1508 <nav class="md-nav" aria-label="Migrating from WSC 3.1" data-md-level="2">
1509 <label class="md-nav__title" for="__nav_6_3">
1510 <span class="md-nav__icon md-icon"></span>
1511 Migrating from WSC 3.1
1512 </label>
1513 <ul class="md-nav__list" data-md-scrollfix>
1514
1515
1516
1517
1518
1519 <li class="md-nav__item">
1520 <a href="../../../migration/wsc31/php/" class="md-nav__link">
1521 PHP API
1522 </a>
1523 </li>
1524
1525
1526
1527 </ul>
1528 </nav>
1529 </li>
1530
1531
1532
1533
1534
1535
1536
1537
1538 <li class="md-nav__item md-nav__item--nested">
1539
1540
1541 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
1542
1543 <label class="md-nav__link" for="__nav_6_4">
1544 Migrating from WSC 3.0
1545 <span class="md-nav__icon md-icon"></span>
1546 </label>
1547 <nav class="md-nav" aria-label="Migrating from WSC 3.0" data-md-level="2">
1548 <label class="md-nav__title" for="__nav_6_4">
1549 <span class="md-nav__icon md-icon"></span>
1550 Migrating from WSC 3.0
1551 </label>
1552 <ul class="md-nav__list" data-md-scrollfix>
1553
1554
1555
1556
1557
1558 <li class="md-nav__item">
1559 <a href="../../../migration/wsc30/php/" class="md-nav__link">
1560 PHP API
1561 </a>
1562 </li>
1563
1564
1565
1566
1567
1568
1569
1570 <li class="md-nav__item">
1571 <a href="../../../migration/wsc30/javascript/" class="md-nav__link">
1572 JavaScript API
1573 </a>
1574 </li>
1575
1576
1577
1578
1579
1580
1581
1582 <li class="md-nav__item">
1583 <a href="../../../migration/wsc30/templates/" class="md-nav__link">
1584 Templates
1585 </a>
1586 </li>
1587
1588
1589
1590
1591
1592
1593
1594 <li class="md-nav__item">
1595 <a href="../../../migration/wsc30/css/" class="md-nav__link">
1596 CSS
1597 </a>
1598 </li>
1599
1600
1601
1602
1603
1604
1605
1606 <li class="md-nav__item">
1607 <a href="../../../migration/wsc30/package/" class="md-nav__link">
1608 Package Components
1609 </a>
1610 </li>
1611
1612
1613
1614 </ul>
1615 </nav>
1616 </li>
1617
1618
1619
1620
1621
1622
1623
1624
1625 <li class="md-nav__item md-nav__item--nested">
1626
1627
1628 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
1629
1630 <label class="md-nav__link" for="__nav_6_5">
1631 Migrating from WCF 2.1
1632 <span class="md-nav__icon md-icon"></span>
1633 </label>
1634 <nav class="md-nav" aria-label="Migrating from WCF 2.1" data-md-level="2">
1635 <label class="md-nav__title" for="__nav_6_5">
1636 <span class="md-nav__icon md-icon"></span>
1637 Migrating from WCF 2.1
1638 </label>
1639 <ul class="md-nav__list" data-md-scrollfix>
1640
1641
1642
1643
1644
1645 <li class="md-nav__item">
1646 <a href="../../../migration/wcf21/php/" class="md-nav__link">
1647 PHP API
1648 </a>
1649 </li>
1650
1651
1652
1653
1654
1655
1656
1657 <li class="md-nav__item">
1658 <a href="../../../migration/wcf21/templates/" class="md-nav__link">
1659 Templates
1660 </a>
1661 </li>
1662
1663
1664
1665
1666
1667
1668
1669 <li class="md-nav__item">
1670 <a href="../../../migration/wcf21/css/" class="md-nav__link">
1671 CSS
1672 </a>
1673 </li>
1674
1675
1676
1677
1678
1679
1680
1681 <li class="md-nav__item">
1682 <a href="../../../migration/wcf21/package/" class="md-nav__link">
1683 Package Components
1684 </a>
1685 </li>
1686
1687
1688
1689 </ul>
1690 </nav>
1691 </li>
1692
1693
1694
1695 </ul>
1696 </nav>
1697 </li>
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709 <li class="md-nav__item md-nav__item--nested">
1710
1711
1712 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
1713
1714 <label class="md-nav__link" for="__nav_7">
1715 Tutorials
1716 <span class="md-nav__icon md-icon"></span>
1717 </label>
1718 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
1719 <label class="md-nav__title" for="__nav_7">
1720 <span class="md-nav__icon md-icon"></span>
1721 Tutorials
1722 </label>
1723 <ul class="md-nav__list" data-md-scrollfix>
1724
1725
1726
1727
1728
1729
1730 <li class="md-nav__item md-nav__item--nested">
1731
1732
1733 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
1734
1735 <label class="md-nav__link" for="__nav_7_1">
1736 Tutorial Series
1737 <span class="md-nav__icon md-icon"></span>
1738 </label>
1739 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
1740 <label class="md-nav__title" for="__nav_7_1">
1741 <span class="md-nav__icon md-icon"></span>
1742 Tutorial Series
1743 </label>
1744 <ul class="md-nav__list" data-md-scrollfix>
1745
1746
1747
1748
1749
1750 <li class="md-nav__item">
1751 <a href="../../../tutorial/series/overview/" class="md-nav__link">
1752 Overview
1753 </a>
1754 </li>
1755
1756
1757
1758
1759
1760
1761
1762 <li class="md-nav__item">
1763 <a href="../../../tutorial/series/part_1/" class="md-nav__link">
1764 Part 1
1765 </a>
1766 </li>
1767
1768
1769
1770
1771
1772
1773
1774 <li class="md-nav__item">
1775 <a href="../../../tutorial/series/part_2/" class="md-nav__link">
1776 Part 2
1777 </a>
1778 </li>
1779
1780
1781
1782
1783
1784
1785
1786 <li class="md-nav__item">
1787 <a href="../../../tutorial/series/part_3/" class="md-nav__link">
1788 Part 3
1789 </a>
1790 </li>
1791
1792
1793
1794 </ul>
1795 </nav>
1796 </li>
1797
1798
1799
1800 </ul>
1801 </nav>
1802 </li>
1803
1804
1805
1806 </ul>
1807 </nav>
1808 </div>
1809 </div>
1810 </div>
1811
1812
1813
1814 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1815 <div class="md-sidebar__scrollwrap">
1816 <div class="md-sidebar__inner">
1817
1818 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1819
1820
1821
1822
1823
1824 <label class="md-nav__title" for="__toc">
1825 <span class="md-nav__icon md-icon"></span>
1826 Table of contents
1827 </label>
1828 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1829
1830 <li class="md-nav__item">
1831 <a href="#objecttypexml" class="md-nav__link">
1832 objectType.xml
1833 </a>
1834
1835 </li>
1836
1837 <li class="md-nav__item">
1838 <a href="#usernotificationeventxml" class="md-nav__link">
1839 userNotificationEvent.xml
1840 </a>
1841
1842 </li>
1843
1844 <li class="md-nav__item">
1845 <a href="#firing-events" class="md-nav__link">
1846 Firing Events
1847 </a>
1848
1849 </li>
1850
1851 <li class="md-nav__item">
1852 <a href="#marking-notifications-as-confirmed" class="md-nav__link">
1853 Marking Notifications as Confirmed
1854 </a>
1855
1856 </li>
1857
1858 </ul>
1859
1860 </nav>
1861 </div>
1862 </div>
1863 </div>
1864
1865
1866 <div class="md-content" data-md-component="content">
1867 <article class="md-content__inner md-typeset">
1868
1869
1870
1871 <h1 id="user-notifications">User Notifications<a class="headerlink" href="#user-notifications" title="Permanent link">#</a></h1>
1872 <p>WoltLab Suite includes a powerful user notification system that supports notifications directly shown on the website and emails sent immediately or on a daily basis.</p>
1873 <h2 id="objecttypexml"><code>objectType.xml</code><a class="headerlink" href="#objecttypexml" title="Permanent link">#</a></h2>
1874 <p>For any type of object related to events, you have to define an object type for the object type definition <code>com.woltlab.wcf.notification.objectType</code>:</p>
1875 <div class="highlight"><pre><span></span><code><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
1876 <span class="nt">&lt;data</span> <span class="na">xmlns=</span><span class="s">&quot;http://www.woltlab.com&quot;</span> <span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> <span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://www.woltlab.com http://www.woltlab.com/XSD/2019/objectType.xsd&quot;</span><span class="nt">&gt;</span>
1877 <span class="nt">&lt;import&gt;</span>
1878 <span class="nt">&lt;type&gt;</span>
1879 <span class="nt">&lt;name&gt;</span>com.woltlab.example.foo<span class="nt">&lt;/name&gt;</span>
1880 <span class="nt">&lt;definitionname&gt;</span>com.woltlab.wcf.notification.objectType<span class="nt">&lt;/definitionname&gt;</span>
1881 <span class="nt">&lt;classname&gt;</span>example\system\user\notification\object\type\FooUserNotificationObjectType<span class="nt">&lt;/classname&gt;</span>
1882 <span class="nt">&lt;category&gt;</span>com.woltlab.example<span class="nt">&lt;/category&gt;</span>
1883 <span class="nt">&lt;/type&gt;</span>
1884 <span class="nt">&lt;/import&gt;</span>
1885 <span class="nt">&lt;/data&gt;</span>
1886 </code></pre></div>
1887 <p>The referenced class <code>FooUserNotificationObjectType</code> has to implement the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/notification/object/type/IUserNotificationObjectType.class.php">IUserNotificationObjectType</a> interface, which should be done by extending <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/notification/object/type/AbstractUserNotificationObjectType.class.php">AbstractUserNotificationObjectType</a>.</p>
1888 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
1889 <span class="k">namespace</span> <span class="nx">example\system\user\notification\object\type</span><span class="p">;</span>
1890 <span class="k">use</span> <span class="nx">example\data\foo\Foo</span><span class="p">;</span>
1891 <span class="k">use</span> <span class="nx">example\data\foo\FooList</span><span class="p">;</span>
1892 <span class="k">use</span> <span class="nx">example\system\user\notification\object\FooUserNotificationObject</span><span class="p">;</span>
1893 <span class="k">use</span> <span class="nx">wcf\system\user\notification\object\type\AbstractUserNotificationObjectType</span><span class="p">;</span>
1894
1895 <span class="sd">/**</span>
1896 <span class="sd"> * Represents a foo as a notification object type.</span>
1897 <span class="sd"> * </span>
1898 <span class="sd"> * @author Matthias Schmidt</span>
1899 <span class="sd"> * @copyright 2001-2017 WoltLab GmbH</span>
1900 <span class="sd"> * @license WoltLab License &lt;http://www.woltlab.com/license-agreement.html&gt;</span>
1901 <span class="sd"> * @package WoltLabSuite\Example\System\User\Notification\Object\Type</span>
1902 <span class="sd"> */</span>
1903 <span class="k">class</span> <span class="nc">FooUserNotificationObjectType</span> <span class="k">extends</span> <span class="nx">AbstractUserNotificationObjectType</span> <span class="p">{</span>
1904 <span class="sd">/**</span>
1905 <span class="sd"> * @inheritDoc</span>
1906 <span class="sd"> */</span>
1907 <span class="k">protected</span> <span class="k">static</span> <span class="nv">$decoratorClassName</span> <span class="o">=</span> <span class="nx">FooUserNotificationObject</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
1908
1909 <span class="sd">/**</span>
1910 <span class="sd"> * @inheritDoc</span>
1911 <span class="sd"> */</span>
1912 <span class="k">protected</span> <span class="k">static</span> <span class="nv">$objectClassName</span> <span class="o">=</span> <span class="nx">Foo</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
1913
1914 <span class="sd">/**</span>
1915 <span class="sd"> * @inheritDoc</span>
1916 <span class="sd"> */</span>
1917 <span class="k">protected</span> <span class="k">static</span> <span class="nv">$objectListClassName</span> <span class="o">=</span> <span class="nx">FooList</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
1918 <span class="p">}</span>
1919 </code></pre></div>
1920 <p>You have to set the class names of the database object (<code>$objectClassName</code>) and the related list (<code>$objectListClassName</code>).
1921 Additionally, you have to create a class that implements the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/notification/object/IUserNotificationObject.class.php">IUserNotificationObject</a> whose name you have to set as the value of the <code>$decoratorClassName</code> property. </p>
1922 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
1923 <span class="k">namespace</span> <span class="nx">example\system\user\notification\object</span><span class="p">;</span>
1924 <span class="k">use</span> <span class="nx">example\data\foo\Foo</span><span class="p">;</span>
1925 <span class="k">use</span> <span class="nx">wcf\data\DatabaseObjectDecorator</span><span class="p">;</span>
1926 <span class="k">use</span> <span class="nx">wcf\system\user\notification\object\IUserNotificationObject</span><span class="p">;</span>
1927
1928 <span class="sd">/**</span>
1929 <span class="sd"> * Represents a foo as a notification object.</span>
1930 <span class="sd"> * </span>
1931 <span class="sd"> * @author Matthias Schmidt</span>
1932 <span class="sd"> * @copyright 2001-2017 WoltLab GmbH</span>
1933 <span class="sd"> * @license WoltLab License &lt;http://www.woltlab.com/license-agreement.html&gt;</span>
1934 <span class="sd"> * @package WoltLabSuite\Example\System\User\Notification\Object</span>
1935 <span class="sd"> * </span>
1936 <span class="sd"> * @method Foo getDecoratedObject()</span>
1937 <span class="sd"> * @mixin Foo</span>
1938 <span class="sd"> */</span>
1939 <span class="k">class</span> <span class="nc">FooUserNotificationObject</span> <span class="k">extends</span> <span class="nx">DatabaseObjectDecorator</span> <span class="k">implements</span> <span class="nx">IUserNotificationObject</span> <span class="p">{</span>
1940 <span class="sd">/**</span>
1941 <span class="sd"> * @inheritDoc</span>
1942 <span class="sd"> */</span>
1943 <span class="k">protected</span> <span class="k">static</span> <span class="nv">$baseClass</span> <span class="o">=</span> <span class="nx">Foo</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
1944
1945 <span class="sd">/**</span>
1946 <span class="sd"> * @inheritDoc</span>
1947 <span class="sd"> */</span>
1948 <span class="k">public</span> <span class="k">function</span> <span class="nf">getTitle</span><span class="p">()</span> <span class="p">{</span>
1949 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getDecoratedObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getTitle</span><span class="p">();</span>
1950 <span class="p">}</span>
1951
1952 <span class="sd">/**</span>
1953 <span class="sd"> * @inheritDoc</span>
1954 <span class="sd"> */</span>
1955 <span class="k">public</span> <span class="k">function</span> <span class="nf">getURL</span><span class="p">()</span> <span class="p">{</span>
1956 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getDecoratedObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getLink</span><span class="p">();</span>
1957 <span class="p">}</span>
1958
1959 <span class="sd">/**</span>
1960 <span class="sd"> * @inheritDoc</span>
1961 <span class="sd"> */</span>
1962 <span class="k">public</span> <span class="k">function</span> <span class="nf">getAuthorID</span><span class="p">()</span> <span class="p">{</span>
1963 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getDecoratedObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">userID</span><span class="p">;</span>
1964 <span class="p">}</span>
1965 <span class="p">}</span>
1966 </code></pre></div>
1967 <ul>
1968 <li>The <code>getTitle()</code> method returns the title of the object.
1969 In this case, we assume that the <code>Foo</code> class has implemented the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/data/ITitledObject.class.php">ITitledObject</a> interface so that the decorated <code>Foo</code> can handle this method call itself.</li>
1970 <li>The <code>getURL()</code> method returns the link to the object.
1971 As for the <code>getTitle()</code>, we assume that the <code>Foo</code> class has implemented the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/data/ILinkableObject.class.php">ILinkableObject</a> interface so that the decorated <code>Foo</code> can also handle this method call itself.</li>
1972 <li>The <code>getAuthorID()</code> method returns the id of the user who created the decorated <code>Foo</code> object.
1973 We assume that <code>Foo</code> objects have a <code>userID</code> property that contains this id.</li>
1974 </ul>
1975 <h2 id="usernotificationeventxml"><code>userNotificationEvent.xml</code><a class="headerlink" href="#usernotificationeventxml" title="Permanent link">#</a></h2>
1976 <p>Each event that you fire in your package needs to be registered using the <a href="../../../package/pip/user-notification-event/">user notification event package installation plugin</a>.
1977 An example file might look like this:</p>
1978 <div class="highlight"><pre><span></span><code><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
1979 <span class="nt">&lt;data</span> <span class="na">xmlns=</span><span class="s">&quot;http://www.woltlab.com&quot;</span> <span class="na">xmlns:xsi=</span><span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> <span class="na">xsi:schemaLocation=</span><span class="s">&quot;http://www.woltlab.com http://www.woltlab.com/XSD/2019/userNotificationEvent.xsd&quot;</span><span class="nt">&gt;</span>
1980 <span class="nt">&lt;import&gt;</span>
1981 <span class="nt">&lt;event&gt;</span>
1982 <span class="nt">&lt;name&gt;</span>bar<span class="nt">&lt;/name&gt;</span>
1983 <span class="nt">&lt;objecttype&gt;</span>com.woltlab.example.foo<span class="nt">&lt;/objecttype&gt;</span>
1984 <span class="nt">&lt;classname&gt;</span>example\system\user\notification\event\FooUserNotificationEvent<span class="nt">&lt;/classname&gt;</span>
1985 <span class="nt">&lt;preset&gt;</span>1<span class="nt">&lt;/preset&gt;</span>
1986 <span class="nt">&lt;/event&gt;</span>
1987 <span class="nt">&lt;/import&gt;</span>
1988 <span class="nt">&lt;/data&gt;</span>
1989 </code></pre></div>
1990 <p>Here, you reference the user notification object type created via <code>objectType.xml</code>.
1991 The referenced class in the <code>&lt;classname&gt;</code> element has to implement the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/notification/event/IUserNotificationEvent.class.php">IUserNotificationEvent</a> interface by extending the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/notification/event/AbstractUserNotificationEvent.class.php">AbstractUserNotificationEvent</a> class or the <a href="https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/user/notification/event/AbstractSharedUserNotificationEvent.class.php">AbstractSharedUserNotificationEvent</a> class if you want to pre-load additional data before processing notifications.
1992 In <code>AbstractSharedUserNotificationEvent::prepare()</code>, you can, for example, tell runtime caches to prepare to load certain objects which then are loaded all at once when the objects are needed.</p>
1993 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
1994 <span class="k">namespace</span> <span class="nx">example\system\user\notification\event</span><span class="p">;</span>
1995 <span class="k">use</span> <span class="nx">example\system\cache\runtime\BazRuntimeCache</span><span class="p">;</span>
1996 <span class="k">use</span> <span class="nx">example\system\user\notification\object\FooUserNotificationObject</span><span class="p">;</span>
1997 <span class="k">use</span> <span class="nx">wcf\system\email\Email</span><span class="p">;</span>
1998 <span class="k">use</span> <span class="nx">wcf\system\request\LinkHandler</span><span class="p">;</span>
1999 <span class="k">use</span> <span class="nx">wcf\system\user\notification\event\AbstractSharedUserNotificationEvent</span><span class="p">;</span>
2000
2001 <span class="sd">/**</span>
2002 <span class="sd"> * Notification event for foos.</span>
2003 <span class="sd"> * </span>
2004 <span class="sd"> * @author Matthias Schmidt</span>
2005 <span class="sd"> * @copyright 2001-2017 WoltLab GmbH</span>
2006 <span class="sd"> * @license WoltLab License &lt;http://www.woltlab.com/license-agreement.html&gt;</span>
2007 <span class="sd"> * @package WoltLabSuite\Example\System\User\Notification\Event</span>
2008 <span class="sd"> * </span>
2009 <span class="sd"> * @method FooUserNotificationObject getUserNotificationObject()</span>
2010 <span class="sd"> */</span>
2011 <span class="k">class</span> <span class="nc">FooUserNotificationEvent</span> <span class="k">extends</span> <span class="nx">AbstractSharedUserNotificationEvent</span> <span class="p">{</span>
2012 <span class="sd">/**</span>
2013 <span class="sd"> * @inheritDoc</span>
2014 <span class="sd"> */</span>
2015 <span class="k">protected</span> <span class="nv">$stackable</span> <span class="o">=</span> <span class="k">true</span><span class="p">;</span>
2016
2017 <span class="sd">/** @noinspection PhpMissingParentCallCommonInspection */</span>
2018 <span class="sd">/**</span>
2019 <span class="sd"> * @inheritDoc</span>
2020 <span class="sd"> */</span>
2021 <span class="k">public</span> <span class="k">function</span> <span class="nf">checkAccess</span><span class="p">()</span> <span class="p">{</span>
2022 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">setBaz</span><span class="p">(</span><span class="nx">BazRuntimeCache</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">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">bazID</span><span class="p">));</span>
2023
2024 <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">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">isAccessible</span><span class="p">())</span> <span class="p">{</span>
2025 <span class="c1">// do some cleanup, if necessary</span>
2026
2027 <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
2028 <span class="p">}</span>
2029
2030 <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
2031 <span class="p">}</span>
2032
2033 <span class="sd">/** @noinspection PhpMissingParentCallCommonInspection */</span>
2034 <span class="sd">/**</span>
2035 <span class="sd"> * @inheritDoc</span>
2036 <span class="sd"> */</span>
2037 <span class="k">public</span> <span class="k">function</span> <span class="nf">getEmailMessage</span><span class="p">(</span><span class="nv">$notificationType</span> <span class="o">=</span> <span class="s1">&#39;instant&#39;</span><span class="p">)</span> <span class="p">{</span>
2038 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">setBaz</span><span class="p">(</span><span class="nx">BazRuntimeCache</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">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">bazID</span><span class="p">));</span>
2039
2040 <span class="nv">$messageID</span> <span class="o">=</span> <span class="s1">&#39;&lt;com.woltlab.example.baz/&#39;</span><span class="o">.</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">bazID</span><span class="o">.</span><span class="s1">&#39;@&#39;</span><span class="o">.</span><span class="nx">Email</span><span class="o">::</span><span class="na">getHost</span><span class="p">()</span><span class="o">.</span><span class="s1">&#39;&gt;&#39;</span><span class="p">;</span>
2041
2042 <span class="k">return</span> <span class="p">[</span>
2043 <span class="s1">&#39;application&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;example&#39;</span><span class="p">,</span>
2044 <span class="s1">&#39;in-reply-to&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="nv">$messageID</span><span class="p">],</span>
2045 <span class="s1">&#39;message-id&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;com.woltlab.example.foo/&#39;</span><span class="o">.</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">fooID</span><span class="p">,</span>
2046 <span class="s1">&#39;references&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="nv">$messageID</span><span class="p">],</span>
2047 <span class="s1">&#39;template&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;email_notification_foo&#39;</span>
2048 <span class="p">];</span>
2049 <span class="p">}</span>
2050
2051 <span class="sd">/**</span>
2052 <span class="sd"> * @inheritDoc</span>
2053 <span class="sd"> * @since 5.0</span>
2054 <span class="sd"> */</span>
2055 <span class="k">public</span> <span class="k">function</span> <span class="nf">getEmailTitle</span><span class="p">()</span> <span class="p">{</span>
2056 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">setBaz</span><span class="p">(</span><span class="nx">BazRuntimeCache</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">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">bazID</span><span class="p">));</span>
2057
2058 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getLanguage</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getDynamicVariable</span><span class="p">(</span><span class="s1">&#39;example.foo.notification.mail.title&#39;</span><span class="p">,</span> <span class="p">[</span>
2059 <span class="s1">&#39;userNotificationObject&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span>
2060 <span class="p">]);</span>
2061 <span class="p">}</span>
2062
2063 <span class="sd">/** @noinspection PhpMissingParentCallCommonInspection */</span>
2064 <span class="sd">/**</span>
2065 <span class="sd"> * @inheritDoc</span>
2066 <span class="sd"> */</span>
2067 <span class="k">public</span> <span class="k">function</span> <span class="nf">getEventHash</span><span class="p">()</span> <span class="p">{</span>
2068 <span class="k">return</span> <span class="nb">sha1</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">eventID</span> <span class="o">.</span> <span class="s1">&#39;-&#39;</span> <span class="o">.</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">bazID</span><span class="p">);</span>
2069 <span class="p">}</span>
2070
2071 <span class="sd">/**</span>
2072 <span class="sd"> * @inheritDoc</span>
2073 <span class="sd"> */</span>
2074 <span class="k">public</span> <span class="k">function</span> <span class="nf">getLink</span><span class="p">()</span> <span class="p">{</span>
2075 <span class="k">return</span> <span class="nx">LinkHandler</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getLink</span><span class="p">(</span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span> <span class="p">[</span>
2076 <span class="s1">&#39;application&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;example&#39;</span><span class="p">,</span>
2077 <span class="s1">&#39;object&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getDecoratedObject</span><span class="p">()</span>
2078 <span class="p">]);</span>
2079 <span class="p">}</span>
2080
2081 <span class="sd">/**</span>
2082 <span class="sd"> * @inheritDoc</span>
2083 <span class="sd"> */</span>
2084 <span class="k">public</span> <span class="k">function</span> <span class="nf">getMessage</span><span class="p">()</span> <span class="p">{</span>
2085 <span class="nv">$authors</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getAuthors</span><span class="p">();</span>
2086 <span class="nv">$count</span> <span class="o">=</span> <span class="nb">count</span><span class="p">(</span><span class="nv">$authors</span><span class="p">);</span>
2087
2088 <span class="k">if</span> <span class="p">(</span><span class="nv">$count</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
2089 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$authors</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> <span class="p">{</span>
2090 <span class="nb">unset</span><span class="p">(</span><span class="nv">$authors</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
2091 <span class="p">}</span>
2092 <span class="nv">$count</span> <span class="o">=</span> <span class="nb">count</span><span class="p">(</span><span class="nv">$authors</span><span class="p">);</span>
2093
2094 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getLanguage</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getDynamicVariable</span><span class="p">(</span><span class="s1">&#39;example.foo.notification.message.stacked&#39;</span><span class="p">,</span> <span class="p">[</span>
2095 <span class="s1">&#39;author&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">author</span><span class="p">,</span>
2096 <span class="s1">&#39;authors&#39;</span> <span class="o">=&gt;</span> <span class="nb">array_values</span><span class="p">(</span><span class="nv">$authors</span><span class="p">),</span>
2097 <span class="s1">&#39;count&#39;</span> <span class="o">=&gt;</span> <span class="nv">$count</span><span class="p">,</span>
2098 <span class="s1">&#39;guestTimesTriggered&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">notification</span><span class="o">-&gt;</span><span class="na">guestTimesTriggered</span><span class="p">,</span>
2099 <span class="s1">&#39;message&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">(),</span>
2100 <span class="s1">&#39;others&#39;</span> <span class="o">=&gt;</span> <span class="nv">$count</span> <span class="o">-</span> <span class="mi">1</span>
2101 <span class="p">]);</span>
2102 <span class="p">}</span>
2103
2104 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getLanguage</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getDynamicVariable</span><span class="p">(</span><span class="s1">&#39;example.foo.notification.message&#39;</span><span class="p">,</span> <span class="p">[</span>
2105 <span class="s1">&#39;author&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">author</span><span class="p">,</span>
2106 <span class="s1">&#39;userNotificationObject&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span>
2107 <span class="p">]);</span>
2108 <span class="p">}</span>
2109
2110 <span class="sd">/**</span>
2111 <span class="sd"> * @inheritDoc</span>
2112 <span class="sd"> */</span>
2113 <span class="k">public</span> <span class="k">function</span> <span class="nf">getTitle</span><span class="p">()</span> <span class="p">{</span>
2114 <span class="nv">$count</span> <span class="o">=</span> <span class="nb">count</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getAuthors</span><span class="p">());</span>
2115 <span class="k">if</span> <span class="p">(</span><span class="nv">$count</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
2116 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getLanguage</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">getDynamicVariable</span><span class="p">(</span><span class="s1">&#39;example.foo.notification.title.stacked&#39;</span><span class="p">,</span> <span class="p">[</span>
2117 <span class="s1">&#39;count&#39;</span> <span class="o">=&gt;</span> <span class="nv">$count</span><span class="p">,</span>
2118 <span class="s1">&#39;timesTriggered&#39;</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">notification</span><span class="o">-&gt;</span><span class="na">timesTriggered</span>
2119 <span class="p">]);</span>
2120 <span class="p">}</span>
2121
2122 <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getLanguage</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;example.foo.notification.title&#39;</span><span class="p">);</span>
2123 <span class="p">}</span>
2124
2125 <span class="sd">/**</span>
2126 <span class="sd"> * @inheritDoc</span>
2127 <span class="sd"> */</span>
2128 <span class="k">protected</span> <span class="k">function</span> <span class="nf">prepare</span><span class="p">()</span> <span class="p">{</span>
2129 <span class="nx">BazRuntimeCache</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">cacheObjectID</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getUserNotificationObject</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">bazID</span><span class="p">);</span>
2130 <span class="p">}</span>
2131 <span class="p">}</span>
2132 </code></pre></div>
2133 <ul>
2134 <li>The <code>$stackable</code> property is <code>false</code> by default and has to be explicitly set to <code>true</code> if stacking of notifications should be enabled.
2135 Stacking of notification does not create new notifications for the same event for a certain object if the related action as been triggered by different users.
2136 For example, if something is liked by one user and then liked again by another user before the recipient of the notification has confirmed it, the existing notification will be amended to include both users who liked the content.
2137 Stacking can thus be used to avoid cluttering the notification list of users.</li>
2138 <li>The <code>checkAccess()</code> method makes sure that the active user still has access to the object related to the notification.
2139 If that is not the case, the user notification system will automatically deleted the user notification based on the return value of the method.
2140 If you have any cached values related to notifications, you should also reset these values here.</li>
2141 <li>The <code>getEmailMessage()</code> method return data to create the instant email or the daily summary email.
2142 For instant emails (<code>$notificationType = 'instant'</code>), you have to return an array like the one shown in the code above with the following components:</li>
2143 <li><code>application</code>:
2144 abbreviation of application</li>
2145 <li><code>in-reply-to</code> (optional):
2146 message id of the notification for the parent item and used to improve the ordering in threaded email clients</li>
2147 <li><code>message-id</code> (optional):
2148 message id of the notification mail and has to be used in <code>in-reply-to</code> and <code>references</code> for follow up mails</li>
2149 <li><code>references</code> (optional):
2150 all of the message ids of parent items (i.e. recursive in-reply-to)</li>
2151 <li><code>template</code>:
2152 name of the template used to render the email body, should start with <code>email_</code></li>
2153 <li><code>variables</code> (optional):
2154 template variables passed to the email template where they can be accessed via <code>$notificationContent[variables]</code></li>
2155 </ul>
2156 <p>For daily emails (<code>$notificationType = 'daily'</code>), only <code>application</code>, <code>template</code>, and <code>variables</code> are supported.
2157 - The <code>getEmailTitle()</code> returns the title of the instant email sent to the user.
2158 By default, <code>getEmailTitle()</code> simply calls <code>getTitle()</code>.
2159 - The <code>getEventHash()</code> method returns a hash by which user notifications are grouped.
2160 Here, we want to group them not by the actual <code>Foo</code> object but by its parent <code>Baz</code> object and thus overwrite the default implementation provided by <code>AbstractUserNotificationEvent</code>.
2161 - The <code>getLink()</code> returns the link to the <code>Foo</code> object the notification belongs to.
2162 - The <code>getMessage()</code> method and the <code>getTitle()</code> return the message and the title of the user notification respectively.
2163 By checking the value of <code>count($this-&gt;getAuthors())</code>, we check if the notification is stacked, thus if the event has been triggered for multiple users so that different languages items are used.
2164 If your notification event does not support stacking, this distinction is not necessary.
2165 - The <code>prepare()</code> method is called for each user notification before all user notifications are rendered.
2166 This allows to tell runtime caches to prepare to load objects later on (see <a href="../caches_runtime-caches/">Runtime Caches</a>).</p>
2167 <h2 id="firing-events">Firing Events<a class="headerlink" href="#firing-events" title="Permanent link">#</a></h2>
2168 <p>When the action related to a user notification is executed, you can use <code>UserNotificationHandler::fireEvent()</code> to create the notifications:</p>
2169 <div class="highlight"><pre><span></span><code><span class="nv">$recipientIDs</span> <span class="o">=</span> <span class="p">[];</span> <span class="c1">// fill with user ids of the recipients of the notification</span>
2170 <span class="nx">UserNotificationHandler</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">fireEvent</span><span class="p">(</span>
2171 <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="c1">// event name</span>
2172 <span class="s1">&#39;com.woltlab.example.foo&#39;</span><span class="p">,</span> <span class="c1">// event object type name</span>
2173 <span class="k">new</span> <span class="nx">FooUserNotificationObject</span><span class="p">(</span><span class="k">new</span> <span class="nx">Foo</span><span class="p">(</span><span class="nv">$fooID</span><span class="p">)),</span> <span class="c1">// object related to the event</span>
2174 <span class="nv">$recipientIDs</span>
2175 <span class="p">);</span>
2176 </code></pre></div>
2177 <h2 id="marking-notifications-as-confirmed">Marking Notifications as Confirmed<a class="headerlink" href="#marking-notifications-as-confirmed" title="Permanent link">#</a></h2>
2178 <p>In some instances, you might want to manually mark user notifications as confirmed without the user manually confirming them, for example when they visit the page that is related to the user notification.
2179 In this case, you can use <code>UserNotificationHandler::markAsConfirmed()</code>:</p>
2180 <div class="highlight"><pre><span></span><code><span class="nv">$recipientIDs</span> <span class="o">=</span> <span class="p">[];</span> <span class="c1">// fill with user ids of the recipients of the notification</span>
2181 <span class="nv">$fooIDs</span> <span class="o">=</span> <span class="p">[];</span> <span class="c1">// fill with ids of related foo objects</span>
2182 <span class="nx">UserNotificationHandler</span><span class="o">::</span><span class="na">getInstance</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">markAsConfirmed</span><span class="p">(</span>
2183 <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="c1">// event name</span>
2184 <span class="s1">&#39;com.woltlab.example.foo&#39;</span><span class="p">,</span> <span class="c1">// event object type name</span>
2185 <span class="nv">$recipientIDs</span><span class="p">,</span>
2186 <span class="nv">$fooIDs</span>
2187 <span class="p">);</span>
2188 </code></pre></div>
2189
2190
2191
2192
2193
2194
2195
2196 </article>
2197 </div>
2198 </div>
2199 </main>
2200
2201
2202 <footer class="md-footer">
2203
2204 <nav class="md-footer__inner md-grid" aria-label="Footer">
2205
2206 <a href="../user_activity_points/" class="md-footer__link md-footer__link--prev" rel="prev">
2207 <div class="md-footer__button md-icon">
2208 <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>
2209 </div>
2210 <div class="md-footer__title">
2211 <div class="md-ellipsis">
2212 <span class="md-footer__direction">
2213 Previous
2214 </span>
2215 User Activity Points
2216 </div>
2217 </div>
2218 </a>
2219
2220
2221 <a href="../sitemaps/" class="md-footer__link md-footer__link--next" rel="next">
2222 <div class="md-footer__title">
2223 <div class="md-ellipsis">
2224 <span class="md-footer__direction">
2225 Next
2226 </span>
2227 Sitemaps
2228 </div>
2229 </div>
2230 <div class="md-footer__button md-icon">
2231 <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>
2232 </div>
2233 </a>
2234
2235 </nav>
2236
2237 <div class="md-footer-meta md-typeset">
2238 <div class="md-footer-meta__inner md-grid">
2239 <div class="md-footer-copyright">
2240
2241 <div class="md-footer-copyright__highlight">
2242 Copyright © 2020 WoltLab GmbH
2243 </div>
2244
2245 Made with
2246 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2247 Material for MkDocs
2248 </a>
2249
2250 </div>
2251 <div class="md-footer-copyright">
2252 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
2253 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
2254 </div>
2255 </div>
2256 </div>
2257 </footer>
2258
2259 </div>
2260 <div class="md-dialog" data-md-component="dialog">
2261 <div class="md-dialog__inner md-typeset"></div>
2262 </div>
2263 <script id="__config" type="application/json">{"base": "../../..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../../../assets/javascripts/workers/search.fb4a9340.min.js", "version": {"provider": "mike"}}</script>
2264
2265
2266 <script src="../../../assets/javascripts/bundle.5cf3e710.min.js"></script>
2267
2268
2269 </body>
2270 </html>