Deployed 59ff7f1 to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / latest / php / database-objects / 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="icon" href="../../assets/default.favicon.ico">
13 <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.1.0">
14
15
16
17 <title>Database Objects - WoltLab Suite Documentation</title>
18
19
20
21 <link rel="stylesheet" href="../../assets/stylesheets/main.33e2939f.min.css">
22
23
24 <link rel="stylesheet" href="../../assets/stylesheets/palette.ef6f36e2.min.css">
25
26
27
28 <meta name="theme-color" content="#009485">
29
30
31
32
33
34
35
36
37
38 <link rel="stylesheet" href="../../stylesheets/extra.css">
39
40
41
42
43
44 </head>
45
46
47
48
49
50
51
52 <body dir="ltr" data-md-color-scheme="" data-md-color-primary="teal" data-md-color-accent="">
53
54
55 <script>function __prefix(e){return new URL("../..",location).pathname+"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}</script>
56
57 <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
58 <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
59 <label class="md-overlay" for="__drawer"></label>
60 <div data-md-component="skip">
61
62
63 <a href="#database-objects" class="md-skip">
64 Skip to content
65 </a>
66
67 </div>
68 <div data-md-component="announce">
69
70 <aside class="md-announce">
71 <div class="md-announce__inner md-grid md-typeset">
72
73 <a href="https://www.woltlab.com">Back to <strong>woltlab.com</strong></a>
74
75 </div>
76 </aside>
77
78 </div>
79
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" data-md-component="logo">
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 Database Objects
101
102 </span>
103 </div>
104 </div>
105 </div>
106
107
108
109 <label class="md-header__button md-icon" for="__search">
110 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
111 </label>
112
113 <div class="md-search" data-md-component="search" role="dialog">
114 <label class="md-search__overlay" for="__search"></label>
115 <div class="md-search__inner" role="search">
116 <form class="md-search__form" name="search">
117 <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active" required>
118 <label class="md-search__icon md-icon" for="__search">
119 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
120 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
121 </label>
122 <button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
123 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
124 </button>
125 </form>
126 <div class="md-search__output">
127 <div class="md-search__scrollwrap" data-md-scrollfix>
128 <div class="md-search-result" data-md-component="search-result">
129 <div class="md-search-result__meta">
130 Initializing search
131 </div>
132 <ol class="md-search-result__list"></ol>
133 </div>
134 </div>
135 </div>
136 </div>
137 </div>
138
139
140 <div class="md-header__source">
141
142 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
143 <div class="md-source__icon md-icon">
144
145 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
146 </div>
147 <div class="md-source__repository">
148 GitHub
149 </div>
150 </a>
151 </div>
152
153 </nav>
154 </header>
155
156 <div class="md-container" data-md-component="container">
157
158
159
160
161 <main class="md-main" data-md-component="main">
162 <div class="md-main__inner md-grid">
163
164
165
166 <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
167 <div class="md-sidebar__scrollwrap">
168 <div class="md-sidebar__inner">
169
170
171
172 <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
173 <label class="md-nav__title" for="__drawer">
174 <a href="../.." title="WoltLab Suite Documentation" class="md-nav__button md-logo" aria-label="WoltLab Suite Documentation" data-md-component="logo">
175
176 <img src="../../assets/logo.png" alt="logo">
177
178 </a>
179 WoltLab Suite Documentation
180 </label>
181
182 <div class="md-nav__source">
183
184 <a href="https://github.com/WoltLab/docs.woltlab.com/" title="Go to repository" class="md-source" data-md-component="source">
185 <div class="md-source__icon md-icon">
186
187 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
188 </div>
189 <div class="md-source__repository">
190 GitHub
191 </div>
192 </a>
193 </div>
194
195 <ul class="md-nav__list" data-md-scrollfix>
196
197
198
199
200
201
202
203
204 <li class="md-nav__item">
205 <a href="../../getting-started/" class="md-nav__link">
206 Getting Started
207 </a>
208 </li>
209
210
211
212
213
214
215
216
217
218
219
220
221
222 <li class="md-nav__item md-nav__item--active md-nav__item--nested">
223
224
225 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" checked>
226
227 <label class="md-nav__link" for="__nav_2">
228 PHP API
229 <span class="md-nav__icon md-icon"></span>
230 </label>
231 <nav class="md-nav" aria-label="PHP API" data-md-level="1">
232 <label class="md-nav__title" for="__nav_2">
233 <span class="md-nav__icon md-icon"></span>
234 PHP API
235 </label>
236 <ul class="md-nav__list" data-md-scrollfix>
237
238
239
240
241
242 <li class="md-nav__item">
243 <a href="../pages/" class="md-nav__link">
244 Pages
245 </a>
246 </li>
247
248
249
250
251
252
253
254
255
256 <li class="md-nav__item md-nav__item--active">
257
258 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
259
260
261
262
263 <label class="md-nav__link md-nav__link--active" for="__toc">
264 Database Objects
265 <span class="md-nav__icon md-icon"></span>
266 </label>
267
268 <a href="./" class="md-nav__link md-nav__link--active">
269 Database Objects
270 </a>
271
272
273 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
274
275
276
277
278
279 <label class="md-nav__title" for="__toc">
280 <span class="md-nav__icon md-icon"></span>
281 Table of contents
282 </label>
283 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
284
285 <li class="md-nav__item">
286 <a href="#databaseobject" class="md-nav__link">
287 DatabaseObject
288 </a>
289
290 </li>
291
292 <li class="md-nav__item">
293 <a href="#databaseobjectdecorator" class="md-nav__link">
294 DatabaseObjectDecorator
295 </a>
296
297 </li>
298
299 <li class="md-nav__item">
300 <a href="#databaseobjecteditor" class="md-nav__link">
301 DatabaseObjectEditor
302 </a>
303
304 <nav class="md-nav" aria-label="DatabaseObjectEditor">
305 <ul class="md-nav__list">
306
307 <li class="md-nav__item">
308 <a href="#create-a-new-row" class="md-nav__link">
309 Create a new row
310 </a>
311
312 </li>
313
314 <li class="md-nav__item">
315 <a href="#updating-an-existing-row" class="md-nav__link">
316 Updating an existing row
317 </a>
318
319 </li>
320
321 <li class="md-nav__item">
322 <a href="#deleting-a-row" class="md-nav__link">
323 Deleting a row
324 </a>
325
326 </li>
327
328 </ul>
329 </nav>
330
331 </li>
332
333 <li class="md-nav__item">
334 <a href="#databaseobjectlist" class="md-nav__link">
335 DatabaseObjectList
336 </a>
337
338 </li>
339
340 <li class="md-nav__item">
341 <a href="#abstractdatabaseobjectaction" class="md-nav__link">
342 AbstractDatabaseObjectAction
343 </a>
344
345 <nav class="md-nav" aria-label="AbstractDatabaseObjectAction">
346 <ul class="md-nav__list">
347
348 <li class="md-nav__item">
349 <a href="#executing-an-action" class="md-nav__link">
350 Executing an Action
351 </a>
352
353 </li>
354
355 <li class="md-nav__item">
356 <a href="#custom-method-with-ajax-support" class="md-nav__link">
357 Custom Method with AJAX Support
358 </a>
359
360 <nav class="md-nav" aria-label="Custom Method with AJAX Support">
361 <ul class="md-nav__list">
362
363 <li class="md-nav__item">
364 <a href="#ajax-validation" class="md-nav__link">
365 AJAX Validation
366 </a>
367
368 </li>
369
370 <li class="md-nav__item">
371 <a href="#create-update-and-delete" class="md-nav__link">
372 create, update and delete
373 </a>
374
375 </li>
376
377 <li class="md-nav__item">
378 <a href="#allow-invokation-by-guests" class="md-nav__link">
379 Allow Invokation by Guests
380 </a>
381
382 </li>
383
384 <li class="md-nav__item">
385 <a href="#acp-access-only" class="md-nav__link">
386 ACP Access Only
387 </a>
388
389 </li>
390
391 </ul>
392 </nav>
393
394 </li>
395
396 </ul>
397 </nav>
398
399 </li>
400
401 </ul>
402
403 </nav>
404
405 </li>
406
407
408
409
410
411
412
413 <li class="md-nav__item">
414 <a href="../database-access/" class="md-nav__link">
415 Database Access
416 </a>
417 </li>
418
419
420
421
422
423
424
425 <li class="md-nav__item">
426 <a href="../exceptions/" class="md-nav__link">
427 Exceptions
428 </a>
429 </li>
430
431
432
433
434
435
436
437
438 <li class="md-nav__item md-nav__item--nested">
439
440
441 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" >
442
443 <label class="md-nav__link" for="__nav_2_5">
444 API
445 <span class="md-nav__icon md-icon"></span>
446 </label>
447 <nav class="md-nav" aria-label="API" data-md-level="2">
448 <label class="md-nav__title" for="__nav_2_5">
449 <span class="md-nav__icon md-icon"></span>
450 API
451 </label>
452 <ul class="md-nav__list" data-md-scrollfix>
453
454
455
456
457
458
459 <li class="md-nav__item md-nav__item--nested">
460
461
462 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_1" type="checkbox" id="__nav_2_5_1" >
463
464 <label class="md-nav__link" for="__nav_2_5_1">
465 Caches
466 <span class="md-nav__icon md-icon"></span>
467 </label>
468 <nav class="md-nav" aria-label="Caches" data-md-level="3">
469 <label class="md-nav__title" for="__nav_2_5_1">
470 <span class="md-nav__icon md-icon"></span>
471 Caches
472 </label>
473 <ul class="md-nav__list" data-md-scrollfix>
474
475
476
477
478
479 <li class="md-nav__item">
480 <a href="../api/caches/" class="md-nav__link">
481 Overview
482 </a>
483 </li>
484
485
486
487
488
489
490
491 <li class="md-nav__item">
492 <a href="../api/caches_persistent-caches/" class="md-nav__link">
493 Persistent Caches
494 </a>
495 </li>
496
497
498
499
500
501
502
503 <li class="md-nav__item">
504 <a href="../api/caches_runtime-caches/" class="md-nav__link">
505 Runtime Caches
506 </a>
507 </li>
508
509
510
511 </ul>
512 </nav>
513 </li>
514
515
516
517
518
519
520
521 <li class="md-nav__item">
522 <a href="../api/comments/" class="md-nav__link">
523 Comments
524 </a>
525 </li>
526
527
528
529
530
531
532
533 <li class="md-nav__item">
534 <a href="../api/cronjobs/" class="md-nav__link">
535 Cronjobs
536 </a>
537 </li>
538
539
540
541
542
543
544
545 <li class="md-nav__item">
546 <a href="../api/events/" class="md-nav__link">
547 Events
548 </a>
549 </li>
550
551
552
553
554
555
556
557
558 <li class="md-nav__item md-nav__item--nested">
559
560
561 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" >
562
563 <label class="md-nav__link" for="__nav_2_5_5">
564 Form Builder
565 <span class="md-nav__icon md-icon"></span>
566 </label>
567 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
568 <label class="md-nav__title" for="__nav_2_5_5">
569 <span class="md-nav__icon md-icon"></span>
570 Form Builder
571 </label>
572 <ul class="md-nav__list" data-md-scrollfix>
573
574
575
576
577
578 <li class="md-nav__item">
579 <a href="../api/form_builder/overview/" class="md-nav__link">
580 Overview
581 </a>
582 </li>
583
584
585
586
587
588
589
590 <li class="md-nav__item">
591 <a href="../api/form_builder/structure/" class="md-nav__link">
592 Structure
593 </a>
594 </li>
595
596
597
598
599
600
601
602 <li class="md-nav__item">
603 <a href="../api/form_builder/form_fields/" class="md-nav__link">
604 Fields
605 </a>
606 </li>
607
608
609
610
611
612
613
614 <li class="md-nav__item">
615 <a href="../api/form_builder/validation_data/" class="md-nav__link">
616 Validation and Data
617 </a>
618 </li>
619
620
621
622
623
624
625
626 <li class="md-nav__item">
627 <a href="../api/form_builder/dependencies/" class="md-nav__link">
628 Dependencies
629 </a>
630 </li>
631
632
633
634 </ul>
635 </nav>
636 </li>
637
638
639
640
641
642
643
644 <li class="md-nav__item">
645 <a href="../api/package_installation_plugins/" class="md-nav__link">
646 Package Installation Plugins
647 </a>
648 </li>
649
650
651
652
653
654
655
656 <li class="md-nav__item">
657 <a href="../api/user_activity_points/" class="md-nav__link">
658 User Activity Points
659 </a>
660 </li>
661
662
663
664
665
666
667
668 <li class="md-nav__item">
669 <a href="../api/user_notifications/" class="md-nav__link">
670 User Notifications
671 </a>
672 </li>
673
674
675
676
677
678
679
680 <li class="md-nav__item">
681 <a href="../api/sitemaps/" class="md-nav__link">
682 Sitemaps
683 </a>
684 </li>
685
686
687
688 </ul>
689 </nav>
690 </li>
691
692
693
694
695
696
697
698 <li class="md-nav__item">
699 <a href="../code-style/" class="md-nav__link">
700 Code Style
701 </a>
702 </li>
703
704
705
706
707
708
709
710 <li class="md-nav__item">
711 <a href="../apps/" class="md-nav__link">
712 Apps
713 </a>
714 </li>
715
716
717
718
719
720
721
722 <li class="md-nav__item">
723 <a href="../gdpr/" class="md-nav__link">
724 GDPR
725 </a>
726 </li>
727
728
729
730 </ul>
731 </nav>
732 </li>
733
734
735
736
737
738
739
740
741
742
743
744 <li class="md-nav__item md-nav__item--nested">
745
746
747 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
748
749 <label class="md-nav__link" for="__nav_3">
750 Languages, Templates & CSS
751 <span class="md-nav__icon md-icon"></span>
752 </label>
753 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
754 <label class="md-nav__title" for="__nav_3">
755 <span class="md-nav__icon md-icon"></span>
756 Languages, Templates & CSS
757 </label>
758 <ul class="md-nav__list" data-md-scrollfix>
759
760
761
762
763
764 <li class="md-nav__item">
765 <a href="../../view/languages/" class="md-nav__link">
766 Languages
767 </a>
768 </li>
769
770
771
772
773
774
775
776 <li class="md-nav__item">
777 <a href="../../view/templates/" class="md-nav__link">
778 Templates
779 </a>
780 </li>
781
782
783
784
785
786
787
788 <li class="md-nav__item">
789 <a href="../../view/template-plugins/" class="md-nav__link">
790 Template Plugins
791 </a>
792 </li>
793
794
795
796
797
798
799
800 <li class="md-nav__item">
801 <a href="../../view/css/" class="md-nav__link">
802 CSS
803 </a>
804 </li>
805
806
807
808 </ul>
809 </nav>
810 </li>
811
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" type="checkbox" id="__nav_4" >
826
827 <label class="md-nav__link" for="__nav_4">
828 TypeScript and JavaScript API
829 <span class="md-nav__icon md-icon"></span>
830 </label>
831 <nav class="md-nav" aria-label="TypeScript and JavaScript API" data-md-level="1">
832 <label class="md-nav__title" for="__nav_4">
833 <span class="md-nav__icon md-icon"></span>
834 TypeScript and JavaScript API
835 </label>
836 <ul class="md-nav__list" data-md-scrollfix>
837
838
839
840
841
842 <li class="md-nav__item">
843 <a href="../../javascript/general-usage/" class="md-nav__link">
844 General Usage
845 </a>
846 </li>
847
848
849
850
851
852
853
854 <li class="md-nav__item">
855 <a href="../../javascript/typescript/" class="md-nav__link">
856 TypeScript
857 </a>
858 </li>
859
860
861
862
863
864
865
866
867 <li class="md-nav__item md-nav__item--nested">
868
869
870 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_3" type="checkbox" id="__nav_4_3" >
871
872 <label class="md-nav__link" for="__nav_4_3">
873 New API
874 <span class="md-nav__icon md-icon"></span>
875 </label>
876 <nav class="md-nav" aria-label="New API" data-md-level="2">
877 <label class="md-nav__title" for="__nav_4_3">
878 <span class="md-nav__icon md-icon"></span>
879 New API
880 </label>
881 <ul class="md-nav__list" data-md-scrollfix>
882
883
884
885
886
887 <li class="md-nav__item">
888 <a href="../../javascript/new-api_writing-a-module/" class="md-nav__link">
889 Writing a module
890 </a>
891 </li>
892
893
894
895
896
897
898
899 <li class="md-nav__item">
900 <a href="../../javascript/new-api_data-structures/" class="md-nav__link">
901 Data Structures
902 </a>
903 </li>
904
905
906
907
908
909
910
911 <li class="md-nav__item">
912 <a href="../../javascript/new-api_core/" class="md-nav__link">
913 Core Functions
914 </a>
915 </li>
916
917
918
919
920
921
922
923 <li class="md-nav__item">
924 <a href="../../javascript/new-api_dom/" class="md-nav__link">
925 DOM
926 </a>
927 </li>
928
929
930
931
932
933
934
935 <li class="md-nav__item">
936 <a href="../../javascript/new-api_events/" class="md-nav__link">
937 Event Handling
938 </a>
939 </li>
940
941
942
943
944
945
946
947 <li class="md-nav__item">
948 <a href="../../javascript/new-api_ajax/" class="md-nav__link">
949 Ajax
950 </a>
951 </li>
952
953
954
955
956
957
958
959 <li class="md-nav__item">
960 <a href="../../javascript/new-api_dialogs/" class="md-nav__link">
961 Dialogs
962 </a>
963 </li>
964
965
966
967
968
969
970
971 <li class="md-nav__item">
972 <a href="../../javascript/new-api_browser/" class="md-nav__link">
973 Browser and Screen Sizes
974 </a>
975 </li>
976
977
978
979
980
981
982
983 <li class="md-nav__item">
984 <a href="../../javascript/new-api_ui/" class="md-nav__link">
985 User Interface
986 </a>
987 </li>
988
989
990
991 </ul>
992 </nav>
993 </li>
994
995
996
997
998
999
1000
1001 <li class="md-nav__item">
1002 <a href="../../javascript/legacy-api/" class="md-nav__link">
1003 Legacy API
1004 </a>
1005 </li>
1006
1007
1008
1009
1010
1011
1012
1013 <li class="md-nav__item">
1014 <a href="../../javascript/helper-functions/" class="md-nav__link">
1015 Helper Functions
1016 </a>
1017 </li>
1018
1019
1020
1021
1022
1023
1024
1025 <li class="md-nav__item">
1026 <a href="../../javascript/code-snippets/" class="md-nav__link">
1027 Code Snippets
1028 </a>
1029 </li>
1030
1031
1032
1033 </ul>
1034 </nav>
1035 </li>
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047 <li class="md-nav__item md-nav__item--nested">
1048
1049
1050 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
1051
1052 <label class="md-nav__link" for="__nav_5">
1053 Package Components
1054 <span class="md-nav__icon md-icon"></span>
1055 </label>
1056 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
1057 <label class="md-nav__title" for="__nav_5">
1058 <span class="md-nav__icon md-icon"></span>
1059 Package Components
1060 </label>
1061 <ul class="md-nav__list" data-md-scrollfix>
1062
1063
1064
1065
1066
1067 <li class="md-nav__item">
1068 <a href="../../package/package-xml/" class="md-nav__link">
1069 package.xml
1070 </a>
1071 </li>
1072
1073
1074
1075
1076
1077
1078
1079
1080 <li class="md-nav__item md-nav__item--nested">
1081
1082
1083 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
1084
1085 <label class="md-nav__link" for="__nav_5_2">
1086 PIPs
1087 <span class="md-nav__icon md-icon"></span>
1088 </label>
1089 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
1090 <label class="md-nav__title" for="__nav_5_2">
1091 <span class="md-nav__icon md-icon"></span>
1092 PIPs
1093 </label>
1094 <ul class="md-nav__list" data-md-scrollfix>
1095
1096
1097
1098
1099
1100 <li class="md-nav__item">
1101 <a href="../../package/pip/" class="md-nav__link">
1102 Overview
1103 </a>
1104 </li>
1105
1106
1107
1108
1109
1110
1111
1112 <li class="md-nav__item">
1113 <a href="../../package/pip/acl-option/" class="md-nav__link">
1114 aclOption
1115 </a>
1116 </li>
1117
1118
1119
1120
1121
1122
1123
1124 <li class="md-nav__item">
1125 <a href="../../package/pip/acp-menu/" class="md-nav__link">
1126 acpMenu
1127 </a>
1128 </li>
1129
1130
1131
1132
1133
1134
1135
1136 <li class="md-nav__item">
1137 <a href="../../package/pip/acp-search-provider/" class="md-nav__link">
1138 acpSearchProvider
1139 </a>
1140 </li>
1141
1142
1143
1144
1145
1146
1147
1148 <li class="md-nav__item">
1149 <a href="../../package/pip/acp-template/" class="md-nav__link">
1150 acpTemplate
1151 </a>
1152 </li>
1153
1154
1155
1156
1157
1158
1159
1160 <li class="md-nav__item">
1161 <a href="../../package/pip/bbcode/" class="md-nav__link">
1162 bbcode
1163 </a>
1164 </li>
1165
1166
1167
1168
1169
1170
1171
1172 <li class="md-nav__item">
1173 <a href="../../package/pip/box/" class="md-nav__link">
1174 box
1175 </a>
1176 </li>
1177
1178
1179
1180
1181
1182
1183
1184 <li class="md-nav__item">
1185 <a href="../../package/pip/clipboard-action/" class="md-nav__link">
1186 clipboardAction
1187 </a>
1188 </li>
1189
1190
1191
1192
1193
1194
1195
1196 <li class="md-nav__item">
1197 <a href="../../package/pip/core-object/" class="md-nav__link">
1198 coreObject
1199 </a>
1200 </li>
1201
1202
1203
1204
1205
1206
1207
1208 <li class="md-nav__item">
1209 <a href="../../package/pip/cronjob/" class="md-nav__link">
1210 cronjob
1211 </a>
1212 </li>
1213
1214
1215
1216
1217
1218
1219
1220 <li class="md-nav__item">
1221 <a href="../../package/pip/database/" class="md-nav__link">
1222 database
1223 </a>
1224 </li>
1225
1226
1227
1228
1229
1230
1231
1232 <li class="md-nav__item">
1233 <a href="../../package/pip/event-listener/" class="md-nav__link">
1234 eventListener
1235 </a>
1236 </li>
1237
1238
1239
1240
1241
1242
1243
1244 <li class="md-nav__item">
1245 <a href="../../package/pip/file/" class="md-nav__link">
1246 file
1247 </a>
1248 </li>
1249
1250
1251
1252
1253
1254
1255
1256 <li class="md-nav__item">
1257 <a href="../../package/pip/language/" class="md-nav__link">
1258 language
1259 </a>
1260 </li>
1261
1262
1263
1264
1265
1266
1267
1268 <li class="md-nav__item">
1269 <a href="../../package/pip/media-provider/" class="md-nav__link">
1270 mediaProvider
1271 </a>
1272 </li>
1273
1274
1275
1276
1277
1278
1279
1280 <li class="md-nav__item">
1281 <a href="../../package/pip/menu/" class="md-nav__link">
1282 menu
1283 </a>
1284 </li>
1285
1286
1287
1288
1289
1290
1291
1292 <li class="md-nav__item">
1293 <a href="../../package/pip/menu-item/" class="md-nav__link">
1294 menuItem
1295 </a>
1296 </li>
1297
1298
1299
1300
1301
1302
1303
1304 <li class="md-nav__item">
1305 <a href="../../package/pip/object-type/" class="md-nav__link">
1306 objectType
1307 </a>
1308 </li>
1309
1310
1311
1312
1313
1314
1315
1316 <li class="md-nav__item">
1317 <a href="../../package/pip/object-type-definition/" class="md-nav__link">
1318 objectTypeDefinition
1319 </a>
1320 </li>
1321
1322
1323
1324
1325
1326
1327
1328 <li class="md-nav__item">
1329 <a href="../../package/pip/option/" class="md-nav__link">
1330 option
1331 </a>
1332 </li>
1333
1334
1335
1336
1337
1338
1339
1340 <li class="md-nav__item">
1341 <a href="../../package/pip/page/" class="md-nav__link">
1342 page
1343 </a>
1344 </li>
1345
1346
1347
1348
1349
1350
1351
1352 <li class="md-nav__item">
1353 <a href="../../package/pip/pip/" class="md-nav__link">
1354 pip
1355 </a>
1356 </li>
1357
1358
1359
1360
1361
1362
1363
1364 <li class="md-nav__item">
1365 <a href="../../package/pip/script/" class="md-nav__link">
1366 script
1367 </a>
1368 </li>
1369
1370
1371
1372
1373
1374
1375
1376 <li class="md-nav__item">
1377 <a href="../../package/pip/smiley/" class="md-nav__link">
1378 smiley
1379 </a>
1380 </li>
1381
1382
1383
1384
1385
1386
1387
1388 <li class="md-nav__item">
1389 <a href="../../package/pip/sql/" class="md-nav__link">
1390 sql
1391 </a>
1392 </li>
1393
1394
1395
1396
1397
1398
1399
1400 <li class="md-nav__item">
1401 <a href="../../package/pip/style/" class="md-nav__link">
1402 style
1403 </a>
1404 </li>
1405
1406
1407
1408
1409
1410
1411
1412 <li class="md-nav__item">
1413 <a href="../../package/pip/template/" class="md-nav__link">
1414 template
1415 </a>
1416 </li>
1417
1418
1419
1420
1421
1422
1423
1424 <li class="md-nav__item">
1425 <a href="../../package/pip/template-listener/" class="md-nav__link">
1426 templateListener
1427 </a>
1428 </li>
1429
1430
1431
1432
1433
1434
1435
1436 <li class="md-nav__item">
1437 <a href="../../package/pip/user-group-option/" class="md-nav__link">
1438 userGroupOption
1439 </a>
1440 </li>
1441
1442
1443
1444
1445
1446
1447
1448 <li class="md-nav__item">
1449 <a href="../../package/pip/user-menu/" class="md-nav__link">
1450 userMenu
1451 </a>
1452 </li>
1453
1454
1455
1456
1457
1458
1459
1460 <li class="md-nav__item">
1461 <a href="../../package/pip/user-notification-event/" class="md-nav__link">
1462 userNotificationEvent
1463 </a>
1464 </li>
1465
1466
1467
1468
1469
1470
1471
1472 <li class="md-nav__item">
1473 <a href="../../package/pip/user-option/" class="md-nav__link">
1474 userOption
1475 </a>
1476 </li>
1477
1478
1479
1480
1481
1482
1483
1484 <li class="md-nav__item">
1485 <a href="../../package/pip/user-profile-menu/" class="md-nav__link">
1486 userProfileMenu
1487 </a>
1488 </li>
1489
1490
1491
1492 </ul>
1493 </nav>
1494 </li>
1495
1496
1497
1498
1499
1500
1501
1502 <li class="md-nav__item">
1503 <a href="../../package/database-php-api/" class="md-nav__link">
1504 Database PHP API
1505 </a>
1506 </li>
1507
1508
1509
1510 </ul>
1511 </nav>
1512 </li>
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524 <li class="md-nav__item md-nav__item--nested">
1525
1526
1527 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
1528
1529 <label class="md-nav__link" for="__nav_6">
1530 Migration
1531 <span class="md-nav__icon md-icon"></span>
1532 </label>
1533 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1534 <label class="md-nav__title" for="__nav_6">
1535 <span class="md-nav__icon md-icon"></span>
1536 Migration
1537 </label>
1538 <ul class="md-nav__list" data-md-scrollfix>
1539
1540
1541
1542
1543
1544
1545 <li class="md-nav__item md-nav__item--nested">
1546
1547
1548 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" >
1549
1550 <label class="md-nav__link" for="__nav_6_1">
1551 Migrating from WSC 5.3
1552 <span class="md-nav__icon md-icon"></span>
1553 </label>
1554 <nav class="md-nav" aria-label="Migrating from WSC 5.3" data-md-level="2">
1555 <label class="md-nav__title" for="__nav_6_1">
1556 <span class="md-nav__icon md-icon"></span>
1557 Migrating from WSC 5.3
1558 </label>
1559 <ul class="md-nav__list" data-md-scrollfix>
1560
1561
1562
1563
1564
1565 <li class="md-nav__item">
1566 <a href="../../migration/wsc53/php/" class="md-nav__link">
1567 PHP API
1568 </a>
1569 </li>
1570
1571
1572
1573
1574
1575
1576
1577 <li class="md-nav__item">
1578 <a href="../../migration/wsc53/session/" class="md-nav__link">
1579 Session Handling and Authentication
1580 </a>
1581 </li>
1582
1583
1584
1585
1586
1587
1588
1589 <li class="md-nav__item">
1590 <a href="../../migration/wsc53/javascript/" class="md-nav__link">
1591 TypeScript and JavaScript
1592 </a>
1593 </li>
1594
1595
1596
1597
1598
1599
1600
1601 <li class="md-nav__item">
1602 <a href="../../migration/wsc53/templates/" class="md-nav__link">
1603 Templates
1604 </a>
1605 </li>
1606
1607
1608
1609
1610
1611
1612
1613 <li class="md-nav__item">
1614 <a href="../../migration/wsc53/libraries/" class="md-nav__link">
1615 Third Party Libraries
1616 </a>
1617 </li>
1618
1619
1620
1621 </ul>
1622 </nav>
1623 </li>
1624
1625
1626
1627
1628
1629
1630
1631
1632 <li class="md-nav__item md-nav__item--nested">
1633
1634
1635 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
1636
1637 <label class="md-nav__link" for="__nav_6_2">
1638 Migrating from WSC 5.2
1639 <span class="md-nav__icon md-icon"></span>
1640 </label>
1641 <nav class="md-nav" aria-label="Migrating from WSC 5.2" data-md-level="2">
1642 <label class="md-nav__title" for="__nav_6_2">
1643 <span class="md-nav__icon md-icon"></span>
1644 Migrating from WSC 5.2
1645 </label>
1646 <ul class="md-nav__list" data-md-scrollfix>
1647
1648
1649
1650
1651
1652 <li class="md-nav__item">
1653 <a href="../../migration/wsc52/php/" class="md-nav__link">
1654 PHP API
1655 </a>
1656 </li>
1657
1658
1659
1660
1661
1662
1663
1664 <li class="md-nav__item">
1665 <a href="../../migration/wsc52/templates/" class="md-nav__link">
1666 Templates and Languages
1667 </a>
1668 </li>
1669
1670
1671
1672
1673
1674
1675
1676 <li class="md-nav__item">
1677 <a href="../../migration/wsc52/libraries/" class="md-nav__link">
1678 Third Party Libraries
1679 </a>
1680 </li>
1681
1682
1683
1684 </ul>
1685 </nav>
1686 </li>
1687
1688
1689
1690
1691
1692
1693
1694
1695 <li class="md-nav__item md-nav__item--nested">
1696
1697
1698 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" >
1699
1700 <label class="md-nav__link" for="__nav_6_3">
1701 Migrating from WSC 3.1
1702 <span class="md-nav__icon md-icon"></span>
1703 </label>
1704 <nav class="md-nav" aria-label="Migrating from WSC 3.1" data-md-level="2">
1705 <label class="md-nav__title" for="__nav_6_3">
1706 <span class="md-nav__icon md-icon"></span>
1707 Migrating from WSC 3.1
1708 </label>
1709 <ul class="md-nav__list" data-md-scrollfix>
1710
1711
1712
1713
1714
1715 <li class="md-nav__item">
1716 <a href="../../migration/wsc31/php/" class="md-nav__link">
1717 PHP API
1718 </a>
1719 </li>
1720
1721
1722
1723 </ul>
1724 </nav>
1725 </li>
1726
1727
1728
1729
1730
1731
1732
1733
1734 <li class="md-nav__item md-nav__item--nested">
1735
1736
1737 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
1738
1739 <label class="md-nav__link" for="__nav_6_4">
1740 Migrating from WSC 3.0
1741 <span class="md-nav__icon md-icon"></span>
1742 </label>
1743 <nav class="md-nav" aria-label="Migrating from WSC 3.0" data-md-level="2">
1744 <label class="md-nav__title" for="__nav_6_4">
1745 <span class="md-nav__icon md-icon"></span>
1746 Migrating from WSC 3.0
1747 </label>
1748 <ul class="md-nav__list" data-md-scrollfix>
1749
1750
1751
1752
1753
1754 <li class="md-nav__item">
1755 <a href="../../migration/wsc30/php/" class="md-nav__link">
1756 PHP API
1757 </a>
1758 </li>
1759
1760
1761
1762
1763
1764
1765
1766 <li class="md-nav__item">
1767 <a href="../../migration/wsc30/javascript/" class="md-nav__link">
1768 JavaScript API
1769 </a>
1770 </li>
1771
1772
1773
1774
1775
1776
1777
1778 <li class="md-nav__item">
1779 <a href="../../migration/wsc30/templates/" class="md-nav__link">
1780 Templates
1781 </a>
1782 </li>
1783
1784
1785
1786
1787
1788
1789
1790 <li class="md-nav__item">
1791 <a href="../../migration/wsc30/css/" class="md-nav__link">
1792 CSS
1793 </a>
1794 </li>
1795
1796
1797
1798
1799
1800
1801
1802 <li class="md-nav__item">
1803 <a href="../../migration/wsc30/package/" class="md-nav__link">
1804 Package Components
1805 </a>
1806 </li>
1807
1808
1809
1810 </ul>
1811 </nav>
1812 </li>
1813
1814
1815
1816
1817
1818
1819
1820
1821 <li class="md-nav__item md-nav__item--nested">
1822
1823
1824 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
1825
1826 <label class="md-nav__link" for="__nav_6_5">
1827 Migrating from WCF 2.1
1828 <span class="md-nav__icon md-icon"></span>
1829 </label>
1830 <nav class="md-nav" aria-label="Migrating from WCF 2.1" data-md-level="2">
1831 <label class="md-nav__title" for="__nav_6_5">
1832 <span class="md-nav__icon md-icon"></span>
1833 Migrating from WCF 2.1
1834 </label>
1835 <ul class="md-nav__list" data-md-scrollfix>
1836
1837
1838
1839
1840
1841 <li class="md-nav__item">
1842 <a href="../../migration/wcf21/php/" class="md-nav__link">
1843 PHP API
1844 </a>
1845 </li>
1846
1847
1848
1849
1850
1851
1852
1853 <li class="md-nav__item">
1854 <a href="../../migration/wcf21/templates/" class="md-nav__link">
1855 Templates
1856 </a>
1857 </li>
1858
1859
1860
1861
1862
1863
1864
1865 <li class="md-nav__item">
1866 <a href="../../migration/wcf21/css/" class="md-nav__link">
1867 CSS
1868 </a>
1869 </li>
1870
1871
1872
1873
1874
1875
1876
1877 <li class="md-nav__item">
1878 <a href="../../migration/wcf21/package/" class="md-nav__link">
1879 Package Components
1880 </a>
1881 </li>
1882
1883
1884
1885 </ul>
1886 </nav>
1887 </li>
1888
1889
1890
1891 </ul>
1892 </nav>
1893 </li>
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905 <li class="md-nav__item md-nav__item--nested">
1906
1907
1908 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
1909
1910 <label class="md-nav__link" for="__nav_7">
1911 Tutorials
1912 <span class="md-nav__icon md-icon"></span>
1913 </label>
1914 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
1915 <label class="md-nav__title" for="__nav_7">
1916 <span class="md-nav__icon md-icon"></span>
1917 Tutorials
1918 </label>
1919 <ul class="md-nav__list" data-md-scrollfix>
1920
1921
1922
1923
1924
1925
1926 <li class="md-nav__item md-nav__item--nested">
1927
1928
1929 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
1930
1931 <label class="md-nav__link" for="__nav_7_1">
1932 Tutorial Series
1933 <span class="md-nav__icon md-icon"></span>
1934 </label>
1935 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
1936 <label class="md-nav__title" for="__nav_7_1">
1937 <span class="md-nav__icon md-icon"></span>
1938 Tutorial Series
1939 </label>
1940 <ul class="md-nav__list" data-md-scrollfix>
1941
1942
1943
1944
1945
1946 <li class="md-nav__item">
1947 <a href="../../tutorial/series/overview/" class="md-nav__link">
1948 Overview
1949 </a>
1950 </li>
1951
1952
1953
1954
1955
1956
1957
1958 <li class="md-nav__item">
1959 <a href="../../tutorial/series/part_1/" class="md-nav__link">
1960 Part 1
1961 </a>
1962 </li>
1963
1964
1965
1966
1967
1968
1969
1970 <li class="md-nav__item">
1971 <a href="../../tutorial/series/part_2/" class="md-nav__link">
1972 Part 2
1973 </a>
1974 </li>
1975
1976
1977
1978
1979
1980
1981
1982 <li class="md-nav__item">
1983 <a href="../../tutorial/series/part_3/" class="md-nav__link">
1984 Part 3
1985 </a>
1986 </li>
1987
1988
1989
1990 </ul>
1991 </nav>
1992 </li>
1993
1994
1995
1996 </ul>
1997 </nav>
1998 </li>
1999
2000
2001
2002 </ul>
2003 </nav>
2004 </div>
2005 </div>
2006 </div>
2007
2008
2009
2010 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2011 <div class="md-sidebar__scrollwrap">
2012 <div class="md-sidebar__inner">
2013
2014 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2015
2016
2017
2018
2019
2020 <label class="md-nav__title" for="__toc">
2021 <span class="md-nav__icon md-icon"></span>
2022 Table of contents
2023 </label>
2024 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2025
2026 <li class="md-nav__item">
2027 <a href="#databaseobject" class="md-nav__link">
2028 DatabaseObject
2029 </a>
2030
2031 </li>
2032
2033 <li class="md-nav__item">
2034 <a href="#databaseobjectdecorator" class="md-nav__link">
2035 DatabaseObjectDecorator
2036 </a>
2037
2038 </li>
2039
2040 <li class="md-nav__item">
2041 <a href="#databaseobjecteditor" class="md-nav__link">
2042 DatabaseObjectEditor
2043 </a>
2044
2045 <nav class="md-nav" aria-label="DatabaseObjectEditor">
2046 <ul class="md-nav__list">
2047
2048 <li class="md-nav__item">
2049 <a href="#create-a-new-row" class="md-nav__link">
2050 Create a new row
2051 </a>
2052
2053 </li>
2054
2055 <li class="md-nav__item">
2056 <a href="#updating-an-existing-row" class="md-nav__link">
2057 Updating an existing row
2058 </a>
2059
2060 </li>
2061
2062 <li class="md-nav__item">
2063 <a href="#deleting-a-row" class="md-nav__link">
2064 Deleting a row
2065 </a>
2066
2067 </li>
2068
2069 </ul>
2070 </nav>
2071
2072 </li>
2073
2074 <li class="md-nav__item">
2075 <a href="#databaseobjectlist" class="md-nav__link">
2076 DatabaseObjectList
2077 </a>
2078
2079 </li>
2080
2081 <li class="md-nav__item">
2082 <a href="#abstractdatabaseobjectaction" class="md-nav__link">
2083 AbstractDatabaseObjectAction
2084 </a>
2085
2086 <nav class="md-nav" aria-label="AbstractDatabaseObjectAction">
2087 <ul class="md-nav__list">
2088
2089 <li class="md-nav__item">
2090 <a href="#executing-an-action" class="md-nav__link">
2091 Executing an Action
2092 </a>
2093
2094 </li>
2095
2096 <li class="md-nav__item">
2097 <a href="#custom-method-with-ajax-support" class="md-nav__link">
2098 Custom Method with AJAX Support
2099 </a>
2100
2101 <nav class="md-nav" aria-label="Custom Method with AJAX Support">
2102 <ul class="md-nav__list">
2103
2104 <li class="md-nav__item">
2105 <a href="#ajax-validation" class="md-nav__link">
2106 AJAX Validation
2107 </a>
2108
2109 </li>
2110
2111 <li class="md-nav__item">
2112 <a href="#create-update-and-delete" class="md-nav__link">
2113 create, update and delete
2114 </a>
2115
2116 </li>
2117
2118 <li class="md-nav__item">
2119 <a href="#allow-invokation-by-guests" class="md-nav__link">
2120 Allow Invokation by Guests
2121 </a>
2122
2123 </li>
2124
2125 <li class="md-nav__item">
2126 <a href="#acp-access-only" class="md-nav__link">
2127 ACP Access Only
2128 </a>
2129
2130 </li>
2131
2132 </ul>
2133 </nav>
2134
2135 </li>
2136
2137 </ul>
2138 </nav>
2139
2140 </li>
2141
2142 </ul>
2143
2144 </nav>
2145 </div>
2146 </div>
2147 </div>
2148
2149
2150 <div class="md-content" data-md-component="content">
2151 <article class="md-content__inner md-typeset">
2152
2153
2154 <a href="https://github.com/WoltLab/docs.woltlab.com/edit/5.4/docs/php/database-objects.md" title="Edit this page" class="md-content__button md-icon">
2155 <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>
2156 </a>
2157
2158
2159 <h1 id="database-objects">Database Objects<a class="headerlink" href="#database-objects" title="Permanent link">#</a></h1>
2160 <p>WoltLab Suite uses a unified interface to work with database rows using an object based approach instead of using native arrays holding arbitrary data. Each database table is mapped to a model class that is designed to hold a single record from that table and expose methods to work with the stored data, for example providing assistance when working with normalized datasets.</p>
2161 <p>Developers are required to provide the proper DatabaseObject implementations themselves, they're not automatically generated, all though the actual code that needs to be written is rather small. The following examples assume the fictional database table <code>wcf1_example</code>, <code>exampleID</code> as the auto-incrementing primary key and the column <code>bar</code> to store some text.</p>
2162 <h2 id="databaseobject">DatabaseObject<a class="headerlink" href="#databaseobject" title="Permanent link">#</a></h2>
2163 <p>The basic model derives from <code>wcf\data\DatabaseObject</code> and provides a convenient constructor to fetch a single row or construct an instance using pre-loaded rows.</p>
2164 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2165 <span class="k">namespace</span> <span class="nx">wcf\data\example</span><span class="p">;</span>
2166 <span class="k">use</span> <span class="nx">wcf\data\DatabaseObject</span><span class="p">;</span>
2167
2168 <span class="k">class</span> <span class="nc">Example</span> <span class="k">extends</span> <span class="nx">DatabaseObject</span> <span class="p">{}</span>
2169 </code></pre></div>
2170 <p>The class is intended to be empty by default and there only needs to be code if you want to add additional logic to your model. Both the class name and primary key are determined by <code>DatabaseObject</code> using the namespace and class name of the derived class. The example above uses the namespace <code>wcf\…</code> which is used as table prefix and the class name <code>Example</code> is converted into <code>exampleID</code>, resulting in the database table name <code>wcfN_example</code> with the primary key <code>exampleID</code>.</p>
2171 <p>You can prevent this automatic guessing by setting the class properties <code>$databaseTableName</code> and <code>$databaseTableIndexName</code> manually.</p>
2172 <h2 id="databaseobjectdecorator">DatabaseObjectDecorator<a class="headerlink" href="#databaseobjectdecorator" title="Permanent link">#</a></h2>
2173 <p>If you already have a <code>DatabaseObject</code> class and would like to extend it with additional data or methods, for example by providing a class <code>ViewableExample</code> which features view-related changes without polluting the original object, you can use <code>DatabaseObjectDecorator</code> which a default implementation of a decorator for database objects.</p>
2174 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2175 <span class="k">namespace</span> <span class="nx">wcf\data\example</span><span class="p">;</span>
2176 <span class="k">use</span> <span class="nx">wcf\data\DatabaseObjectDecorator</span><span class="p">;</span>
2177
2178 <span class="k">class</span> <span class="nc">ViewableExample</span> <span class="k">extends</span> <span class="nx">DatabaseObjectDecorator</span> <span class="p">{</span>
2179 <span class="k">protected</span> <span class="k">static</span> <span class="nv">$baseClass</span> <span class="o">=</span> <span class="nx">Example</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
2180
2181 <span class="k">public</span> <span class="k">function</span> <span class="nf">getOutput</span><span class="p">()</span> <span class="p">{</span>
2182 <span class="nv">$output</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
2183
2184 <span class="c1">// [determine output]</span>
2185
2186 <span class="k">return</span> <span class="nv">$output</span><span class="p">;</span>
2187 <span class="p">}</span>
2188 <span class="p">}</span>
2189 </code></pre></div>
2190 <p>It is mandatory to set the static <code>$baseClass</code> property to the name of the decorated class.</p>
2191 <p>Like for any decorator, you can directly access the decorated object's properties and methods for a decorated object by accessing the property or calling the method on the decorated object.
2192 You can access the decorated objects directly via <code>DatabaseObjectDecorator::getDecoratedObject()</code>.</p>
2193 <h2 id="databaseobjecteditor">DatabaseObjectEditor<a class="headerlink" href="#databaseobjecteditor" title="Permanent link">#</a></h2>
2194 <div class="admonition info">
2195 <p class="admonition-title">This is the low-level interface to manipulate data rows, it is recommended to use <code>AbstractDatabaseObjectAction</code>.</p>
2196 </div>
2197 <p>Adding, editing and deleting models is done using the <code>DatabaseObjectEditor</code> class that decorates a <code>DatabaseObject</code> and uses its data to perform the actions.</p>
2198 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2199 <span class="k">namespace</span> <span class="nx">wcf\data\example</span><span class="p">;</span>
2200 <span class="k">use</span> <span class="nx">wcf\data\DatabaseObjectEditor</span><span class="p">;</span>
2201
2202 <span class="k">class</span> <span class="nc">ExampleEditor</span> <span class="k">extends</span> <span class="nx">DatabaseObjectEditor</span> <span class="p">{</span>
2203 <span class="k">protected</span> <span class="k">static</span> <span class="nv">$baseClass</span> <span class="o">=</span> <span class="nx">Example</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
2204 <span class="p">}</span>
2205 </code></pre></div>
2206 <p>The editor class requires you to provide the fully qualified name of the model, that is the class name including the complete namespace. Database table name and index key will be pulled directly from the model.</p>
2207 <h3 id="create-a-new-row">Create a new row<a class="headerlink" href="#create-a-new-row" title="Permanent link">#</a></h3>
2208 <p>Inserting a new row into the database table is provided through <code>DatabaseObjectEditor::create()</code> which yields a <code>DatabaseObject</code> instance after creation.</p>
2209 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2210 <span class="nv">$example</span> <span class="o">=</span> <span class="nx">\wcf\data\example\ExampleEditor</span><span class="o">::</span><span class="na">create</span><span class="p">([</span>
2211 <span class="s1">&#39;bar&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Hello World!&#39;</span>
2212 <span class="p">]);</span>
2213
2214 <span class="c1">// output: Hello World!</span>
2215 <span class="k">echo</span> <span class="nv">$example</span><span class="o">-&gt;</span><span class="na">bar</span><span class="p">;</span>
2216 </code></pre></div>
2217 <h3 id="updating-an-existing-row">Updating an existing row<a class="headerlink" href="#updating-an-existing-row" title="Permanent link">#</a></h3>
2218 <div class="admonition warning">
2219 <p class="admonition-title">The internal state of the decorated <code>DatabaseObject</code> is not altered at any point, the values will still be the same after editing or deleting the represented row. If you need an object with the latest data, you'll have to discard the current object and refetch the data from database.</p>
2220 </div>
2221 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2222 <span class="nv">$example</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\data\example\Example</span><span class="p">(</span><span class="nv">$id</span><span class="p">);</span>
2223 <span class="nv">$exampleEditor</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\data\example\ExampleEditor</span><span class="p">(</span><span class="nv">$example</span><span class="p">);</span>
2224 <span class="nv">$exampleEditor</span><span class="o">-&gt;</span><span class="na">update</span><span class="p">([</span>
2225 <span class="s1">&#39;bar&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;baz&#39;</span>
2226 <span class="p">]);</span>
2227
2228 <span class="c1">// output: Hello World!</span>
2229 <span class="k">echo</span> <span class="nv">$example</span><span class="o">-&gt;</span><span class="na">bar</span><span class="p">;</span>
2230
2231 <span class="c1">// re-creating the object will query the database again and retrieve the updated value</span>
2232 <span class="nv">$example</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\data\example\Example</span><span class="p">(</span><span class="nv">$example</span><span class="o">-&gt;</span><span class="na">id</span><span class="p">);</span>
2233
2234 <span class="c1">// output: baz</span>
2235 <span class="k">echo</span> <span class="nv">$example</span><span class="o">-&gt;</span><span class="na">bar</span><span class="p">;</span>
2236 </code></pre></div>
2237 <h3 id="deleting-a-row">Deleting a row<a class="headerlink" href="#deleting-a-row" title="Permanent link">#</a></h3>
2238 <div class="admonition warning">
2239 <p class="admonition-title">Similar to the update process, the decorated <code>DatabaseObject</code> is not altered and will then point to an inexistent row.</p>
2240 </div>
2241 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2242 <span class="nv">$example</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\data\example\Example</span><span class="p">(</span><span class="nv">$id</span><span class="p">);</span>
2243 <span class="nv">$exampleEditor</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\data\example\ExampleEditor</span><span class="p">(</span><span class="nv">$example</span><span class="p">);</span>
2244 <span class="nv">$exampleEditor</span><span class="o">-&gt;</span><span class="na">delete</span><span class="p">();</span>
2245 </code></pre></div>
2246 <h2 id="databaseobjectlist">DatabaseObjectList<a class="headerlink" href="#databaseobjectlist" title="Permanent link">#</a></h2>
2247 <p>Every row is represented as a single instance of the model, but the instance creation deals with single rows only. Retrieving larger sets of rows would be quite inefficient due to the large amount of queries that will be dispatched. This is solved with the <code>DatabaseObjectList</code> object that exposes an interface to query the database table using arbitrary conditions for data selection. All rows will be fetched using a single query and the resulting rows are automatically loaded into separate models.</p>
2248 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2249 <span class="k">namespace</span> <span class="nx">wcf\data\example</span><span class="p">;</span>
2250 <span class="k">use</span> <span class="nx">wcf\data\DatabaseObjectList</span><span class="p">;</span>
2251
2252 <span class="k">class</span> <span class="nc">ExampleList</span> <span class="k">extends</span> <span class="nx">DatabaseObjectList</span> <span class="p">{</span>
2253 <span class="k">public</span> <span class="nv">$className</span> <span class="o">=</span> <span class="nx">Example</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
2254 <span class="p">}</span>
2255 </code></pre></div>
2256 <p>The following code listing illustrates loading a large set of examples and iterating over the list to retrieve the objects.</p>
2257 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2258 <span class="nv">$exampleList</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\data\example\ExampleList</span><span class="p">();</span>
2259 <span class="c1">// add constraints using the condition builder</span>
2260 <span class="nv">$exampleList</span><span class="o">-&gt;</span><span class="na">getConditionBuilder</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">add</span><span class="p">(</span><span class="s1">&#39;bar IN (?)&#39;</span><span class="p">,</span> <span class="p">[[</span><span class="s1">&#39;Hello World!&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">]]);</span>
2261 <span class="c1">// actually read the rows</span>
2262 <span class="nv">$exampleList</span><span class="o">-&gt;</span><span class="na">readObjects</span><span class="p">();</span>
2263 <span class="k">foreach</span> <span class="p">(</span><span class="nv">$exampleList</span> <span class="k">as</span> <span class="nv">$example</span><span class="p">)</span> <span class="p">{</span>
2264 <span class="k">echo</span> <span class="nv">$example</span><span class="o">-&gt;</span><span class="na">bar</span><span class="p">;</span>
2265 <span class="p">}</span>
2266
2267 <span class="c1">// retrieve the models directly instead of iterating over them</span>
2268 <span class="nv">$examples</span> <span class="o">=</span> <span class="nv">$exampleList</span><span class="o">-&gt;</span><span class="na">getObjects</span><span class="p">();</span>
2269
2270 <span class="c1">// just retrieve the number of rows</span>
2271 <span class="nv">$exampleCount</span> <span class="o">=</span> <span class="nv">$exampleList</span><span class="o">-&gt;</span><span class="na">countObjects</span><span class="p">();</span>
2272 </code></pre></div>
2273 <p><code>DatabaseObjectList</code> implements both <a href="https://secure.php.net/manual/en/class.seekableiterator.php">SeekableIterator</a> and <a href="https://secure.php.net/manual/en/class.countable.php">Countable</a>.</p>
2274 <p>Additionally, <code>DatabaseObjectList</code> objects has the following three public properties that are useful when fetching data with lists:</p>
2275 <ul>
2276 <li><code>$sqlLimit</code> determines how many rows are fetched.
2277 If its value is <code>0</code> (which is the default value), all results are fetched.
2278 So be careful when dealing with large tables and you only want a limited number of rows:
2279 Set <code>$sqlLimit</code> to a value larger than zero!</li>
2280 <li><code>$sqlOffset</code>:
2281 Paginated pages like a thread list use this feature a lot, it allows you to skip a given number of results.
2282 Imagine you want to display 20 threads per page but there are a total of 60 threads available.
2283 In this case you would specify <code>$sqlLimit = 20</code> and <code>$sqlOffset = 20</code> which will skip the first 20 threads, effectively displaying thread 21 to 40.</li>
2284 <li><code>$sqlOrderBy</code> determines by which column(s) the rows are sorted in which order.
2285 Using our example in <code>$sqlOffset</code> you might want to display the 20 most recent threads on page 1, thus you should specify the order field and its direction, e.g. <code>$sqlOrderBy = 'thread.lastPostTime DESC'</code> which returns the most recent thread first.</li>
2286 </ul>
2287 <p>For more advanced usage, there two additional fields that deal with the type of objects returned.
2288 First, let's go into a bit more detail what setting the <code>$className</code> property actually does:</p>
2289 <ol>
2290 <li>It is the type of database object in which the rows are wrapped.</li>
2291 <li>It determines which database table is actually queried and which index is used (see the <code>$databaseTableName</code> and <code>$databaseTableIndexName</code> properties of <code>DatabaseObject</code>).</li>
2292 </ol>
2293 <p>Sometimes you might use the database table of some database object but wrap the rows in another database object.
2294 This can be achieved by setting the <code>$objectClassName</code> property to the desired class name.</p>
2295 <p>In other cases, you might want to wrap the created objects in a database object decorator which can be done by setting the <code>$decoratorClassName</code> property to the desired class name:</p>
2296 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2297 <span class="nv">$exampleList</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\wcf\data\example\ExampleList</span><span class="p">();</span>
2298 <span class="nv">$exampleList</span><span class="o">-&gt;</span><span class="na">decoratorClassName</span> <span class="o">=</span> <span class="nx">\wcf\data\example\ViewableExample</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
2299 </code></pre></div>
2300 <p>Of course, you do not have to set the property after creating the list object, you can also set it by creating a dedicated class:</p>
2301 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2302 <span class="k">namespace</span> <span class="nx">wcf\data\example</span><span class="p">;</span>
2303
2304 <span class="k">class</span> <span class="nc">ViewableExampleList</span> <span class="k">extends</span> <span class="nx">ExampleList</span> <span class="p">{</span>
2305 <span class="k">public</span> <span class="nv">$decoratorClassName</span> <span class="o">=</span> <span class="nx">ViewableExample</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
2306 <span class="p">}</span>
2307 </code></pre></div>
2308 <h2 id="abstractdatabaseobjectaction">AbstractDatabaseObjectAction<a class="headerlink" href="#abstractdatabaseobjectaction" title="Permanent link">#</a></h2>
2309 <p>Row creation and manipulation can be performed using the aforementioned <code>DatabaseObjectEditor</code> class, but this approach has two major issues:</p>
2310 <ol>
2311 <li>Row creation, update and deletion takes place silently without notifying any other components.</li>
2312 <li>Data is passed to the database adapter without any further processing.</li>
2313 </ol>
2314 <p>The <code>AbstractDatabaseObjectAction</code> solves both problems by wrapping around the editor class and thus provide an additional layer between the action that should be taken and the actual process. The first problem is solved by a fixed set of events being fired, the second issue is addressed by having a single entry point for all data editing.</p>
2315 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2316 <span class="k">namespace</span> <span class="nx">wcf\data\example</span><span class="p">;</span>
2317 <span class="k">use</span> <span class="nx">wcf\data\AbstractDatabaseObjectAction</span><span class="p">;</span>
2318
2319 <span class="k">class</span> <span class="nc">ExampleAction</span> <span class="k">extends</span> <span class="nx">AbstractDatabaseObjectAction</span> <span class="p">{</span>
2320 <span class="k">public</span> <span class="nv">$className</span> <span class="o">=</span> <span class="nx">ExampleEditor</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
2321 <span class="p">}</span>
2322 </code></pre></div>
2323 <h3 id="executing-an-action">Executing an Action<a class="headerlink" href="#executing-an-action" title="Permanent link">#</a></h3>
2324 <div class="admonition warning">
2325 <p class="admonition-title">The method <code>AbstractDatabaseObjectAction::validateAction()</code> is internally used for AJAX method invocation and must not be called programmatically.</p>
2326 </div>
2327 <p>The next example represents the same functionality as seen for <code>DatabaseObjectEditor</code>:</p>
2328 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2329 <span class="k">use</span> <span class="nx">wcf\data\example\ExampleAction</span><span class="p">;</span>
2330
2331 <span class="c1">// create a row</span>
2332 <span class="nv">$exampleAction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ExampleAction</span><span class="p">([],</span> <span class="s1">&#39;create&#39;</span><span class="p">,</span> <span class="p">[</span>
2333 <span class="s1">&#39;data&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="s1">&#39;bar&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Hello World&#39;</span><span class="p">]</span>
2334 <span class="p">]);</span>
2335 <span class="nv">$example</span> <span class="o">=</span> <span class="nv">$exampleAction</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">()[</span><span class="s1">&#39;returnValues&#39;</span><span class="p">];</span>
2336
2337 <span class="c1">// update a row using the id</span>
2338 <span class="nv">$exampleAction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ExampleAction</span><span class="p">([</span><span class="mi">1</span><span class="p">],</span> <span class="s1">&#39;update&#39;</span><span class="p">,</span> <span class="p">[</span>
2339 <span class="s1">&#39;data&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="s1">&#39;bar&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;baz&#39;</span><span class="p">]</span>
2340 <span class="p">]);</span>
2341 <span class="nv">$exampleAction</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
2342
2343 <span class="c1">// delete a row using a model</span>
2344 <span class="nv">$exampleAction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ExampleAction</span><span class="p">([</span><span class="nv">$example</span><span class="p">],</span> <span class="s1">&#39;delete&#39;</span><span class="p">);</span>
2345 <span class="nv">$exampleAction</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
2346 </code></pre></div>
2347 <p>You can access the return values both by storing the return value of <code>executeAction()</code> or by retrieving it via <code>getReturnValues()</code>.</p>
2348 <p><span class="label label-info">Events</span> <code>initializeAction</code>, <code>validateAction</code> and <code>finalizeAction</code></p>
2349 <h3 id="custom-method-with-ajax-support">Custom Method with AJAX Support<a class="headerlink" href="#custom-method-with-ajax-support" title="Permanent link">#</a></h3>
2350 <p>This section is about adding the method <code>baz()</code> to <code>ExampleAction</code> and calling it via AJAX.</p>
2351 <h4 id="ajax-validation">AJAX Validation<a class="headerlink" href="#ajax-validation" title="Permanent link">#</a></h4>
2352 <p>Methods of an action cannot be called via AJAX, unless they have a validation method. This means that <code>ExampleAction</code> must define both a <code>public function baz()</code> and <code>public function validateBaz()</code>, the name for the validation method is constructed by upper-casing the first character of the method name and prepending <code>validate</code>.</p>
2353 <p>The lack of the companion <code>validate*</code> method will cause the AJAX proxy to deny the request instantaneously. Do not add a validation method if you don't want it to be callable via AJAX ever!</p>
2354 <h4 id="create-update-and-delete">create, update and delete<a class="headerlink" href="#create-update-and-delete" title="Permanent link">#</a></h4>
2355 <p>The methods <code>create</code>, <code>update</code> and <code>delete</code> are available for all classes deriving from <code>AbstractDatabaseObjectAction</code> and directly pass the input data to the <code>DatabaseObjectEditor</code>. These methods deny access to them via AJAX by default, unless you explicitly enable access. Depending on your case, there are two different strategies to enable AJAX access to them.</p>
2356 <div class="highlight"><pre><span></span><code><span class="o">&lt;?</span><span class="nx">php</span>
2357 <span class="k">namespace</span> <span class="nx">wcf\data\example</span><span class="p">;</span>
2358 <span class="k">use</span> <span class="nx">wcf\data\AbstractDatabaseObjectAction</span><span class="p">;</span>
2359
2360 <span class="k">class</span> <span class="nc">ExampleAction</span> <span class="k">extends</span> <span class="nx">AbstractDatabaseObjectAction</span> <span class="p">{</span>
2361 <span class="c1">// `create()` can now be called via AJAX if the requesting user posses the listed permissions</span>
2362 <span class="k">protected</span> <span class="nv">$permissionsCreate</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;admin.example.canManageExample&#39;</span><span class="p">];</span>
2363
2364 <span class="k">public</span> <span class="k">function</span> <span class="nf">validateUpdate</span><span class="p">()</span> <span class="p">{</span>
2365 <span class="c1">// your very own validation logic that does not make use of the</span>
2366 <span class="c1">// built-in `$permissionsUpdate` property</span>
2367
2368 <span class="c1">// you can still invoke the built-in permissions check if you like to</span>
2369 <span class="k">parent</span><span class="o">::</span><span class="na">validateUpdate</span><span class="p">();</span>
2370 <span class="p">}</span>
2371 <span class="p">}</span>
2372 </code></pre></div>
2373 <h4 id="allow-invokation-by-guests">Allow Invokation by Guests<a class="headerlink" href="#allow-invokation-by-guests" title="Permanent link">#</a></h4>
2374 <p>Invoking methods is restricted to logged-in users by default and the only way to override this behavior is to alter the property <code>$allowGuestAccess</code>. It is a simple string array that is expected to hold all methods that should be accessible by users, excluding their companion validation methods.</p>
2375 <h4 id="acp-access-only">ACP Access Only<a class="headerlink" href="#acp-access-only" title="Permanent link">#</a></h4>
2376 <p>Method access is usually limited by permissions, but sometimes there might be the need for some added security to avoid mistakes. The <code>$requireACP</code> property works similar to <code>$allowGuestAccess</code>, but enforces the request to originate from the ACP together with a valid ACP session, ensuring that only users able to access the ACP can actually invoke these methods.</p>
2377
2378
2379
2380
2381 <hr>
2382 <div class="md-source-date">
2383 <small>
2384
2385 Last update: 2021-02-11
2386
2387 </small>
2388 </div>
2389
2390
2391
2392
2393
2394
2395
2396
2397 </article>
2398 </div>
2399 </div>
2400
2401 </main>
2402
2403
2404 <footer class="md-footer">
2405
2406 <nav class="md-footer__inner md-grid" aria-label="Footer">
2407
2408 <a href="../pages/" class="md-footer__link md-footer__link--prev" rel="prev">
2409 <div class="md-footer__button md-icon">
2410 <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>
2411 </div>
2412 <div class="md-footer__title">
2413 <div class="md-ellipsis">
2414 <span class="md-footer__direction">
2415 Previous
2416 </span>
2417 Pages
2418 </div>
2419 </div>
2420 </a>
2421
2422
2423 <a href="../database-access/" class="md-footer__link md-footer__link--next" rel="next">
2424 <div class="md-footer__title">
2425 <div class="md-ellipsis">
2426 <span class="md-footer__direction">
2427 Next
2428 </span>
2429 Database Access
2430 </div>
2431 </div>
2432 <div class="md-footer__button md-icon">
2433 <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>
2434 </div>
2435 </a>
2436
2437 </nav>
2438
2439 <div class="md-footer-meta md-typeset">
2440 <div class="md-footer-meta__inner md-grid">
2441 <div class="md-footer-copyright">
2442
2443 <div class="md-footer-copyright__highlight">
2444 Copyright © 2020 WoltLab GmbH
2445 </div>
2446
2447 Made with
2448 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2449 Material for MkDocs
2450 </a>
2451
2452 </div>
2453 <div class="md-footer-copyright">
2454 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
2455 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
2456 </div>
2457 </div>
2458 </div>
2459 </footer>
2460
2461 </div>
2462 <div class="md-dialog" data-md-component="dialog">
2463 <div class="md-dialog__inner md-typeset"></div>
2464 </div>
2465 <script id="__config" type="application/json">{"base": "../..", "features": [], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}, "search": "../../assets/javascripts/workers/search.fe42c31b.min.js", "version": {"provider": "mike"}}</script>
2466
2467
2468 <script src="../../assets/javascripts/bundle.d892486b.min.js"></script>
2469
2470
2471 </body>
2472 </html>