Deployed 0de5751 to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / latest / php / apps / index.html
1
2 <!doctype html>
3 <html lang="en" class="no-js">
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width,initial-scale=1">
8
9
10
11
12 <link rel="shortcut icon" href="../../assets/default.favicon.ico">
13 <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-7.0.5">
14
15
16
17 <title>Apps - WoltLab Suite Documentation</title>
18
19
20
21 <link rel="stylesheet" href="../../assets/stylesheets/main.77f3fd56.min.css">
22
23
24 <link rel="stylesheet" href="../../assets/stylesheets/palette.7fa14f5b.min.css">
25
26
27
28 <meta name="theme-color" content="#009485">
29
30
31
32
33
34
35
36
37
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="#apps-for-woltlab-suite" 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 Apps
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
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
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
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
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 <li class="md-nav__item">
259 <a href="../database-objects/" class="md-nav__link">
260 Database Objects
261 </a>
262 </li>
263
264
265
266
267
268
269
270 <li class="md-nav__item">
271 <a href="../database-access/" class="md-nav__link">
272 Database Access
273 </a>
274 </li>
275
276
277
278
279
280
281
282 <li class="md-nav__item">
283 <a href="../exceptions/" class="md-nav__link">
284 Exceptions
285 </a>
286 </li>
287
288
289
290
291
292
293
294
295 <li class="md-nav__item md-nav__item--nested">
296
297
298 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" >
299
300 <label class="md-nav__link" for="__nav_2_5">
301 API
302 <span class="md-nav__icon md-icon"></span>
303 </label>
304 <nav class="md-nav" aria-label="API" data-md-level="2">
305 <label class="md-nav__title" for="__nav_2_5">
306 <span class="md-nav__icon md-icon"></span>
307 API
308 </label>
309 <ul class="md-nav__list" data-md-scrollfix>
310
311
312
313
314
315 <li class="md-nav__item">
316 <a href="../api/caches/" class="md-nav__link">
317 Caches
318 </a>
319 </li>
320
321
322
323
324
325
326
327 <li class="md-nav__item">
328 <a href="../api/comments/" class="md-nav__link">
329 Comments
330 </a>
331 </li>
332
333
334
335
336
337
338
339 <li class="md-nav__item">
340 <a href="../api/cronjobs/" class="md-nav__link">
341 Cronjobs
342 </a>
343 </li>
344
345
346
347
348
349
350
351 <li class="md-nav__item">
352 <a href="../api/events/" class="md-nav__link">
353 Events
354 </a>
355 </li>
356
357
358
359
360
361
362
363
364 <li class="md-nav__item md-nav__item--nested">
365
366
367 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5_5" type="checkbox" id="__nav_2_5_5" >
368
369 <label class="md-nav__link" for="__nav_2_5_5">
370 Form Builder
371 <span class="md-nav__icon md-icon"></span>
372 </label>
373 <nav class="md-nav" aria-label="Form Builder" data-md-level="3">
374 <label class="md-nav__title" for="__nav_2_5_5">
375 <span class="md-nav__icon md-icon"></span>
376 Form Builder
377 </label>
378 <ul class="md-nav__list" data-md-scrollfix>
379
380
381
382
383
384 <li class="md-nav__item">
385 <a href="../api/form_builder/overview/" class="md-nav__link">
386 Overview
387 </a>
388 </li>
389
390
391
392
393
394
395
396 <li class="md-nav__item">
397 <a href="../api/form_builder/structure/" class="md-nav__link">
398 Structure
399 </a>
400 </li>
401
402
403
404
405
406
407
408 <li class="md-nav__item">
409 <a href="../api/form_builder/form_fields/" class="md-nav__link">
410 Fields
411 </a>
412 </li>
413
414
415
416
417
418
419
420 <li class="md-nav__item">
421 <a href="../api/form_builder/validation_data/" class="md-nav__link">
422 Validation and Data
423 </a>
424 </li>
425
426
427
428
429
430
431
432 <li class="md-nav__item">
433 <a href="../api/form_builder/dependencies/" class="md-nav__link">
434 Dependencies
435 </a>
436 </li>
437
438
439
440 </ul>
441 </nav>
442 </li>
443
444
445
446
447
448
449
450 <li class="md-nav__item">
451 <a href="../api/package_installation_plugins/" class="md-nav__link">
452 Package Installation Plugins
453 </a>
454 </li>
455
456
457
458
459
460
461
462 <li class="md-nav__item">
463 <a href="../api/user_activity_points/" class="md-nav__link">
464 User Activity Points
465 </a>
466 </li>
467
468
469
470
471
472
473
474 <li class="md-nav__item">
475 <a href="../api/user_notifications/" class="md-nav__link">
476 User Notifications
477 </a>
478 </li>
479
480
481
482
483
484
485
486 <li class="md-nav__item">
487 <a href="../api/sitemaps/" class="md-nav__link">
488 Sitemaps
489 </a>
490 </li>
491
492
493
494 </ul>
495 </nav>
496 </li>
497
498
499
500
501
502
503
504 <li class="md-nav__item">
505 <a href="../code-style/" class="md-nav__link">
506 Code Style
507 </a>
508 </li>
509
510
511
512
513
514
515
516
517
518 <li class="md-nav__item md-nav__item--active">
519
520 <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
521
522
523
524
525 <label class="md-nav__link md-nav__link--active" for="__toc">
526 Apps
527 <span class="md-nav__icon md-icon"></span>
528 </label>
529
530 <a href="./" class="md-nav__link md-nav__link--active">
531 Apps
532 </a>
533
534
535 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
536
537
538
539
540
541 <label class="md-nav__title" for="__toc">
542 <span class="md-nav__icon md-icon"></span>
543 Table of contents
544 </label>
545 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
546
547 <li class="md-nav__item">
548 <a href="#introduction" class="md-nav__link">
549 Introduction
550 </a>
551
552 </li>
553
554 <li class="md-nav__item">
555 <a href="#differences-to-plugins" class="md-nav__link">
556 Differences to Plugins
557 </a>
558
559 <nav class="md-nav" aria-label="Differences to Plugins">
560 <ul class="md-nav__list">
561
562 <li class="md-nav__item">
563 <a href="#unique-namespace" class="md-nav__link">
564 Unique Namespace
565 </a>
566
567 </li>
568
569 <li class="md-nav__item">
570 <a href="#unique-database-table-prefix" class="md-nav__link">
571 Unique Database Table Prefix
572 </a>
573
574 </li>
575
576 <li class="md-nav__item">
577 <a href="#separate-domain-and-path-configuration" class="md-nav__link">
578 Separate Domain and Path Configuration
579 </a>
580
581 </li>
582
583 </ul>
584 </nav>
585
586 </li>
587
588 <li class="md-nav__item">
589 <a href="#creating-an-app" class="md-nav__link">
590 Creating an App
591 </a>
592
593 <nav class="md-nav" aria-label="Creating an App">
594 <ul class="md-nav__list">
595
596 <li class="md-nav__item">
597 <a href="#packagexml" class="md-nav__link">
598 package.xml
599 </a>
600
601 <nav class="md-nav" aria-label="package.xml">
602 <ul class="md-nav__list">
603
604 <li class="md-nav__item">
605 <a href="#isapplication1isapplication" class="md-nav__link">
606 &lt;isapplication&gt;1&lt;/isapplication&gt;
607 </a>
608
609 </li>
610
611 <li class="md-nav__item">
612 <a href="#applicationdirectoryexampleapplicationdirectory" class="md-nav__link">
613 &lt;applicationdirectory&gt;example&lt;/applicationdirectory&gt;
614 </a>
615
616 </li>
617
618 </ul>
619 </nav>
620
621 </li>
622
623 <li class="md-nav__item">
624 <a href="#minimum-required-files" class="md-nav__link">
625 Minimum Required Files
626 </a>
627
628 </li>
629
630 </ul>
631 </nav>
632
633 </li>
634
635 </ul>
636
637 </nav>
638
639 </li>
640
641
642
643
644
645
646
647 <li class="md-nav__item">
648 <a href="../gdpr/" class="md-nav__link">
649 GDPR
650 </a>
651 </li>
652
653
654
655 </ul>
656 </nav>
657 </li>
658
659
660
661
662
663
664
665
666
667
668
669 <li class="md-nav__item md-nav__item--nested">
670
671
672 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
673
674 <label class="md-nav__link" for="__nav_3">
675 Languages, Templates & CSS
676 <span class="md-nav__icon md-icon"></span>
677 </label>
678 <nav class="md-nav" aria-label="Languages, Templates & CSS" data-md-level="1">
679 <label class="md-nav__title" for="__nav_3">
680 <span class="md-nav__icon md-icon"></span>
681 Languages, Templates & CSS
682 </label>
683 <ul class="md-nav__list" data-md-scrollfix>
684
685
686
687
688
689 <li class="md-nav__item">
690 <a href="../../view/languages/" class="md-nav__link">
691 Languages
692 </a>
693 </li>
694
695
696
697
698
699
700
701 <li class="md-nav__item">
702 <a href="../../view/templates/" class="md-nav__link">
703 Templates
704 </a>
705 </li>
706
707
708
709
710
711
712
713 <li class="md-nav__item">
714 <a href="../../view/css/" class="md-nav__link">
715 CSS
716 </a>
717 </li>
718
719
720
721 </ul>
722 </nav>
723 </li>
724
725
726
727
728
729
730
731
732
733
734
735 <li class="md-nav__item md-nav__item--nested">
736
737
738 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
739
740 <label class="md-nav__link" for="__nav_4">
741 JavaScript API
742 <span class="md-nav__icon md-icon"></span>
743 </label>
744 <nav class="md-nav" aria-label="JavaScript API" data-md-level="1">
745 <label class="md-nav__title" for="__nav_4">
746 <span class="md-nav__icon md-icon"></span>
747 JavaScript API
748 </label>
749 <ul class="md-nav__list" data-md-scrollfix>
750
751
752
753
754
755 <li class="md-nav__item">
756 <a href="../../javascript/general-usage/" class="md-nav__link">
757 General Usage
758 </a>
759 </li>
760
761
762
763
764
765
766
767
768 <li class="md-nav__item md-nav__item--nested">
769
770
771 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4_2" type="checkbox" id="__nav_4_2" >
772
773 <label class="md-nav__link" for="__nav_4_2">
774 New API
775 <span class="md-nav__icon md-icon"></span>
776 </label>
777 <nav class="md-nav" aria-label="New API" data-md-level="2">
778 <label class="md-nav__title" for="__nav_4_2">
779 <span class="md-nav__icon md-icon"></span>
780 New API
781 </label>
782 <ul class="md-nav__list" data-md-scrollfix>
783
784
785
786
787
788 <li class="md-nav__item">
789 <a href="../../javascript/new-api_writing-a-module/" class="md-nav__link">
790 Writing a module
791 </a>
792 </li>
793
794
795
796
797
798
799
800 <li class="md-nav__item">
801 <a href="../../javascript/new-api_data-structures/" class="md-nav__link">
802 Data Structures
803 </a>
804 </li>
805
806
807
808
809
810
811
812 <li class="md-nav__item">
813 <a href="../../javascript/new-api_core/" class="md-nav__link">
814 Core Functions
815 </a>
816 </li>
817
818
819
820
821
822
823
824 <li class="md-nav__item">
825 <a href="../../javascript/new-api_dom/" class="md-nav__link">
826 DOM
827 </a>
828 </li>
829
830
831
832
833
834
835
836 <li class="md-nav__item">
837 <a href="../../javascript/new-api_events/" class="md-nav__link">
838 Event Handling
839 </a>
840 </li>
841
842
843
844
845
846
847
848 <li class="md-nav__item">
849 <a href="../../javascript/new-api_ajax/" class="md-nav__link">
850 Ajax
851 </a>
852 </li>
853
854
855
856
857
858
859
860 <li class="md-nav__item">
861 <a href="../../javascript/new-api_dialogs/" class="md-nav__link">
862 Dialogs
863 </a>
864 </li>
865
866
867
868
869
870
871
872 <li class="md-nav__item">
873 <a href="../../javascript/new-api_browser/" class="md-nav__link">
874 Browser and Screen Sizes
875 </a>
876 </li>
877
878
879
880
881
882
883
884 <li class="md-nav__item">
885 <a href="../../javascript/new-api_ui/" class="md-nav__link">
886 User Interface
887 </a>
888 </li>
889
890
891
892 </ul>
893 </nav>
894 </li>
895
896
897
898
899
900
901
902 <li class="md-nav__item">
903 <a href="../../javascript/legacy-api/" class="md-nav__link">
904 Legacy API
905 </a>
906 </li>
907
908
909
910
911
912
913
914 <li class="md-nav__item">
915 <a href="../../javascript/helper-functions/" class="md-nav__link">
916 Helper Functions
917 </a>
918 </li>
919
920
921
922
923
924
925
926 <li class="md-nav__item">
927 <a href="../../javascript/code-snippets/" class="md-nav__link">
928 Code Snippets
929 </a>
930 </li>
931
932
933
934 </ul>
935 </nav>
936 </li>
937
938
939
940
941
942
943
944
945
946
947
948 <li class="md-nav__item md-nav__item--nested">
949
950
951 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" >
952
953 <label class="md-nav__link" for="__nav_5">
954 Package Components
955 <span class="md-nav__icon md-icon"></span>
956 </label>
957 <nav class="md-nav" aria-label="Package Components" data-md-level="1">
958 <label class="md-nav__title" for="__nav_5">
959 <span class="md-nav__icon md-icon"></span>
960 Package Components
961 </label>
962 <ul class="md-nav__list" data-md-scrollfix>
963
964
965
966
967
968 <li class="md-nav__item">
969 <a href="../../package/package-xml/" class="md-nav__link">
970 package.xml
971 </a>
972 </li>
973
974
975
976
977
978
979
980
981 <li class="md-nav__item md-nav__item--nested">
982
983
984 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5_2" type="checkbox" id="__nav_5_2" >
985
986 <label class="md-nav__link" for="__nav_5_2">
987 PIPs
988 <span class="md-nav__icon md-icon"></span>
989 </label>
990 <nav class="md-nav" aria-label="PIPs" data-md-level="2">
991 <label class="md-nav__title" for="__nav_5_2">
992 <span class="md-nav__icon md-icon"></span>
993 PIPs
994 </label>
995 <ul class="md-nav__list" data-md-scrollfix>
996
997
998
999
1000
1001 <li class="md-nav__item">
1002 <a href="../../package/pip/" class="md-nav__link">
1003 Overview
1004 </a>
1005 </li>
1006
1007
1008
1009
1010
1011
1012
1013 <li class="md-nav__item">
1014 <a href="../../package/pip/acl-option/" class="md-nav__link">
1015 aclOption
1016 </a>
1017 </li>
1018
1019
1020
1021
1022
1023
1024
1025 <li class="md-nav__item">
1026 <a href="../../package/pip/acp-menu/" class="md-nav__link">
1027 acpMenu
1028 </a>
1029 </li>
1030
1031
1032
1033
1034
1035
1036
1037 <li class="md-nav__item">
1038 <a href="../../package/pip/acp-search-provider/" class="md-nav__link">
1039 acpSearchProvider
1040 </a>
1041 </li>
1042
1043
1044
1045
1046
1047
1048
1049 <li class="md-nav__item">
1050 <a href="../../package/pip/acp-template/" class="md-nav__link">
1051 acpTemplate
1052 </a>
1053 </li>
1054
1055
1056
1057
1058
1059
1060
1061 <li class="md-nav__item">
1062 <a href="../../package/pip/bbcode/" class="md-nav__link">
1063 bbcode
1064 </a>
1065 </li>
1066
1067
1068
1069
1070
1071
1072
1073 <li class="md-nav__item">
1074 <a href="../../package/pip/box/" class="md-nav__link">
1075 box
1076 </a>
1077 </li>
1078
1079
1080
1081
1082
1083
1084
1085 <li class="md-nav__item">
1086 <a href="../../package/pip/clipboard-action/" class="md-nav__link">
1087 clipboardAction
1088 </a>
1089 </li>
1090
1091
1092
1093
1094
1095
1096
1097 <li class="md-nav__item">
1098 <a href="../../package/pip/core-object/" class="md-nav__link">
1099 coreObject
1100 </a>
1101 </li>
1102
1103
1104
1105
1106
1107
1108
1109 <li class="md-nav__item">
1110 <a href="../../package/pip/cronjob/" class="md-nav__link">
1111 cronjob
1112 </a>
1113 </li>
1114
1115
1116
1117
1118
1119
1120
1121 <li class="md-nav__item">
1122 <a href="../../package/pip/event-listener/" class="md-nav__link">
1123 eventListener
1124 </a>
1125 </li>
1126
1127
1128
1129
1130
1131
1132
1133 <li class="md-nav__item">
1134 <a href="../../package/pip/file/" class="md-nav__link">
1135 file
1136 </a>
1137 </li>
1138
1139
1140
1141
1142
1143
1144
1145 <li class="md-nav__item">
1146 <a href="../../package/pip/language/" class="md-nav__link">
1147 language
1148 </a>
1149 </li>
1150
1151
1152
1153
1154
1155
1156
1157 <li class="md-nav__item">
1158 <a href="../../package/pip/media-provider/" class="md-nav__link">
1159 mediaProvider
1160 </a>
1161 </li>
1162
1163
1164
1165
1166
1167
1168
1169 <li class="md-nav__item">
1170 <a href="../../package/pip/menu/" class="md-nav__link">
1171 menu
1172 </a>
1173 </li>
1174
1175
1176
1177
1178
1179
1180
1181 <li class="md-nav__item">
1182 <a href="../../package/pip/menu-item/" class="md-nav__link">
1183 menuItem
1184 </a>
1185 </li>
1186
1187
1188
1189
1190
1191
1192
1193 <li class="md-nav__item">
1194 <a href="../../package/pip/object-type/" class="md-nav__link">
1195 objectType
1196 </a>
1197 </li>
1198
1199
1200
1201
1202
1203
1204
1205 <li class="md-nav__item">
1206 <a href="../../package/pip/object-type-definition/" class="md-nav__link">
1207 objectTypeDefinition
1208 </a>
1209 </li>
1210
1211
1212
1213
1214
1215
1216
1217 <li class="md-nav__item">
1218 <a href="../../package/pip/option/" class="md-nav__link">
1219 option
1220 </a>
1221 </li>
1222
1223
1224
1225
1226
1227
1228
1229 <li class="md-nav__item">
1230 <a href="../../package/pip/page/" class="md-nav__link">
1231 page
1232 </a>
1233 </li>
1234
1235
1236
1237
1238
1239
1240
1241 <li class="md-nav__item">
1242 <a href="../../package/pip/pip/" class="md-nav__link">
1243 pip
1244 </a>
1245 </li>
1246
1247
1248
1249
1250
1251
1252
1253 <li class="md-nav__item">
1254 <a href="../../package/pip/script/" class="md-nav__link">
1255 script
1256 </a>
1257 </li>
1258
1259
1260
1261
1262
1263
1264
1265 <li class="md-nav__item">
1266 <a href="../../package/pip/smiley/" class="md-nav__link">
1267 smiley
1268 </a>
1269 </li>
1270
1271
1272
1273
1274
1275
1276
1277 <li class="md-nav__item">
1278 <a href="../../package/pip/sql/" class="md-nav__link">
1279 sql
1280 </a>
1281 </li>
1282
1283
1284
1285
1286
1287
1288
1289 <li class="md-nav__item">
1290 <a href="../../package/pip/style/" class="md-nav__link">
1291 style
1292 </a>
1293 </li>
1294
1295
1296
1297
1298
1299
1300
1301 <li class="md-nav__item">
1302 <a href="../../package/pip/template/" class="md-nav__link">
1303 template
1304 </a>
1305 </li>
1306
1307
1308
1309
1310
1311
1312
1313 <li class="md-nav__item">
1314 <a href="../../package/pip/template-listener/" class="md-nav__link">
1315 templateListener
1316 </a>
1317 </li>
1318
1319
1320
1321
1322
1323
1324
1325 <li class="md-nav__item">
1326 <a href="../../package/pip/user-group-option/" class="md-nav__link">
1327 userGroupOption
1328 </a>
1329 </li>
1330
1331
1332
1333
1334
1335
1336
1337 <li class="md-nav__item">
1338 <a href="../../package/pip/user-menu/" class="md-nav__link">
1339 userMenu
1340 </a>
1341 </li>
1342
1343
1344
1345
1346
1347
1348
1349 <li class="md-nav__item">
1350 <a href="../../package/pip/user-notification-event/" class="md-nav__link">
1351 userNotificationEvent
1352 </a>
1353 </li>
1354
1355
1356
1357
1358
1359
1360
1361 <li class="md-nav__item">
1362 <a href="../../package/pip/user-option/" class="md-nav__link">
1363 userOption
1364 </a>
1365 </li>
1366
1367
1368
1369
1370
1371
1372
1373 <li class="md-nav__item">
1374 <a href="../../package/pip/user-profile-menu/" class="md-nav__link">
1375 userProfileMenu
1376 </a>
1377 </li>
1378
1379
1380
1381 </ul>
1382 </nav>
1383 </li>
1384
1385
1386
1387
1388
1389
1390
1391 <li class="md-nav__item">
1392 <a href="../../package/database-php-api/" class="md-nav__link">
1393 Database PHP API
1394 </a>
1395 </li>
1396
1397
1398
1399 </ul>
1400 </nav>
1401 </li>
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413 <li class="md-nav__item md-nav__item--nested">
1414
1415
1416 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
1417
1418 <label class="md-nav__link" for="__nav_6">
1419 Migration
1420 <span class="md-nav__icon md-icon"></span>
1421 </label>
1422 <nav class="md-nav" aria-label="Migration" data-md-level="1">
1423 <label class="md-nav__title" for="__nav_6">
1424 <span class="md-nav__icon md-icon"></span>
1425 Migration
1426 </label>
1427 <ul class="md-nav__list" data-md-scrollfix>
1428
1429
1430
1431
1432
1433
1434 <li class="md-nav__item md-nav__item--nested">
1435
1436
1437 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_1" type="checkbox" id="__nav_6_1" >
1438
1439 <label class="md-nav__link" for="__nav_6_1">
1440 Migrating from WSC 5.3
1441 <span class="md-nav__icon md-icon"></span>
1442 </label>
1443 <nav class="md-nav" aria-label="Migrating from WSC 5.3" data-md-level="2">
1444 <label class="md-nav__title" for="__nav_6_1">
1445 <span class="md-nav__icon md-icon"></span>
1446 Migrating from WSC 5.3
1447 </label>
1448 <ul class="md-nav__list" data-md-scrollfix>
1449
1450
1451
1452
1453
1454 <li class="md-nav__item">
1455 <a href="../../migration/wsc53/php/" class="md-nav__link">
1456 PHP API
1457 </a>
1458 </li>
1459
1460
1461
1462
1463
1464
1465
1466 <li class="md-nav__item">
1467 <a href="../../migration/wsc53/session/" class="md-nav__link">
1468 Session Handling and Authentication
1469 </a>
1470 </li>
1471
1472
1473
1474
1475
1476
1477
1478 <li class="md-nav__item">
1479 <a href="../../migration/wsc53/javascript/" class="md-nav__link">
1480 JavaScript
1481 </a>
1482 </li>
1483
1484
1485
1486
1487
1488
1489
1490 <li class="md-nav__item">
1491 <a href="../../migration/wsc53/templates/" class="md-nav__link">
1492 Templates
1493 </a>
1494 </li>
1495
1496
1497
1498
1499
1500
1501
1502 <li class="md-nav__item">
1503 <a href="../../migration/wsc53/libraries/" class="md-nav__link">
1504 Third Party Libraries
1505 </a>
1506 </li>
1507
1508
1509
1510 </ul>
1511 </nav>
1512 </li>
1513
1514
1515
1516
1517
1518
1519
1520
1521 <li class="md-nav__item md-nav__item--nested">
1522
1523
1524 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_2" type="checkbox" id="__nav_6_2" >
1525
1526 <label class="md-nav__link" for="__nav_6_2">
1527 Migrating from WSC 5.2
1528 <span class="md-nav__icon md-icon"></span>
1529 </label>
1530 <nav class="md-nav" aria-label="Migrating from WSC 5.2" data-md-level="2">
1531 <label class="md-nav__title" for="__nav_6_2">
1532 <span class="md-nav__icon md-icon"></span>
1533 Migrating from WSC 5.2
1534 </label>
1535 <ul class="md-nav__list" data-md-scrollfix>
1536
1537
1538
1539
1540
1541 <li class="md-nav__item">
1542 <a href="../../migration/wsc52/php/" class="md-nav__link">
1543 PHP API
1544 </a>
1545 </li>
1546
1547
1548
1549
1550
1551
1552
1553 <li class="md-nav__item">
1554 <a href="../../migration/wsc52/templates/" class="md-nav__link">
1555 Templates and Languages
1556 </a>
1557 </li>
1558
1559
1560
1561
1562
1563
1564
1565 <li class="md-nav__item">
1566 <a href="../../migration/wsc52/libraries/" class="md-nav__link">
1567 Third Party Libraries
1568 </a>
1569 </li>
1570
1571
1572
1573 </ul>
1574 </nav>
1575 </li>
1576
1577
1578
1579
1580
1581
1582
1583
1584 <li class="md-nav__item md-nav__item--nested">
1585
1586
1587 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_3" type="checkbox" id="__nav_6_3" >
1588
1589 <label class="md-nav__link" for="__nav_6_3">
1590 Migrating from WSC 3.1
1591 <span class="md-nav__icon md-icon"></span>
1592 </label>
1593 <nav class="md-nav" aria-label="Migrating from WSC 3.1" data-md-level="2">
1594 <label class="md-nav__title" for="__nav_6_3">
1595 <span class="md-nav__icon md-icon"></span>
1596 Migrating from WSC 3.1
1597 </label>
1598 <ul class="md-nav__list" data-md-scrollfix>
1599
1600
1601
1602
1603
1604 <li class="md-nav__item">
1605 <a href="../../migration/wsc31/php/" class="md-nav__link">
1606 PHP API
1607 </a>
1608 </li>
1609
1610
1611
1612 </ul>
1613 </nav>
1614 </li>
1615
1616
1617
1618
1619
1620
1621
1622
1623 <li class="md-nav__item md-nav__item--nested">
1624
1625
1626 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_4" type="checkbox" id="__nav_6_4" >
1627
1628 <label class="md-nav__link" for="__nav_6_4">
1629 Migrating from WSC 3.0
1630 <span class="md-nav__icon md-icon"></span>
1631 </label>
1632 <nav class="md-nav" aria-label="Migrating from WSC 3.0" data-md-level="2">
1633 <label class="md-nav__title" for="__nav_6_4">
1634 <span class="md-nav__icon md-icon"></span>
1635 Migrating from WSC 3.0
1636 </label>
1637 <ul class="md-nav__list" data-md-scrollfix>
1638
1639
1640
1641
1642
1643 <li class="md-nav__item">
1644 <a href="../../migration/wsc30/php/" class="md-nav__link">
1645 PHP API
1646 </a>
1647 </li>
1648
1649
1650
1651
1652
1653
1654
1655 <li class="md-nav__item">
1656 <a href="../../migration/wsc30/javascript/" class="md-nav__link">
1657 JavaScript API
1658 </a>
1659 </li>
1660
1661
1662
1663
1664
1665
1666
1667 <li class="md-nav__item">
1668 <a href="../../migration/wsc30/templates/" class="md-nav__link">
1669 Templates
1670 </a>
1671 </li>
1672
1673
1674
1675
1676
1677
1678
1679 <li class="md-nav__item">
1680 <a href="../../migration/wsc30/css/" class="md-nav__link">
1681 CSS
1682 </a>
1683 </li>
1684
1685
1686
1687
1688
1689
1690
1691 <li class="md-nav__item">
1692 <a href="../../migration/wsc30/package/" class="md-nav__link">
1693 Package Components
1694 </a>
1695 </li>
1696
1697
1698
1699 </ul>
1700 </nav>
1701 </li>
1702
1703
1704
1705
1706
1707
1708
1709
1710 <li class="md-nav__item md-nav__item--nested">
1711
1712
1713 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6_5" type="checkbox" id="__nav_6_5" >
1714
1715 <label class="md-nav__link" for="__nav_6_5">
1716 Migrating from WCF 2.1
1717 <span class="md-nav__icon md-icon"></span>
1718 </label>
1719 <nav class="md-nav" aria-label="Migrating from WCF 2.1" data-md-level="2">
1720 <label class="md-nav__title" for="__nav_6_5">
1721 <span class="md-nav__icon md-icon"></span>
1722 Migrating from WCF 2.1
1723 </label>
1724 <ul class="md-nav__list" data-md-scrollfix>
1725
1726
1727
1728
1729
1730 <li class="md-nav__item">
1731 <a href="../../migration/wcf21/php/" class="md-nav__link">
1732 PHP API
1733 </a>
1734 </li>
1735
1736
1737
1738
1739
1740
1741
1742 <li class="md-nav__item">
1743 <a href="../../migration/wcf21/templates/" class="md-nav__link">
1744 Templates
1745 </a>
1746 </li>
1747
1748
1749
1750
1751
1752
1753
1754 <li class="md-nav__item">
1755 <a href="../../migration/wcf21/css/" class="md-nav__link">
1756 CSS
1757 </a>
1758 </li>
1759
1760
1761
1762
1763
1764
1765
1766 <li class="md-nav__item">
1767 <a href="../../migration/wcf21/package/" class="md-nav__link">
1768 Package Components
1769 </a>
1770 </li>
1771
1772
1773
1774 </ul>
1775 </nav>
1776 </li>
1777
1778
1779
1780 </ul>
1781 </nav>
1782 </li>
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794 <li class="md-nav__item md-nav__item--nested">
1795
1796
1797 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
1798
1799 <label class="md-nav__link" for="__nav_7">
1800 Tutorials
1801 <span class="md-nav__icon md-icon"></span>
1802 </label>
1803 <nav class="md-nav" aria-label="Tutorials" data-md-level="1">
1804 <label class="md-nav__title" for="__nav_7">
1805 <span class="md-nav__icon md-icon"></span>
1806 Tutorials
1807 </label>
1808 <ul class="md-nav__list" data-md-scrollfix>
1809
1810
1811
1812
1813
1814
1815 <li class="md-nav__item md-nav__item--nested">
1816
1817
1818 <input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
1819
1820 <label class="md-nav__link" for="__nav_7_1">
1821 Tutorial Series
1822 <span class="md-nav__icon md-icon"></span>
1823 </label>
1824 <nav class="md-nav" aria-label="Tutorial Series" data-md-level="2">
1825 <label class="md-nav__title" for="__nav_7_1">
1826 <span class="md-nav__icon md-icon"></span>
1827 Tutorial Series
1828 </label>
1829 <ul class="md-nav__list" data-md-scrollfix>
1830
1831
1832
1833
1834
1835 <li class="md-nav__item">
1836 <a href="../../tutorial/series/overview/" class="md-nav__link">
1837 Overview
1838 </a>
1839 </li>
1840
1841
1842
1843
1844
1845
1846
1847 <li class="md-nav__item">
1848 <a href="../../tutorial/series/part_1/" class="md-nav__link">
1849 Part 1
1850 </a>
1851 </li>
1852
1853
1854
1855
1856
1857
1858
1859 <li class="md-nav__item">
1860 <a href="../../tutorial/series/part_2/" class="md-nav__link">
1861 Part 2
1862 </a>
1863 </li>
1864
1865
1866
1867
1868
1869
1870
1871 <li class="md-nav__item">
1872 <a href="../../tutorial/series/part_3/" class="md-nav__link">
1873 Part 3
1874 </a>
1875 </li>
1876
1877
1878
1879 </ul>
1880 </nav>
1881 </li>
1882
1883
1884
1885 </ul>
1886 </nav>
1887 </li>
1888
1889
1890
1891 </ul>
1892 </nav>
1893 </div>
1894 </div>
1895 </div>
1896
1897
1898
1899 <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1900 <div class="md-sidebar__scrollwrap">
1901 <div class="md-sidebar__inner">
1902
1903 <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1904
1905
1906
1907
1908
1909 <label class="md-nav__title" for="__toc">
1910 <span class="md-nav__icon md-icon"></span>
1911 Table of contents
1912 </label>
1913 <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1914
1915 <li class="md-nav__item">
1916 <a href="#introduction" class="md-nav__link">
1917 Introduction
1918 </a>
1919
1920 </li>
1921
1922 <li class="md-nav__item">
1923 <a href="#differences-to-plugins" class="md-nav__link">
1924 Differences to Plugins
1925 </a>
1926
1927 <nav class="md-nav" aria-label="Differences to Plugins">
1928 <ul class="md-nav__list">
1929
1930 <li class="md-nav__item">
1931 <a href="#unique-namespace" class="md-nav__link">
1932 Unique Namespace
1933 </a>
1934
1935 </li>
1936
1937 <li class="md-nav__item">
1938 <a href="#unique-database-table-prefix" class="md-nav__link">
1939 Unique Database Table Prefix
1940 </a>
1941
1942 </li>
1943
1944 <li class="md-nav__item">
1945 <a href="#separate-domain-and-path-configuration" class="md-nav__link">
1946 Separate Domain and Path Configuration
1947 </a>
1948
1949 </li>
1950
1951 </ul>
1952 </nav>
1953
1954 </li>
1955
1956 <li class="md-nav__item">
1957 <a href="#creating-an-app" class="md-nav__link">
1958 Creating an App
1959 </a>
1960
1961 <nav class="md-nav" aria-label="Creating an App">
1962 <ul class="md-nav__list">
1963
1964 <li class="md-nav__item">
1965 <a href="#packagexml" class="md-nav__link">
1966 package.xml
1967 </a>
1968
1969 <nav class="md-nav" aria-label="package.xml">
1970 <ul class="md-nav__list">
1971
1972 <li class="md-nav__item">
1973 <a href="#isapplication1isapplication" class="md-nav__link">
1974 &lt;isapplication&gt;1&lt;/isapplication&gt;
1975 </a>
1976
1977 </li>
1978
1979 <li class="md-nav__item">
1980 <a href="#applicationdirectoryexampleapplicationdirectory" class="md-nav__link">
1981 &lt;applicationdirectory&gt;example&lt;/applicationdirectory&gt;
1982 </a>
1983
1984 </li>
1985
1986 </ul>
1987 </nav>
1988
1989 </li>
1990
1991 <li class="md-nav__item">
1992 <a href="#minimum-required-files" class="md-nav__link">
1993 Minimum Required Files
1994 </a>
1995
1996 </li>
1997
1998 </ul>
1999 </nav>
2000
2001 </li>
2002
2003 </ul>
2004
2005 </nav>
2006 </div>
2007 </div>
2008 </div>
2009
2010
2011 <div class="md-content" data-md-component="content">
2012 <article class="md-content__inner md-typeset">
2013
2014
2015 <a href="https://github.com/WoltLab/docs.woltlab.com/edit/5.4/docs/php/apps.md" title="Edit this page" class="md-content__button md-icon">
2016 <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>
2017 </a>
2018
2019
2020 <h1 id="apps-for-woltlab-suite">Apps for WoltLab Suite<a class="headerlink" href="#apps-for-woltlab-suite" title="Permanent link">#</a></h1>
2021 <h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">#</a></h2>
2022 <p>Apps are among the most powerful components in WoltLab Suite. Unlike plugins
2023 that extend an existing functionality and pages, apps have their own frontend
2024 with a dedicated namespace, database table prefixes and template locations.</p>
2025 <p>However, apps are meant to be a logical (and to some extent physical) separation
2026 from other parts of the framework, including other installed apps. They offer
2027 an additional layer of isolation and enable you to re-use class and template
2028 names that are already in use by the Core itself.</p>
2029 <p>If you've come here, thinking about the question if your next package should be
2030 an app instead of a regular plugin, the result is almost always: <em>No.</em></p>
2031 <h2 id="differences-to-plugins">Differences to Plugins<a class="headerlink" href="#differences-to-plugins" title="Permanent link">#</a></h2>
2032 <p>Apps do offer a couple of unique features that are not available to plugins and
2033 there are valid reasons to use one instead of a plugin, but they also increase
2034 both the code and system complexity. There is a performance penalty for each
2035 installed app, regardless if it is actively used in a request or not, simplying
2036 being there forces the Core to include it in many places, for example, class
2037 resolution or even simple tasks such as constructing a link.</p>
2038 <h3 id="unique-namespace">Unique Namespace<a class="headerlink" href="#unique-namespace" title="Permanent link">#</a></h3>
2039 <p>Each app has its own unique namespace that is entirely separated from the Core
2040 and any other installed apps. The namespace is derived from the last part of the
2041 package identifier, for example, <code>com.example.foo</code> will yield the namespace <code>foo</code>.</p>
2042 <p>The namespace is always relative to the installation directory of the app, it
2043 doesn't matter if the app is installed on <code>example.com/foo/</code> or in <code>example.com/bar/</code>,
2044 the namespace will always resolve to the right directory.</p>
2045 <p>This app namespace is also used for ACP templates, frontend templates and files:</p>
2046 <div class="highlight"><pre><span></span><code><span class="c">&lt;!-- somewhere in the package.xml --&gt;</span>
2047 <span class="nt">&lt;instructions</span> <span class="na">type=</span><span class="s">&quot;file&quot;</span> <span class="na">application=</span><span class="s">&quot;foo&quot;</span> <span class="nt">/&gt;</span>
2048 </code></pre></div>
2049 <h3 id="unique-database-table-prefix">Unique Database Table Prefix<a class="headerlink" href="#unique-database-table-prefix" title="Permanent link">#</a></h3>
2050 <p>All database tables make use of a generic prefix that is derived from one of the
2051 installed apps, including <code>wcf</code> which resolves to the Core itself. Following the
2052 aforementioned example, the new prefix <code>fooN_</code> will be automatically registered
2053 and recognized in any generated statement.</p>
2054 <p>Any <code>DatabaseObject</code> that uses the app's namespace is automatically assumed to
2055 use the app's database prefix. For instance, <code>foo\data\bar\Bar</code> is implicitly
2056 mapped to the database table <code>fooN_bar</code>.</p>
2057 <p>The app prefix is recognized in SQL-PIPs and statements that reference one of
2058 its database tables are automatically rewritten to use the Core's instance number.</p>
2059 <h3 id="separate-domain-and-path-configuration">Separate Domain and Path Configuration<a class="headerlink" href="#separate-domain-and-path-configuration" title="Permanent link">#</a></h3>
2060 <p>Any controller that is provided by a plugin is served from the configured domain
2061 and path of the corresponding app, such as plugins for the Core are always
2062 served from the Core's directory. Apps are different and use their own domain
2063 and/or path to present their content, additionally, this allows the app to re-use
2064 a controller name that is already provided by the Core or any other app itself.</p>
2065 <h2 id="creating-an-app">Creating an App<a class="headerlink" href="#creating-an-app" title="Permanent link">#</a></h2>
2066 <div class="admonition danger">
2067 <p class="admonition-title">This is a non-reversible operation! Once a package has been installed, its type cannot be changed without uninstalling and reinstalling the entire package, an app will always be an app and vice versa.</p>
2068 </div>
2069 <h3 id="packagexml"><code>package.xml</code><a class="headerlink" href="#packagexml" title="Permanent link">#</a></h3>
2070 <p>The <code>package.xml</code> supports two additional elements in the <code>&lt;packageinformation&gt;</code>
2071 block that are unique to applications.</p>
2072 <h4 id="isapplication1isapplication"><code>&lt;isapplication&gt;1&lt;/isapplication&gt;</code><a class="headerlink" href="#isapplication1isapplication" title="Permanent link">#</a></h4>
2073 <p>This element is responsible to flag a package as an app.</p>
2074 <h4 id="applicationdirectoryexampleapplicationdirectory"><code>&lt;applicationdirectory&gt;example&lt;/applicationdirectory&gt;</code><a class="headerlink" href="#applicationdirectoryexampleapplicationdirectory" title="Permanent link">#</a></h4>
2075 <p>Sets the suggested name of the application directory when installing it, the
2076 path result in <code>&lt;path-to-the-core&gt;/example/</code>. If you leave this element out,
2077 the app identifier (<code>com.example.foo -&gt; foo</code>) will be used instead.</p>
2078 <h3 id="minimum-required-files">Minimum Required Files<a class="headerlink" href="#minimum-required-files" title="Permanent link">#</a></h3>
2079 <p>An example project with the <a href="https://github.com/WoltLab/woltlab.github.io/tree/master/_includes/tutorial/basic-app/">source code can be found on GitHub</a>,
2080 it includes everything that is required for a basic app.</p>
2081
2082
2083
2084
2085
2086
2087
2088 </article>
2089 </div>
2090 </div>
2091 </main>
2092
2093
2094 <footer class="md-footer">
2095
2096 <nav class="md-footer__inner md-grid" aria-label="Footer">
2097
2098 <a href="../code-style/" class="md-footer__link md-footer__link--prev" rel="prev">
2099 <div class="md-footer__button md-icon">
2100 <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>
2101 </div>
2102 <div class="md-footer__title">
2103 <div class="md-ellipsis">
2104 <span class="md-footer__direction">
2105 Previous
2106 </span>
2107 Code Style
2108 </div>
2109 </div>
2110 </a>
2111
2112
2113 <a href="../gdpr/" class="md-footer__link md-footer__link--next" rel="next">
2114 <div class="md-footer__title">
2115 <div class="md-ellipsis">
2116 <span class="md-footer__direction">
2117 Next
2118 </span>
2119 GDPR
2120 </div>
2121 </div>
2122 <div class="md-footer__button md-icon">
2123 <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>
2124 </div>
2125 </a>
2126
2127 </nav>
2128
2129 <div class="md-footer-meta md-typeset">
2130 <div class="md-footer-meta__inner md-grid">
2131 <div class="md-footer-copyright">
2132
2133 <div class="md-footer-copyright__highlight">
2134 Copyright © 2020 WoltLab GmbH
2135 </div>
2136
2137 Made with
2138 <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2139 Material for MkDocs
2140 </a>
2141
2142 </div>
2143 <div class="md-footer-copyright">
2144 <a href="https://www.woltlab.com/legal-notice/">Legal Notice</a>
2145 <a href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
2146 </div>
2147 </div>
2148 </div>
2149 </footer>
2150
2151 </div>
2152 <div class="md-dialog" data-md-component="dialog">
2153 <div class="md-dialog__inner md-typeset"></div>
2154 </div>
2155 <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>
2156
2157
2158 <script src="../../assets/javascripts/bundle.5cf3e710.min.js"></script>
2159
2160
2161 </body>
2162 </html>