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