3 <html lang=
"en" class=
"no-js">
7 <meta name=
"viewport" content=
"width=device-width,initial-scale=1">
12 <link rel=
"canonical" href=
"https://docs.woltlab.com/5.4/view/template-plugins/">
14 <link rel=
"icon" href=
"../../assets/default.favicon.ico">
15 <meta name=
"generator" content=
"mkdocs-1.1.2, mkdocs-material-7.1.3">
19 <title>Template Plugins - WoltLab Suite Documentation
</title>
23 <link rel=
"stylesheet" href=
"../../assets/stylesheets/main.e35208c4.min.css">
26 <link rel=
"stylesheet" href=
"../../assets/stylesheets/palette.ef6f36e2.min.css">
30 <meta name=
"theme-color" content=
"#009485">
40 <link rel=
"stylesheet" href=
"../../stylesheets/extra.css">
54 <body dir=
"ltr" data-md-color-scheme=
"" data-md-color-primary=
"teal" data-md-color-accent=
"">
57 <script>function __prefix(e){return new URL(
"../..",location).pathname+
"."+e}function __get(e,t=localStorage){return JSON.parse(t.getItem(__prefix(e)))}
</script>
59 <input class=
"md-toggle" data-md-toggle=
"drawer" type=
"checkbox" id=
"__drawer" autocomplete=
"off">
60 <input class=
"md-toggle" data-md-toggle=
"search" type=
"checkbox" id=
"__search" autocomplete=
"off">
61 <label class=
"md-overlay" for=
"__drawer"></label>
62 <div data-md-component=
"skip">
65 <a href=
"#template-plugins" class=
"md-skip">
70 <div data-md-component=
"announce">
72 <aside class=
"md-announce">
73 <div class=
"md-announce__inner md-grid md-typeset">
75 <a href=
"https://www.woltlab.com">Back to
<strong>woltlab.com
</strong></a>
82 <header class=
"md-header" data-md-component=
"header">
83 <nav class=
"md-header__inner md-grid" aria-label=
"Header">
84 <a href=
"../.." title=
"WoltLab Suite Documentation" class=
"md-header__button md-logo" aria-label=
"WoltLab Suite Documentation" data-md-component=
"logo">
86 <img src=
"../../assets/logo.png" alt=
"logo">
89 <label class=
"md-header__button md-icon" for=
"__drawer">
90 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 24 24"><path d=
"M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
92 <div class=
"md-header__title" data-md-component=
"header-title">
93 <div class=
"md-header__ellipsis">
94 <div class=
"md-header__topic">
95 <span class=
"md-ellipsis">
96 WoltLab Suite Documentation
99 <div class=
"md-header__topic" data-md-component=
"header-topic">
100 <span class=
"md-ellipsis">
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>
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>
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.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
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">
134 <ol class=
"md-search-result__list"></ol>
142 <div class=
"md-header__source">
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">
147 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><path d=
"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
149 <div class=
"md-source__repository">
158 <div class=
"md-container" data-md-component=
"container">
163 <main class=
"md-main" data-md-component=
"main">
164 <div class=
"md-main__inner md-grid">
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">
174 <nav class=
"md-nav md-nav--primary" aria-label=
"Navigation" data-md-level=
"0">
175 <label class=
"md-nav__title" for=
"__drawer">
176 <a href=
"../.." title=
"WoltLab Suite Documentation" class=
"md-nav__button md-logo" aria-label=
"WoltLab Suite Documentation" data-md-component=
"logo">
178 <img src=
"../../assets/logo.png" alt=
"logo">
181 WoltLab Suite Documentation
184 <div class=
"md-nav__source">
186 <a href=
"https://github.com/WoltLab/docs.woltlab.com/" title=
"Go to repository" class=
"md-source" data-md-component=
"source">
187 <div class=
"md-source__icon md-icon">
189 <svg xmlns=
"http://www.w3.org/2000/svg" viewBox=
"0 0 448 512"><path d=
"M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
191 <div class=
"md-source__repository">
197 <ul class=
"md-nav__list" data-md-scrollfix
>
206 <li class=
"md-nav__item">
207 <a href=
"../../getting-started/" class=
"md-nav__link">
222 <li class=
"md-nav__item md-nav__item--nested">
225 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2" type=
"checkbox" id=
"__nav_2" >
227 <label class=
"md-nav__link" for=
"__nav_2">
229 <span class=
"md-nav__icon md-icon"></span>
231 <nav class=
"md-nav" aria-label=
"PHP API" data-md-level=
"1">
232 <label class=
"md-nav__title" for=
"__nav_2">
233 <span class=
"md-nav__icon md-icon"></span>
236 <ul class=
"md-nav__list" data-md-scrollfix
>
242 <li class=
"md-nav__item">
243 <a href=
"../../php/pages/" class=
"md-nav__link">
254 <li class=
"md-nav__item">
255 <a href=
"../../php/database-objects/" class=
"md-nav__link">
266 <li class=
"md-nav__item">
267 <a href=
"../../php/database-access/" class=
"md-nav__link">
278 <li class=
"md-nav__item">
279 <a href=
"../../php/exceptions/" class=
"md-nav__link">
291 <li class=
"md-nav__item md-nav__item--nested">
294 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5" type=
"checkbox" id=
"__nav_2_5" >
296 <label class=
"md-nav__link" for=
"__nav_2_5">
298 <span class=
"md-nav__icon md-icon"></span>
300 <nav class=
"md-nav" aria-label=
"API" data-md-level=
"2">
301 <label class=
"md-nav__title" for=
"__nav_2_5">
302 <span class=
"md-nav__icon md-icon"></span>
305 <ul class=
"md-nav__list" data-md-scrollfix
>
312 <li class=
"md-nav__item md-nav__item--nested">
315 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5_1" type=
"checkbox" id=
"__nav_2_5_1" >
317 <label class=
"md-nav__link" for=
"__nav_2_5_1">
319 <span class=
"md-nav__icon md-icon"></span>
321 <nav class=
"md-nav" aria-label=
"Caches" data-md-level=
"3">
322 <label class=
"md-nav__title" for=
"__nav_2_5_1">
323 <span class=
"md-nav__icon md-icon"></span>
326 <ul class=
"md-nav__list" data-md-scrollfix
>
332 <li class=
"md-nav__item">
333 <a href=
"../../php/api/caches/" class=
"md-nav__link">
344 <li class=
"md-nav__item">
345 <a href=
"../../php/api/caches_persistent-caches/" class=
"md-nav__link">
356 <li class=
"md-nav__item">
357 <a href=
"../../php/api/caches_runtime-caches/" class=
"md-nav__link">
374 <li class=
"md-nav__item">
375 <a href=
"../../php/api/comments/" class=
"md-nav__link">
386 <li class=
"md-nav__item">
387 <a href=
"../../php/api/cronjobs/" class=
"md-nav__link">
398 <li class=
"md-nav__item">
399 <a href=
"../../php/api/events/" class=
"md-nav__link">
411 <li class=
"md-nav__item md-nav__item--nested">
414 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_2_5_5" type=
"checkbox" id=
"__nav_2_5_5" >
416 <label class=
"md-nav__link" for=
"__nav_2_5_5">
418 <span class=
"md-nav__icon md-icon"></span>
420 <nav class=
"md-nav" aria-label=
"Form Builder" data-md-level=
"3">
421 <label class=
"md-nav__title" for=
"__nav_2_5_5">
422 <span class=
"md-nav__icon md-icon"></span>
425 <ul class=
"md-nav__list" data-md-scrollfix
>
431 <li class=
"md-nav__item">
432 <a href=
"../../php/api/form_builder/overview/" class=
"md-nav__link">
443 <li class=
"md-nav__item">
444 <a href=
"../../php/api/form_builder/structure/" class=
"md-nav__link">
455 <li class=
"md-nav__item">
456 <a href=
"../../php/api/form_builder/form_fields/" class=
"md-nav__link">
467 <li class=
"md-nav__item">
468 <a href=
"../../php/api/form_builder/validation_data/" class=
"md-nav__link">
479 <li class=
"md-nav__item">
480 <a href=
"../../php/api/form_builder/dependencies/" class=
"md-nav__link">
497 <li class=
"md-nav__item">
498 <a href=
"../../php/api/package_installation_plugins/" class=
"md-nav__link">
499 Package Installation Plugins
509 <li class=
"md-nav__item">
510 <a href=
"../../php/api/user_activity_points/" class=
"md-nav__link">
521 <li class=
"md-nav__item">
522 <a href=
"../../php/api/user_notifications/" class=
"md-nav__link">
533 <li class=
"md-nav__item">
534 <a href=
"../../php/api/sitemaps/" class=
"md-nav__link">
551 <li class=
"md-nav__item">
552 <a href=
"../../php/code-style/" class=
"md-nav__link">
563 <li class=
"md-nav__item">
564 <a href=
"../../php/apps/" class=
"md-nav__link">
575 <li class=
"md-nav__item">
576 <a href=
"../../php/gdpr/" class=
"md-nav__link">
599 <li class=
"md-nav__item md-nav__item--active md-nav__item--nested">
602 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_3" type=
"checkbox" id=
"__nav_3" checked
>
604 <label class=
"md-nav__link" for=
"__nav_3">
605 Languages, Templates & CSS
606 <span class=
"md-nav__icon md-icon"></span>
608 <nav class=
"md-nav" aria-label=
"Languages, Templates & CSS" data-md-level=
"1">
609 <label class=
"md-nav__title" for=
"__nav_3">
610 <span class=
"md-nav__icon md-icon"></span>
611 Languages, Templates & CSS
613 <ul class=
"md-nav__list" data-md-scrollfix
>
619 <li class=
"md-nav__item">
620 <a href=
"../languages/" class=
"md-nav__link">
631 <li class=
"md-nav__item">
632 <a href=
"../templates/" class=
"md-nav__link">
645 <li class=
"md-nav__item md-nav__item--active">
647 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"toc" type=
"checkbox" id=
"__toc">
653 <label class=
"md-nav__link md-nav__link--active" for=
"__toc">
655 <span class=
"md-nav__icon md-icon"></span>
658 <a href=
"./" class=
"md-nav__link md-nav__link--active">
663 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
670 <label class=
"md-nav__title" for=
"__toc">
671 <span class=
"md-nav__icon md-icon"></span>
674 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
676 <li class=
"md-nav__item">
677 <a href=
"#53-anchor" class=
"md-nav__link">
683 <li class=
"md-nav__item">
684 <a href=
"#53-anchorattributes" class=
"md-nav__link">
685 5.3+ anchorAttributes
690 <li class=
"md-nav__item">
691 <a href=
"#append" class=
"md-nav__link">
697 <li class=
"md-nav__item">
698 <a href=
"#assign" class=
"md-nav__link">
704 <li class=
"md-nav__item">
705 <a href=
"#capture" class=
"md-nav__link">
711 <li class=
"md-nav__item">
712 <a href=
"#concat" class=
"md-nav__link">
718 <li class=
"md-nav__item">
719 <a href=
"#counter" class=
"md-nav__link">
725 <li class=
"md-nav__item">
726 <a href=
"#54-csrftoken" class=
"md-nav__link">
732 <li class=
"md-nav__item">
733 <a href=
"#currency" class=
"md-nav__link">
739 <li class=
"md-nav__item">
740 <a href=
"#cycle" class=
"md-nav__link">
746 <li class=
"md-nav__item">
747 <a href=
"#date" class=
"md-nav__link">
753 <li class=
"md-nav__item">
754 <a href=
"#31-dateinterval" class=
"md-nav__link">
760 <li class=
"md-nav__item">
761 <a href=
"#encodejs" class=
"md-nav__link">
767 <li class=
"md-nav__item">
768 <a href=
"#encodejson" class=
"md-nav__link">
774 <li class=
"md-nav__item">
775 <a href=
"#escapecdata" class=
"md-nav__link">
781 <li class=
"md-nav__item">
782 <a href=
"#event" class=
"md-nav__link">
788 <li class=
"md-nav__item">
789 <a href=
"#fetch" class=
"md-nav__link">
795 <li class=
"md-nav__item">
796 <a href=
"#filesizebinary" class=
"md-nav__link">
802 <li class=
"md-nav__item">
803 <a href=
"#filesize" class=
"md-nav__link">
809 <li class=
"md-nav__item">
810 <a href=
"#hascontent" class=
"md-nav__link">
816 <li class=
"md-nav__item">
817 <a href=
"#htmlcheckboxes" class=
"md-nav__link">
823 <li class=
"md-nav__item">
824 <a href=
"#htmloptions" class=
"md-nav__link">
830 <li class=
"md-nav__item">
831 <a href=
"#implode" class=
"md-nav__link">
837 <li class=
"md-nav__item">
838 <a href=
"#52-ipsearch" class=
"md-nav__link">
844 <li class=
"md-nav__item">
845 <a href=
"#30-js" class=
"md-nav__link">
851 <li class=
"md-nav__item">
852 <a href=
"#53-jslang" class=
"md-nav__link">
858 <li class=
"md-nav__item">
859 <a href=
"#lang" class=
"md-nav__link">
865 <li class=
"md-nav__item">
866 <a href=
"#language" class=
"md-nav__link">
872 <li class=
"md-nav__item">
873 <a href=
"#link" class=
"md-nav__link">
879 <li class=
"md-nav__item">
880 <a href=
"#newlinetobreak" class=
"md-nav__link">
886 <li class=
"md-nav__item">
887 <a href=
"#54-objectaction" class=
"md-nav__link">
893 <li class=
"md-nav__item">
894 <a href=
"#30-page" class=
"md-nav__link">
900 <li class=
"md-nav__item">
901 <a href=
"#pages" class=
"md-nav__link">
907 <li class=
"md-nav__item">
908 <a href=
"#plaintime" class=
"md-nav__link">
914 <li class=
"md-nav__item">
915 <a href=
"#53-plural" class=
"md-nav__link">
921 <li class=
"md-nav__item">
922 <a href=
"#prepend" class=
"md-nav__link">
928 <li class=
"md-nav__item">
929 <a href=
"#shortunit" class=
"md-nav__link">
935 <li class=
"md-nav__item">
936 <a href=
"#smallpages" class=
"md-nav__link">
942 <li class=
"md-nav__item">
943 <a href=
"#tablewordwrap" class=
"md-nav__link">
949 <li class=
"md-nav__item">
950 <a href=
"#time" class=
"md-nav__link">
956 <li class=
"md-nav__item">
957 <a href=
"#truncate" class=
"md-nav__link">
963 <li class=
"md-nav__item">
964 <a href=
"#53-user" class=
"md-nav__link">
982 <li class=
"md-nav__item">
983 <a href=
"../css/" class=
"md-nav__link">
1004 <li class=
"md-nav__item md-nav__item--nested">
1007 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_4" type=
"checkbox" id=
"__nav_4" >
1009 <label class=
"md-nav__link" for=
"__nav_4">
1010 TypeScript and JavaScript API
1011 <span class=
"md-nav__icon md-icon"></span>
1013 <nav class=
"md-nav" aria-label=
"TypeScript and JavaScript API" data-md-level=
"1">
1014 <label class=
"md-nav__title" for=
"__nav_4">
1015 <span class=
"md-nav__icon md-icon"></span>
1016 TypeScript and JavaScript API
1018 <ul class=
"md-nav__list" data-md-scrollfix
>
1024 <li class=
"md-nav__item">
1025 <a href=
"../../javascript/general-usage/" class=
"md-nav__link">
1036 <li class=
"md-nav__item">
1037 <a href=
"../../javascript/typescript/" class=
"md-nav__link">
1049 <li class=
"md-nav__item md-nav__item--nested">
1052 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_4_3" type=
"checkbox" id=
"__nav_4_3" >
1054 <label class=
"md-nav__link" for=
"__nav_4_3">
1056 <span class=
"md-nav__icon md-icon"></span>
1058 <nav class=
"md-nav" aria-label=
"New API" data-md-level=
"2">
1059 <label class=
"md-nav__title" for=
"__nav_4_3">
1060 <span class=
"md-nav__icon md-icon"></span>
1063 <ul class=
"md-nav__list" data-md-scrollfix
>
1069 <li class=
"md-nav__item">
1070 <a href=
"../../javascript/new-api_writing-a-module/" class=
"md-nav__link">
1081 <li class=
"md-nav__item">
1082 <a href=
"../../javascript/new-api_data-structures/" class=
"md-nav__link">
1093 <li class=
"md-nav__item">
1094 <a href=
"../../javascript/new-api_core/" class=
"md-nav__link">
1105 <li class=
"md-nav__item">
1106 <a href=
"../../javascript/new-api_dom/" class=
"md-nav__link">
1117 <li class=
"md-nav__item">
1118 <a href=
"../../javascript/new-api_events/" class=
"md-nav__link">
1129 <li class=
"md-nav__item">
1130 <a href=
"../../javascript/new-api_ajax/" class=
"md-nav__link">
1141 <li class=
"md-nav__item">
1142 <a href=
"../../javascript/new-api_dialogs/" class=
"md-nav__link">
1153 <li class=
"md-nav__item">
1154 <a href=
"../../javascript/new-api_browser/" class=
"md-nav__link">
1155 Browser and Screen Sizes
1165 <li class=
"md-nav__item">
1166 <a href=
"../../javascript/new-api_ui/" class=
"md-nav__link">
1183 <li class=
"md-nav__item">
1184 <a href=
"../../javascript/legacy-api/" class=
"md-nav__link">
1195 <li class=
"md-nav__item">
1196 <a href=
"../../javascript/helper-functions/" class=
"md-nav__link">
1207 <li class=
"md-nav__item">
1208 <a href=
"../../javascript/code-snippets/" class=
"md-nav__link">
1229 <li class=
"md-nav__item md-nav__item--nested">
1232 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_5" type=
"checkbox" id=
"__nav_5" >
1234 <label class=
"md-nav__link" for=
"__nav_5">
1236 <span class=
"md-nav__icon md-icon"></span>
1238 <nav class=
"md-nav" aria-label=
"Package Components" data-md-level=
"1">
1239 <label class=
"md-nav__title" for=
"__nav_5">
1240 <span class=
"md-nav__icon md-icon"></span>
1243 <ul class=
"md-nav__list" data-md-scrollfix
>
1249 <li class=
"md-nav__item">
1250 <a href=
"../../package/package-xml/" class=
"md-nav__link">
1262 <li class=
"md-nav__item md-nav__item--nested">
1265 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_5_2" type=
"checkbox" id=
"__nav_5_2" >
1267 <label class=
"md-nav__link" for=
"__nav_5_2">
1269 <span class=
"md-nav__icon md-icon"></span>
1271 <nav class=
"md-nav" aria-label=
"PIPs" data-md-level=
"2">
1272 <label class=
"md-nav__title" for=
"__nav_5_2">
1273 <span class=
"md-nav__icon md-icon"></span>
1276 <ul class=
"md-nav__list" data-md-scrollfix
>
1282 <li class=
"md-nav__item">
1283 <a href=
"../../package/pip/" class=
"md-nav__link">
1294 <li class=
"md-nav__item">
1295 <a href=
"../../package/pip/acl-option/" class=
"md-nav__link">
1306 <li class=
"md-nav__item">
1307 <a href=
"../../package/pip/acp-menu/" class=
"md-nav__link">
1318 <li class=
"md-nav__item">
1319 <a href=
"../../package/pip/acp-search-provider/" class=
"md-nav__link">
1330 <li class=
"md-nav__item">
1331 <a href=
"../../package/pip/acp-template/" class=
"md-nav__link">
1342 <li class=
"md-nav__item">
1343 <a href=
"../../package/pip/bbcode/" class=
"md-nav__link">
1354 <li class=
"md-nav__item">
1355 <a href=
"../../package/pip/box/" class=
"md-nav__link">
1366 <li class=
"md-nav__item">
1367 <a href=
"../../package/pip/clipboard-action/" class=
"md-nav__link">
1378 <li class=
"md-nav__item">
1379 <a href=
"../../package/pip/core-object/" class=
"md-nav__link">
1390 <li class=
"md-nav__item">
1391 <a href=
"../../package/pip/cronjob/" class=
"md-nav__link">
1402 <li class=
"md-nav__item">
1403 <a href=
"../../package/pip/database/" class=
"md-nav__link">
1414 <li class=
"md-nav__item">
1415 <a href=
"../../package/pip/event-listener/" class=
"md-nav__link">
1426 <li class=
"md-nav__item">
1427 <a href=
"../../package/pip/file/" class=
"md-nav__link">
1438 <li class=
"md-nav__item">
1439 <a href=
"../../package/pip/language/" class=
"md-nav__link">
1450 <li class=
"md-nav__item">
1451 <a href=
"../../package/pip/media-provider/" class=
"md-nav__link">
1462 <li class=
"md-nav__item">
1463 <a href=
"../../package/pip/menu/" class=
"md-nav__link">
1474 <li class=
"md-nav__item">
1475 <a href=
"../../package/pip/menu-item/" class=
"md-nav__link">
1486 <li class=
"md-nav__item">
1487 <a href=
"../../package/pip/object-type/" class=
"md-nav__link">
1498 <li class=
"md-nav__item">
1499 <a href=
"../../package/pip/object-type-definition/" class=
"md-nav__link">
1500 objectTypeDefinition
1510 <li class=
"md-nav__item">
1511 <a href=
"../../package/pip/option/" class=
"md-nav__link">
1522 <li class=
"md-nav__item">
1523 <a href=
"../../package/pip/page/" class=
"md-nav__link">
1534 <li class=
"md-nav__item">
1535 <a href=
"../../package/pip/pip/" class=
"md-nav__link">
1546 <li class=
"md-nav__item">
1547 <a href=
"../../package/pip/script/" class=
"md-nav__link">
1558 <li class=
"md-nav__item">
1559 <a href=
"../../package/pip/smiley/" class=
"md-nav__link">
1570 <li class=
"md-nav__item">
1571 <a href=
"../../package/pip/sql/" class=
"md-nav__link">
1582 <li class=
"md-nav__item">
1583 <a href=
"../../package/pip/style/" class=
"md-nav__link">
1594 <li class=
"md-nav__item">
1595 <a href=
"../../package/pip/template/" class=
"md-nav__link">
1606 <li class=
"md-nav__item">
1607 <a href=
"../../package/pip/template-listener/" class=
"md-nav__link">
1618 <li class=
"md-nav__item">
1619 <a href=
"../../package/pip/user-group-option/" class=
"md-nav__link">
1630 <li class=
"md-nav__item">
1631 <a href=
"../../package/pip/user-menu/" class=
"md-nav__link">
1642 <li class=
"md-nav__item">
1643 <a href=
"../../package/pip/user-notification-event/" class=
"md-nav__link">
1644 userNotificationEvent
1654 <li class=
"md-nav__item">
1655 <a href=
"../../package/pip/user-option/" class=
"md-nav__link">
1666 <li class=
"md-nav__item">
1667 <a href=
"../../package/pip/user-profile-menu/" class=
"md-nav__link">
1684 <li class=
"md-nav__item">
1685 <a href=
"../../package/database-php-api/" class=
"md-nav__link">
1706 <li class=
"md-nav__item md-nav__item--nested">
1709 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6" type=
"checkbox" id=
"__nav_6" >
1711 <label class=
"md-nav__link" for=
"__nav_6">
1713 <span class=
"md-nav__icon md-icon"></span>
1715 <nav class=
"md-nav" aria-label=
"Migration" data-md-level=
"1">
1716 <label class=
"md-nav__title" for=
"__nav_6">
1717 <span class=
"md-nav__icon md-icon"></span>
1720 <ul class=
"md-nav__list" data-md-scrollfix
>
1727 <li class=
"md-nav__item md-nav__item--nested">
1730 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_1" type=
"checkbox" id=
"__nav_6_1" >
1732 <label class=
"md-nav__link" for=
"__nav_6_1">
1733 Migrating from WSC
5.3
1734 <span class=
"md-nav__icon md-icon"></span>
1736 <nav class=
"md-nav" aria-label=
"Migrating from WSC 5.3" data-md-level=
"2">
1737 <label class=
"md-nav__title" for=
"__nav_6_1">
1738 <span class=
"md-nav__icon md-icon"></span>
1739 Migrating from WSC
5.3
1741 <ul class=
"md-nav__list" data-md-scrollfix
>
1747 <li class=
"md-nav__item">
1748 <a href=
"../../migration/wsc53/php/" class=
"md-nav__link">
1759 <li class=
"md-nav__item">
1760 <a href=
"../../migration/wsc53/session/" class=
"md-nav__link">
1761 Session Handling and Authentication
1771 <li class=
"md-nav__item">
1772 <a href=
"../../migration/wsc53/javascript/" class=
"md-nav__link">
1773 TypeScript and JavaScript
1783 <li class=
"md-nav__item">
1784 <a href=
"../../migration/wsc53/templates/" class=
"md-nav__link">
1795 <li class=
"md-nav__item">
1796 <a href=
"../../migration/wsc53/libraries/" class=
"md-nav__link">
1797 Third Party Libraries
1814 <li class=
"md-nav__item md-nav__item--nested">
1817 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_2" type=
"checkbox" id=
"__nav_6_2" >
1819 <label class=
"md-nav__link" for=
"__nav_6_2">
1820 Migrating from WSC
5.2
1821 <span class=
"md-nav__icon md-icon"></span>
1823 <nav class=
"md-nav" aria-label=
"Migrating from WSC 5.2" data-md-level=
"2">
1824 <label class=
"md-nav__title" for=
"__nav_6_2">
1825 <span class=
"md-nav__icon md-icon"></span>
1826 Migrating from WSC
5.2
1828 <ul class=
"md-nav__list" data-md-scrollfix
>
1834 <li class=
"md-nav__item">
1835 <a href=
"../../migration/wsc52/php/" class=
"md-nav__link">
1846 <li class=
"md-nav__item">
1847 <a href=
"../../migration/wsc52/templates/" class=
"md-nav__link">
1848 Templates and Languages
1858 <li class=
"md-nav__item">
1859 <a href=
"../../migration/wsc52/libraries/" class=
"md-nav__link">
1860 Third Party Libraries
1877 <li class=
"md-nav__item md-nav__item--nested">
1880 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_3" type=
"checkbox" id=
"__nav_6_3" >
1882 <label class=
"md-nav__link" for=
"__nav_6_3">
1883 Migrating from WSC
3.1
1884 <span class=
"md-nav__icon md-icon"></span>
1886 <nav class=
"md-nav" aria-label=
"Migrating from WSC 3.1" data-md-level=
"2">
1887 <label class=
"md-nav__title" for=
"__nav_6_3">
1888 <span class=
"md-nav__icon md-icon"></span>
1889 Migrating from WSC
3.1
1891 <ul class=
"md-nav__list" data-md-scrollfix
>
1897 <li class=
"md-nav__item">
1898 <a href=
"../../migration/wsc31/php/" class=
"md-nav__link">
1916 <li class=
"md-nav__item md-nav__item--nested">
1919 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_4" type=
"checkbox" id=
"__nav_6_4" >
1921 <label class=
"md-nav__link" for=
"__nav_6_4">
1922 Migrating from WSC
3.0
1923 <span class=
"md-nav__icon md-icon"></span>
1925 <nav class=
"md-nav" aria-label=
"Migrating from WSC 3.0" data-md-level=
"2">
1926 <label class=
"md-nav__title" for=
"__nav_6_4">
1927 <span class=
"md-nav__icon md-icon"></span>
1928 Migrating from WSC
3.0
1930 <ul class=
"md-nav__list" data-md-scrollfix
>
1936 <li class=
"md-nav__item">
1937 <a href=
"../../migration/wsc30/php/" class=
"md-nav__link">
1948 <li class=
"md-nav__item">
1949 <a href=
"../../migration/wsc30/javascript/" class=
"md-nav__link">
1960 <li class=
"md-nav__item">
1961 <a href=
"../../migration/wsc30/templates/" class=
"md-nav__link">
1972 <li class=
"md-nav__item">
1973 <a href=
"../../migration/wsc30/css/" class=
"md-nav__link">
1984 <li class=
"md-nav__item">
1985 <a href=
"../../migration/wsc30/package/" class=
"md-nav__link">
2003 <li class=
"md-nav__item md-nav__item--nested">
2006 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_6_5" type=
"checkbox" id=
"__nav_6_5" >
2008 <label class=
"md-nav__link" for=
"__nav_6_5">
2009 Migrating from WCF
2.1
2010 <span class=
"md-nav__icon md-icon"></span>
2012 <nav class=
"md-nav" aria-label=
"Migrating from WCF 2.1" data-md-level=
"2">
2013 <label class=
"md-nav__title" for=
"__nav_6_5">
2014 <span class=
"md-nav__icon md-icon"></span>
2015 Migrating from WCF
2.1
2017 <ul class=
"md-nav__list" data-md-scrollfix
>
2023 <li class=
"md-nav__item">
2024 <a href=
"../../migration/wcf21/php/" class=
"md-nav__link">
2035 <li class=
"md-nav__item">
2036 <a href=
"../../migration/wcf21/templates/" class=
"md-nav__link">
2047 <li class=
"md-nav__item">
2048 <a href=
"../../migration/wcf21/css/" class=
"md-nav__link">
2059 <li class=
"md-nav__item">
2060 <a href=
"../../migration/wcf21/package/" class=
"md-nav__link">
2087 <li class=
"md-nav__item md-nav__item--nested">
2090 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_7" type=
"checkbox" id=
"__nav_7" >
2092 <label class=
"md-nav__link" for=
"__nav_7">
2094 <span class=
"md-nav__icon md-icon"></span>
2096 <nav class=
"md-nav" aria-label=
"Tutorials" data-md-level=
"1">
2097 <label class=
"md-nav__title" for=
"__nav_7">
2098 <span class=
"md-nav__icon md-icon"></span>
2101 <ul class=
"md-nav__list" data-md-scrollfix
>
2108 <li class=
"md-nav__item md-nav__item--nested">
2111 <input class=
"md-nav__toggle md-toggle" data-md-toggle=
"__nav_7_1" type=
"checkbox" id=
"__nav_7_1" >
2113 <label class=
"md-nav__link" for=
"__nav_7_1">
2115 <span class=
"md-nav__icon md-icon"></span>
2117 <nav class=
"md-nav" aria-label=
"Tutorial Series" data-md-level=
"2">
2118 <label class=
"md-nav__title" for=
"__nav_7_1">
2119 <span class=
"md-nav__icon md-icon"></span>
2122 <ul class=
"md-nav__list" data-md-scrollfix
>
2128 <li class=
"md-nav__item">
2129 <a href=
"../../tutorial/series/overview/" class=
"md-nav__link">
2140 <li class=
"md-nav__item">
2141 <a href=
"../../tutorial/series/part_1/" class=
"md-nav__link">
2152 <li class=
"md-nav__item">
2153 <a href=
"../../tutorial/series/part_2/" class=
"md-nav__link">
2164 <li class=
"md-nav__item">
2165 <a href=
"../../tutorial/series/part_3/" class=
"md-nav__link">
2176 <li class=
"md-nav__item">
2177 <a href=
"../../tutorial/series/part_4/" class=
"md-nav__link">
2188 <li class=
"md-nav__item">
2189 <a href=
"../../tutorial/series/part_5/" class=
"md-nav__link">
2216 <div class=
"md-sidebar md-sidebar--secondary" data-md-component=
"sidebar" data-md-type=
"toc" >
2217 <div class=
"md-sidebar__scrollwrap">
2218 <div class=
"md-sidebar__inner">
2220 <nav class=
"md-nav md-nav--secondary" aria-label=
"Table of contents">
2227 <label class=
"md-nav__title" for=
"__toc">
2228 <span class=
"md-nav__icon md-icon"></span>
2231 <ul class=
"md-nav__list" data-md-component=
"toc" data-md-scrollfix
>
2233 <li class=
"md-nav__item">
2234 <a href=
"#53-anchor" class=
"md-nav__link">
2240 <li class=
"md-nav__item">
2241 <a href=
"#53-anchorattributes" class=
"md-nav__link">
2242 5.3+ anchorAttributes
2247 <li class=
"md-nav__item">
2248 <a href=
"#append" class=
"md-nav__link">
2254 <li class=
"md-nav__item">
2255 <a href=
"#assign" class=
"md-nav__link">
2261 <li class=
"md-nav__item">
2262 <a href=
"#capture" class=
"md-nav__link">
2268 <li class=
"md-nav__item">
2269 <a href=
"#concat" class=
"md-nav__link">
2275 <li class=
"md-nav__item">
2276 <a href=
"#counter" class=
"md-nav__link">
2282 <li class=
"md-nav__item">
2283 <a href=
"#54-csrftoken" class=
"md-nav__link">
2289 <li class=
"md-nav__item">
2290 <a href=
"#currency" class=
"md-nav__link">
2296 <li class=
"md-nav__item">
2297 <a href=
"#cycle" class=
"md-nav__link">
2303 <li class=
"md-nav__item">
2304 <a href=
"#date" class=
"md-nav__link">
2310 <li class=
"md-nav__item">
2311 <a href=
"#31-dateinterval" class=
"md-nav__link">
2317 <li class=
"md-nav__item">
2318 <a href=
"#encodejs" class=
"md-nav__link">
2324 <li class=
"md-nav__item">
2325 <a href=
"#encodejson" class=
"md-nav__link">
2331 <li class=
"md-nav__item">
2332 <a href=
"#escapecdata" class=
"md-nav__link">
2338 <li class=
"md-nav__item">
2339 <a href=
"#event" class=
"md-nav__link">
2345 <li class=
"md-nav__item">
2346 <a href=
"#fetch" class=
"md-nav__link">
2352 <li class=
"md-nav__item">
2353 <a href=
"#filesizebinary" class=
"md-nav__link">
2359 <li class=
"md-nav__item">
2360 <a href=
"#filesize" class=
"md-nav__link">
2366 <li class=
"md-nav__item">
2367 <a href=
"#hascontent" class=
"md-nav__link">
2373 <li class=
"md-nav__item">
2374 <a href=
"#htmlcheckboxes" class=
"md-nav__link">
2380 <li class=
"md-nav__item">
2381 <a href=
"#htmloptions" class=
"md-nav__link">
2387 <li class=
"md-nav__item">
2388 <a href=
"#implode" class=
"md-nav__link">
2394 <li class=
"md-nav__item">
2395 <a href=
"#52-ipsearch" class=
"md-nav__link">
2401 <li class=
"md-nav__item">
2402 <a href=
"#30-js" class=
"md-nav__link">
2408 <li class=
"md-nav__item">
2409 <a href=
"#53-jslang" class=
"md-nav__link">
2415 <li class=
"md-nav__item">
2416 <a href=
"#lang" class=
"md-nav__link">
2422 <li class=
"md-nav__item">
2423 <a href=
"#language" class=
"md-nav__link">
2429 <li class=
"md-nav__item">
2430 <a href=
"#link" class=
"md-nav__link">
2436 <li class=
"md-nav__item">
2437 <a href=
"#newlinetobreak" class=
"md-nav__link">
2443 <li class=
"md-nav__item">
2444 <a href=
"#54-objectaction" class=
"md-nav__link">
2450 <li class=
"md-nav__item">
2451 <a href=
"#30-page" class=
"md-nav__link">
2457 <li class=
"md-nav__item">
2458 <a href=
"#pages" class=
"md-nav__link">
2464 <li class=
"md-nav__item">
2465 <a href=
"#plaintime" class=
"md-nav__link">
2471 <li class=
"md-nav__item">
2472 <a href=
"#53-plural" class=
"md-nav__link">
2478 <li class=
"md-nav__item">
2479 <a href=
"#prepend" class=
"md-nav__link">
2485 <li class=
"md-nav__item">
2486 <a href=
"#shortunit" class=
"md-nav__link">
2492 <li class=
"md-nav__item">
2493 <a href=
"#smallpages" class=
"md-nav__link">
2499 <li class=
"md-nav__item">
2500 <a href=
"#tablewordwrap" class=
"md-nav__link">
2506 <li class=
"md-nav__item">
2507 <a href=
"#time" class=
"md-nav__link">
2513 <li class=
"md-nav__item">
2514 <a href=
"#truncate" class=
"md-nav__link">
2520 <li class=
"md-nav__item">
2521 <a href=
"#53-user" class=
"md-nav__link">
2535 <div class=
"md-content" data-md-component=
"content">
2536 <article class=
"md-content__inner md-typeset">
2539 <a href=
"https://github.com/WoltLab/docs.woltlab.com/edit/5.4/docs/view/template-plugins.md" title=
"Edit this page" class=
"md-content__button md-icon">
2540 <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>
2544 <h1 id=
"template-plugins">Template Plugins
<a class=
"headerlink" href=
"#template-plugins" title=
"Permanent link">#
</a></h1>
2545 <h2 id=
"53-anchor"><span class=
"label label-info">5.3+
</span> <code>anchor
</code><a class=
"headerlink" href=
"#53-anchor" title=
"Permanent link">#
</a></h2>
2546 <p>The
<code>anchor
</code> template plugin creates
<code>a
</code> HTML elements.
2547 The easiest way to use the template plugin is to pass it an instance of
<code>ITitledLinkObject
</code>:
</p>
2548 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">anchor
</span> <span class=
"na">object
</span><span class=
"o">=
</span><span class=
"nv">$object
</span><span class=
"cp">}
</span><span class=
"x"></span>
2551 <p>generates the same output as
</p>
2552 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><a href=
"</span><span class=
"cp">{
</span><span class=
"nv">$object
</span><span class=
"o">-
></span><span class=
"na">getLink
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x">"></span><span class=
"cp">{
</span><span class=
"nv">$object
</span><span class=
"o">-
></span><span class=
"na">getTitle
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x"></a
></span>
2555 <p>Instead of an
<code>object
</code> parameter, a
<code>link
</code> and
<code>content
</code> parameter can be used:
</p>
2556 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">anchor
</span> <span class=
"na">link
</span><span class=
"o">=
</span><span class=
"nv">$linkObject
</span> <span class=
"na">content
</span><span class=
"o">=
</span><span class=
"nv">$content
</span><span class=
"cp">}
</span><span class=
"x"></span>
2559 <p>where
<code>$linkObject
</code> implements
<code>ILinkableObject
</code> and
<code>$content
</code> is either an object implementing
<code>ITitledObject
</code> or having a
<code>__toString()
</code> method or
<code>$content
</code> is a string or a number.
</p>
2560 <p>The last special attribute is
<code>append
</code> whose contents are appended to the
<code>href
</code> attribute of the generated anchor element.
</p>
2561 <p>All of the other attributes matching
<code>~^[a-z]+([A-z]+)+$~
</code>, expect for
<code>href
</code> which is disallowed, are added as attributes to the anchor element.
</p>
2562 <p>If an
<code>object
</code> attribute is present, the object also implements
<code>IPopoverObject
</code> and if the return value of
<code>IPopoverObject::getPopoverLinkClass()
</code> is included in the
<code>class
</code> attribute of the
<code>anchor
</code> tag,
<code>data-object-id
</code> is automatically added.
2563 This functionality makes it easy to generate links with popover support.
2565 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><a href=
"</span><span class=
"cp">{
</span><span class=
"nv">$entry
</span><span class=
"o">-
></span><span class=
"na">getLink
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x">" class=
"blogEntryLink
" data-object-id=
"</span><span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$entry
</span><span class=
"o">-
></span><span class=
"na">entryID
</span><span class=
"cp">}
</span><span class=
"x">"></span><span class=
"cp">{
</span><span class=
"nv">$entry
</span><span class=
"o">-
></span><span class=
"na">subject
</span><span class=
"cp">}
</span><span class=
"x"></a
></span>
2569 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">anchor
</span> <span class=
"na">object
</span><span class=
"o">=
</span><span class=
"nv">$entry
</span> <span class=
"na">class
</span><span class=
"o">=
</span><span class=
"s1">'blogEntryLink
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2572 <p>is sufficient if
<code>Entry::getPopoverLinkClass()
</code> returns
<code>blogEntryLink
</code>.
</p>
2573 <h2 id=
"53-anchorattributes"><span class=
"label label-info">5.3+
</span> <code>anchorAttributes
</code><a class=
"headerlink" href=
"#53-anchorattributes" title=
"Permanent link">#
</a></h2>
2574 <p><code>anchorAttributes
</code> compliments the
<code>StringUtil::getAnchorTagAttributes(string, bool): string
</code> method.
2575 It allows to easily generate the necessary attributes for an anchor tag based off the destination URL.
</p>
2576 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><a href=
"https://www.example.com
" </span><span class=
"cp">{
</span><span class=
"nf">anchorAttributes
</span> <span class=
"na">url
</span><span class=
"o">=
</span><span class=
"s1">'https://www.example.com
'</span> <span class=
"na">appendHref
</span><span class=
"o">=
</span><span class=
"kc">false
</span> <span class=
"na">appendClassname
</span><span class=
"o">=
</span><span class=
"kc">true
</span> <span class=
"na">isUgc
</span><span class=
"o">=
</span><span class=
"kc">true
</span><span class=
"cp">}
</span><span class=
"x">></span>
2583 <th>Description
</th>
2588 <td><code>url
</code></td>
2589 <td>destination URL
</td>
2592 <td><code>appendHref
</code></td>
2593 <td>whether the
<code>href
</code> attribute should be generated;
<code>true
</code> by default
</td>
2596 <td><code>isUgc
</code></td>
2597 <td>whether the
<code>rel=
"ugc"</code> attribute should be generated;
<code>false
</code> by default
</td>
2600 <td><code>appendClassname
</code></td>
2601 <td>whether the
<code>class=
"externalURL"</code> attribute should be generated;
<code>true
</code> by default
</td>
2605 <h2 id=
"append"><code>append
</code><a class=
"headerlink" href=
"#append" title=
"Permanent link">#
</a></h2>
2606 <p>If a string should be appended to the value of a variable,
<code>append
</code> can be used:
</p>
2607 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2608 <span class=
"normal">2</span>
2609 <span class=
"normal">3</span>
2610 <span class=
"normal">4</span>
2611 <span class=
"normal">5</span>
2612 <span class=
"normal">6</span>
2613 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">templateVariable
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"s1">'newValue
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2615 <span class=
"cp">{
</span><span class=
"nv">$templateVariable
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'newValue *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2617 <span class=
"cp">{
</span><span class=
"nf">append
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">templateVariable
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"s1">'2'</span><span class=
"cp">}
</span><span class=
"x"></span>
2619 <span class=
"cp">{
</span><span class=
"nv">$templateVariable
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* now prints
'newValue2 *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2622 <p>If the variables does not exist yet,
<code>append
</code> creates a new one with the given value.
2623 If
<code>append
</code> is used on an array as the variable, the value is appended to all elements of the array.
</p>
2624 <h2 id=
"assign"><code>assign
</code><a class=
"headerlink" href=
"#assign" title=
"Permanent link">#
</a></h2>
2625 <p>New template variables can be declared and new values can be assigned to existing template variables using
<code>assign
</code>:
</p>
2626 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2627 <span class=
"normal">2</span>
2628 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">templateVariable
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"s1">'newValue
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2630 <span class=
"cp">{
</span><span class=
"nv">$templateVariable
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'newValue *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2633 <h2 id=
"capture"><code>capture
</code><a class=
"headerlink" href=
"#capture" title=
"Permanent link">#
</a></h2>
2634 <p>In some situations,
<code>assign
</code> is not sufficient to assign values to variables in templates if the value is complex.
2635 Instead,
<code>capture
</code> can be used:
</p>
2636 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2637 <span class=
"normal">2</span>
2638 <span class=
"normal">3</span>
2639 <span class=
"normal">4</span>
2640 <span class=
"normal">5</span>
2641 <span class=
"normal">6</span>
2642 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">capture
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">templateVariable
</span><span class=
"cp">}
</span><span class=
"x"></span>
2643 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">if
</span> <span class=
"nv">$foo
</span><span class=
"cp">}
</span><span class=
"x"></span>
2644 <span class=
"x"> <p
></span><span class=
"cp">{
</span><span class=
"nv">$bar
</span><span class=
"cp">}
</span><span class=
"x"></p
></span>
2645 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">else
</span><span class=
"cp">}
</span><span class=
"x"></span>
2646 <span class=
"x"> <small
></span><span class=
"cp">{
</span><span class=
"nv">$baz
</span><span class=
"cp">}
</span><span class=
"x"></small
></span>
2647 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/if
</span><span class=
"cp">}
</span><span class=
"x"></span>
2648 <span class=
"cp">{
</span><span class=
"nf">/capture
</span><span class=
"cp">}
</span><span class=
"x"></span>
2651 <h2 id=
"concat"><code>concat
</code><a class=
"headerlink" href=
"#concat" title=
"Permanent link">#
</a></h2>
2652 <p><code>concat
</code> is a modifier used to concatenate multiple strings:
</p>
2653 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2654 <span class=
"normal">2</span>
2655 <span class=
"normal">3</span>
2656 <span class=
"normal">4</span>
2657 <span class=
"normal">5</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">foo
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"s1">'foo
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2659 <span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">templateVariable
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"s1">'bar
'</span><span class=
"o">|
</span><span class=
"na">concat
</span><span class=
"o">:
</span><span class=
"nv">$foo
</span><span class=
"cp">}
</span><span class=
"x"></span>
2661 <span class=
"cp">{
</span><span class=
"nv">$templateVariable
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'foobar *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2664 <h2 id=
"counter"><code>counter
</code><a class=
"headerlink" href=
"#counter" title=
"Permanent link">#
</a></h2>
2665 <p><code>counter
</code> can be used to generate and optionally print a counter:
</p>
2666 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2667 <span class=
"normal">2</span>
2668 <span class=
"normal">3</span>
2669 <span class=
"normal">4</span>
2670 <span class=
"normal">5</span>
2671 <span class=
"normal">6</span>
2672 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">counter
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCounter
</span> <span class=
"na">print
</span><span class=
"o">=
</span><span class=
"kc">true
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'1' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2674 <span class=
"cp">{
</span><span class=
"nf">counter
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCounter
</span> <span class=
"na">print
</span><span class=
"o">=
</span><span class=
"kc">true
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'2' now *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2676 <span class=
"cp">{
</span><span class=
"nf">counter
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCounter
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints nothing, but counter value is
'3' now internally *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2678 <span class=
"cp">{
</span><span class=
"nf">counter
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCounter
</span> <span class=
"na">print
</span><span class=
"o">=
</span><span class=
"kc">true
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'4' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2681 <p>Counter supports the following attributes:
</p>
2686 <th>Description
</th>
2691 <td><code>assign
</code></td>
2692 <td>optional name of the template variable the current counter value is assigned to
</td>
2695 <td><code>direction
</code></td>
2696 <td>counting direction, either
<code>up
</code> or
<code>down
</code>;
<code>up
</code> by default
</td>
2699 <td><code>name
</code></td>
2700 <td>name of the counter, relevant if multiple counters are used simultaneously
</td>
2703 <td><code>print
</code></td>
2704 <td>if
<code>true
</code>, the current counter value is printed;
<code>false
</code> by default
</td>
2707 <td><code>skip
</code></td>
2708 <td>positive counting increment;
<code>1</code> by default
</td>
2711 <td><code>start
</code></td>
2712 <td>start counter value;
<code>1</code> by default
</td>
2716 <h2 id=
"54-csrftoken"><span class=
"label label-info">5.4+
</span> <code>csrfToken
</code><a class=
"headerlink" href=
"#54-csrftoken" title=
"Permanent link">#
</a></h2>
2717 <p><code>{csrfToken}
</code> prints out the session's CSRF token (“Security Token”).
</p>
2718 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2719 <span class=
"normal">2</span>
2720 <span class=
"normal">3</span>
2721 <span class=
"normal">4</span>
2722 <span class=
"normal">5</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><form action=
"</span><span class=
"cp">{
</span><span class=
"nf">link
</span> <span class=
"na">controller
</span><span class=
"o">=
</span><span class=
"s2">"Foo
"</span><span class=
"cp">}{
</span><span class=
"nf">/link
</span><span class=
"cp">}
</span><span class=
"x">" method=
"post
"></span>
2723 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* snip *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2725 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">csrfToken
</span><span class=
"cp">}
</span><span class=
"x"></span>
2726 <span class=
"x"></form
></span>
2729 <p>The
<code>{csrfToken}
</code> template plugin supports a
<code>type
</code> parameter.
2730 Specifying this parameter might be required in rare situations.
2731 Please
<a href=
"https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/template/plugin/CsrfTokenFunctionTemplatePlugin.class.php">check the implementation
</a> for details.
</p>
2732 <h2 id=
"currency"><code>currency
</code><a class=
"headerlink" href=
"#currency" title=
"Permanent link">#
</a></h2>
2733 <p><code>currency
</code> is a modifier used to format currency values with two decimals using language dependent thousands separators and decimal point:
</p>
2734 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2735 <span class=
"normal">2</span>
2736 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">currencyValue
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"m">12.345</span><span class=
"cp">}
</span><span class=
"x"></span>
2738 <span class=
"cp">{
</span><span class=
"nv">$currencyValue
</span><span class=
"o">|
</span><span class=
"na">currency
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'12.34' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2741 <h2 id=
"cycle"><code>cycle
</code><a class=
"headerlink" href=
"#cycle" title=
"Permanent link">#
</a></h2>
2742 <p><code>cycle
</code> can be used to cycle between different values:
</p>
2743 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2744 <span class=
"normal">2</span>
2745 <span class=
"normal">3</span>
2746 <span class=
"normal">4</span>
2747 <span class=
"normal">5</span>
2748 <span class=
"normal">6</span>
2749 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">cycle
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCycle
</span> <span class=
"na">values
</span><span class=
"o">=
</span><span class=
"s1">'bar,baz
'</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'bar
' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2751 <span class=
"cp">{
</span><span class=
"nf">cycle
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCycle
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'baz
' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2753 <span class=
"cp">{
</span><span class=
"nf">cycle
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCycle
</span> <span class=
"na">advance
</span><span class=
"o">=
</span><span class=
"kc">false
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'baz
' again *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2755 <span class=
"cp">{
</span><span class=
"nf">cycle
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">fooCycle
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'bar
' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2758 <div class=
"admonition info">
2759 <p class=
"admonition-title">The values attribute only has to be present for the first call. If
<code>cycle
</code> is used in a loop, the presence of the same values in consecutive calls has no effect. Only once the values change, the cycle is reset.
</p>
2765 <th>Description
</th>
2770 <td><code>advance
</code></td>
2771 <td>if
<code>true
</code>, the current cycle value is advanced to the next value;
<code>true
</code> by default
</td>
2774 <td><code>assign
</code></td>
2775 <td>optional name of the template variable the current cycle value is assigned to; if used,
<code>print
</code> is set to
<code>false
</code></td>
2778 <td><code>delimiter
</code></td>
2779 <td>delimiter between the different cycle values;
<code>,
</code> by default
</td>
2782 <td><code>name
</code></td>
2783 <td>name of the cycle, relevant if multiple cycles are used simultaneously
</td>
2786 <td><code>print
</code></td>
2787 <td>if
<code>true
</code>, the current cycle value is printed,
<code>false
</code> by default
</td>
2790 <td><code>reset
</code></td>
2791 <td>if
<code>true
</code>, the current cycle value is set to the first value,
<code>false
</code> by default
</td>
2794 <td><code>values
</code></td>
2795 <td>string containing the different cycles values, also see
<code>delimiter
</code></td>
2799 <h2 id=
"date"><code>date
</code><a class=
"headerlink" href=
"#date" title=
"Permanent link">#
</a></h2>
2800 <p><code>date
</code> generated a formatted date using
<code>wcf\util\DateUtil::format()
</code> with
<code>DateUtil::DATE_FORMAT
</code> internally.
</p>
2801 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$timestamp
</span><span class=
"o">|
</span><span class=
"na">date
</span><span class=
"cp">}
</span><span class=
"x"></span>
2804 <h2 id=
"31-dateinterval"><span class=
"label label-info">3.1+
</span> <code>dateInterval
</code><a class=
"headerlink" href=
"#31-dateinterval" title=
"Permanent link">#
</a></h2>
2805 <p><code>dateInterval
</code> calculates the difference between two unix timestamps and generated a textual date interval.
</p>
2806 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">dateInterval
</span> <span class=
"na">start
</span><span class=
"o">=
</span><span class=
"nv">$startTimestamp
</span> <span class=
"na">end
</span><span class=
"o">=
</span><span class=
"nv">$endTimestamp
</span> <span class=
"na">full
</span><span class=
"o">=
</span><span class=
"kc">true
</span> <span class=
"na">format
</span><span class=
"o">=
</span><span class=
"s1">'sentence
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2813 <th>Description
</th>
2818 <td><code>end
</code></td>
2819 <td>end of the time interval; current timestamp by default (though either
<code>start
</code> or
<code>end
</code> has to be set)
</td>
2822 <td><code>format
</code></td>
2823 <td>output format, either
<code>default
</code>,
<code>sentence
</code>, or
<code>plain
</code>; defaults to
<code>default
</code>, see
<code>wcf\util\DateUtil::FORMAT_*
</code> constants
</td>
2826 <td><code>full
</code></td>
2827 <td>if
<code>true
</code>, full difference in minutes is shown; if
<code>false
</code>, only the longest time interval is shown;
<code>false
</code> by default
</td>
2830 <td><code>start
</code></td>
2831 <td>start of the time interval; current timestamp by default (though either
<code>start
</code> or
<code>end
</code> has to be set)
</td>
2835 <h2 id=
"encodejs"><code>encodeJS
</code><a class=
"headerlink" href=
"#encodejs" title=
"Permanent link">#
</a></h2>
2836 <p><code>encodeJS
</code> encodes a string to be used as a single-quoted string in JavaScript by replacing
<code>\\
</code> with
<code>\\\\
</code>,
<code>'
</code> with
<code>\'
</code>, linebreaks with
<code>\n
</code>, and
<code>/
</code> with
<code>\/
</code>.
</p>
2837 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2838 <span class=
"normal">2</span>
2839 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><script
></span>
2840 <span class=
"x"> var foo =
'</span><span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$foo
</span><span class=
"o">|
</span><span class=
"na">encodeJS
</span><span class=
"cp">}
</span><span class=
"x">';
</span>
2841 <span class=
"x"></script
></span>
2844 <h2 id=
"encodejson"><code>encodeJSON
</code><a class=
"headerlink" href=
"#encodejson" title=
"Permanent link">#
</a></h2>
2845 <p><code>encodeJSON
</code> encodes a JSON string to be used as a single-quoted string in JavaScript by replacing
<code>\\
</code> with
<code>\\\\
</code>,
<code>'
</code> with
<code>&#
39;
</code>, linebreaks with
<code>\n
</code>, and
<code>/
</code> with
<code>\/
</code>.
2846 Additionally,
<code>htmlspecialchars
</code> is applied to the string.
</p>
2847 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x">'</span><span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$foo
</span><span class=
"o">|
</span><span class=
"na">encodeJSON
</span><span class=
"cp">}
</span><span class=
"x">'</span>
2850 <h2 id=
"escapecdata"><code>escapeCDATA
</code><a class=
"headerlink" href=
"#escapecdata" title=
"Permanent link">#
</a></h2>
2851 <p><code>escapeCDATA
</code> encodes a string to be used in a
<code>CDATA
</code> element by replacing
<code>]]
></code> with
<code>]]]]
><![CDATA[
></code>.
</p>
2852 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><![CDATA[
</span><span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$foo
</span><span class=
"o">|
</span><span class=
"na">encodeCDATA
</span><span class=
"cp">}
</span><span class=
"x">]]
></span>
2855 <h2 id=
"event"><code>event
</code><a class=
"headerlink" href=
"#event" title=
"Permanent link">#
</a></h2>
2856 <p><code>event
</code> provides extension points in templates that
<a href=
"../../package/pip/template-listener/">template listeners
</a> can use.
</p>
2857 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">event
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"s1">'foo
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2860 <h2 id=
"fetch"><code>fetch
</code><a class=
"headerlink" href=
"#fetch" title=
"Permanent link">#
</a></h2>
2861 <p><code>fetch
</code> fetches the contents of a file using
<code>file_get_contents
</code>.
</p>
2862 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2863 <span class=
"normal">2</span>
2864 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">fetch
</span> <span class=
"na">file
</span><span class=
"o">=
</span><span class=
"s1">'foo.html
'</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints the contents of `foo.html` *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2866 <span class=
"cp">{
</span><span class=
"nf">fetch
</span> <span class=
"na">file
</span><span class=
"o">=
</span><span class=
"s1">'bar.html
'</span> <span class=
"na">assign
</span><span class=
"o">=
</span><span class=
"na">bar
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* assigns the contents of `foo.html` to `$bar`; does not print the contents *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2869 <h2 id=
"filesizebinary"><code>filesizeBinary
</code><a class=
"headerlink" href=
"#filesizebinary" title=
"Permanent link">#
</a></h2>
2870 <p><code>filesizeBinary
</code> formats the filesize using binary filesize (in bytes).
</p>
2871 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$filesize
</span><span class=
"o">|
</span><span class=
"na">filesizeBinary
</span><span class=
"cp">}
</span><span class=
"x"></span>
2874 <h2 id=
"filesize"><code>filesize
</code><a class=
"headerlink" href=
"#filesize" title=
"Permanent link">#
</a></h2>
2875 <p><code>filesize
</code> formats the filesize using filesize (in bytes).
</p>
2876 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$filesize
</span><span class=
"o">|
</span><span class=
"na">filesize
</span><span class=
"cp">}
</span><span class=
"x"></span>
2879 <h2 id=
"hascontent"><code>hascontent
</code><a class=
"headerlink" href=
"#hascontent" title=
"Permanent link">#
</a></h2>
2880 <p>In many cases, conditional statements can be used to determine if a certain section of a template is shown:
</p>
2881 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2882 <span class=
"normal">2</span>
2883 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">if
</span> <span class=
"nv">$foo
</span> <span class=
"o">===
</span> <span class=
"s1">'bar
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2884 <span class=
"x"> only shown if $foo is bar
</span>
2885 <span class=
"cp">{
</span><span class=
"nf">/if
</span><span class=
"cp">}
</span><span class=
"x"></span>
2888 <p>In some situations, however, such conditional statements are not sufficient.
2889 One prominent example is a template event:
</p>
2890 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2891 <span class=
"normal">2</span>
2892 <span class=
"normal">3</span>
2893 <span class=
"normal">4</span>
2894 <span class=
"normal">5</span>
2895 <span class=
"normal">6</span>
2896 <span class=
"normal">7</span>
2897 <span class=
"normal">8</span>
2898 <span class=
"normal">9</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">if
</span> <span class=
"nv">$foo
</span> <span class=
"o">===
</span> <span class=
"s1">'bar
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2899 <span class=
"x"> <ul
></span>
2900 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">if
</span> <span class=
"nv">$foo
</span> <span class=
"o">===
</span> <span class=
"s1">'bar
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2901 <span class=
"x"> <li
>Bar
</li
></span>
2902 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/if
</span><span class=
"cp">}
</span><span class=
"x"></span>
2904 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">event
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"s1">'listItems
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2905 <span class=
"x"> </li
></span>
2906 <span class=
"cp">{
</span><span class=
"nf">/if
</span><span class=
"cp">}
</span><span class=
"x"></span>
2909 <p>In this example, if
<code>$foo !== 'bar'
</code>, the list will not be shown, regardless of the additional template code provided by template listeners.
2910 In such a situation,
<code>hascontent
</code> has to be used:
</p>
2911 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
2912 <span class=
"normal"> 2</span>
2913 <span class=
"normal"> 3</span>
2914 <span class=
"normal"> 4</span>
2915 <span class=
"normal"> 5</span>
2916 <span class=
"normal"> 6</span>
2917 <span class=
"normal"> 7</span>
2918 <span class=
"normal"> 8</span>
2919 <span class=
"normal"> 9</span>
2920 <span class=
"normal">10</span>
2921 <span class=
"normal">11</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">hascontent
</span><span class=
"cp">}
</span><span class=
"x"></span>
2922 <span class=
"x"> <ul
></span>
2923 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">content
</span><span class=
"cp">}
</span><span class=
"x"></span>
2924 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">if
</span> <span class=
"nv">$foo
</span> <span class=
"o">===
</span> <span class=
"s1">'bar
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2925 <span class=
"x"> <li
>Bar
</li
></span>
2926 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/if
</span><span class=
"cp">}
</span><span class=
"x"></span>
2928 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">event
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"s1">'listItems
'</span><span class=
"cp">}
</span><span class=
"x"></span>
2929 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/content
</span><span class=
"cp">}
</span><span class=
"x"></span>
2930 <span class=
"x"> </ul
></span>
2931 <span class=
"cp">{
</span><span class=
"nf">/hascontent
</span><span class=
"cp">}
</span><span class=
"x"></span>
2934 <p>If the part of the template wrapped in the
<code>content
</code> tags has any (trimmed) content, the part of the template wrapped by
<code>hascontent
</code> tags is shown (including the part wrapped by the
<code>content
</code> tags), otherwise nothing is shown.
2935 Thus, this construct avoids an empty list compared to the
<code>if
</code> solution above.
</p>
2936 <p>Like
<code>foreach
</code>,
<code>hascontent
</code> also supports an
<code>else
</code> part:
</p>
2937 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2938 <span class=
"normal">2</span>
2939 <span class=
"normal">3</span>
2940 <span class=
"normal">4</span>
2941 <span class=
"normal">5</span>
2942 <span class=
"normal">6</span>
2943 <span class=
"normal">7</span>
2944 <span class=
"normal">8</span>
2945 <span class=
"normal">9</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">hascontent
</span><span class=
"cp">}
</span><span class=
"x"></span>
2946 <span class=
"x"> <ul
></span>
2947 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">content
</span><span class=
"cp">}
</span><span class=
"x"></span>
2948 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* … *
</span><span class=
"cp">}
</span><span class=
"x"></span>
2949 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">/content
</span><span class=
"cp">}
</span><span class=
"x"></span>
2950 <span class=
"x"> </ul
></span>
2951 <span class=
"cp">{
</span><span class=
"nf">hascontentelse
</span><span class=
"cp">}
</span><span class=
"x"></span>
2952 <span class=
"x"> no list
</span>
2953 <span class=
"cp">{
</span><span class=
"nf">/hascontent
</span><span class=
"cp">}
</span><span class=
"x"></span>
2956 <h2 id=
"htmlcheckboxes"><code>htmlCheckboxes
</code><a class=
"headerlink" href=
"#htmlcheckboxes" title=
"Permanent link">#
</a></h2>
2957 <p><code>htmlCheckboxes
</code> generates a list of HTML checkboxes.
</p>
2958 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
2959 <span class=
"normal">2</span>
2960 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">htmlCheckboxes
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">foo
</span> <span class=
"na">options
</span><span class=
"o">=
</span><span class=
"nv">$fooOptions
</span> <span class=
"na">selected
</span><span class=
"o">=
</span><span class=
"nv">$currentFoo
</span><span class=
"cp">}
</span><span class=
"x"></span>
2962 <span class=
"cp">{
</span><span class=
"nf">htmlCheckboxes
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"na">bar
</span> <span class=
"na">output
</span><span class=
"o">=
</span><span class=
"nv">$barLabels
</span> <span class=
"na">values
</span><span class=
"o">=
</span><span class=
"nv">$barValues
</span> <span class=
"na">selected
</span><span class=
"o">=
</span><span class=
"nv">$currentBar
</span><span class=
"cp">}
</span><span class=
"x"></span>
2969 <th>Description
</th>
2974 <td><span class=
"label label-info">5.2+
</span> <code>disabled
</code></td>
2975 <td>if
<code>true
</code>, all checkboxes are disabled
</td>
2978 <td><code>disableEncoding
</code></td>
2979 <td>if
<code>true
</code>, the values are not passed through
<code>wcf\util\StringUtil::encodeHTML()
</code>;
<code>false
</code> by default
</td>
2982 <td><code>name
</code></td>
2983 <td><code>name
</code> attribute of the
<code>input
</code> checkbox element
</td>
2986 <td><code>output
</code></td>
2987 <td>array used as keys and values for
<code>options
</code> if present; not present by default
</td>
2990 <td><code>options
</code></td>
2991 <td>array selectable options with the key used as
<code>value
</code> attribute and the value as the checkbox label
</td>
2994 <td><code>selected
</code></td>
2995 <td>current selected value(s)
</td>
2998 <td><code>separator
</code></td>
2999 <td>separator between the different checkboxes in the generated output; empty string by default
</td>
3002 <td><code>values
</code></td>
3003 <td>array with values used in combination with
<code>output
</code>, where
<code>output
</code> is only used as keys for
<code>options
</code></td>
3007 <h2 id=
"htmloptions"><code>htmlOptions
</code><a class=
"headerlink" href=
"#htmloptions" title=
"Permanent link">#
</a></h2>
3008 <p><code>htmlOptions
</code> generates an
<code>select
</code> HTML element.
</p>
3009 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3010 <span class=
"normal">2</span>
3011 <span class=
"normal">3</span>
3012 <span class=
"normal">4</span>
3013 <span class=
"normal">5</span>
3014 <span class=
"normal">6</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">htmlOptions
</span> <span class=
"na">name
</span><span class=
"o">=
</span><span class=
"s1">'foo
'</span> <span class=
"na">options
</span><span class=
"o">=
</span><span class=
"nv">$options
</span> <span class=
"na">selected
</span><span class=
"o">=
</span><span class=
"nv">$selected
</span><span class=
"cp">}
</span><span class=
"x"></span>
3016 <span class=
"x"><select name=
"bar
"></span>
3017 <span class=
"x"> <option value=
""</span><span class=
"cp">{
</span><span class=
"nf">if
</span> <span class=
"o">!
</span><span class=
"nv">$selected
</span><span class=
"cp">}
</span><span class=
"x"> selected
</span><span class=
"cp">{
</span><span class=
"nf">/if
</span><span class=
"cp">}
</span><span class=
"x">></span><span class=
"cp">{
</span><span class=
"nf">lang
</span><span class=
"cp">}
</span><span class=
"x">foo.bar.default
</span><span class=
"cp">{
</span><span class=
"nf">/lang
</span><span class=
"cp">}
</span><span class=
"x"></option
></span>
3018 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"nf">htmlOptions
</span> <span class=
"na">options
</span><span class=
"o">=
</span><span class=
"nv">$options
</span> <span class=
"na">selected
</span><span class=
"o">=
</span><span class=
"nv">$selected
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* no `name` attribute *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3019 <span class=
"x"></select
></span>
3026 <th>Description
</th>
3031 <td><code>disableEncoding
</code></td>
3032 <td>if
<code>true
</code>, the values are not passed through
<code>wcf\util\StringUtil::encodeHTML()
</code>;
<code>false
</code> by default
</td>
3035 <td><code>object
</code></td>
3036 <td>optional instance of
<code>wcf\data\DatabaseObjectList
</code> that provides the selectable options (overwrites
<code>options
</code> attribute internally)
</td>
3039 <td><code>name
</code></td>
3040 <td><code>name
</code> attribute of the
<code>select
</code> element; if not present, only the
<strong>contents
</strong> of the
<code>select
</code> element are printed
</td>
3043 <td><code>output
</code></td>
3044 <td>array used as keys and values for
<code>options
</code> if present; not present by default
</td>
3047 <td><code>values
</code></td>
3048 <td>array with values used in combination with
<code>output
</code>, where
<code>output
</code> is only used as keys for
<code>options
</code></td>
3051 <td><code>options
</code></td>
3052 <td>array selectable options with the key used as
<code>value
</code> attribute and the value as the option label; if a value is an array, an
<code>optgroup
</code> is generated with the array key as the
<code>optgroup
</code> label
</td>
3055 <td><code>selected
</code></td>
3056 <td>current selected value(s)
</td>
3060 <p>All additional attributes are added as attributes of the
<code>select
</code> HTML element.
</p>
3061 <h2 id=
"implode"><code>implode
</code><a class=
"headerlink" href=
"#implode" title=
"Permanent link">#
</a></h2>
3062 <p><code>implodes
</code> transforms an array into a string and prints it.
</p>
3063 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">implode
</span> <span class=
"na">from
</span><span class=
"o">=
</span><span class=
"nv">$array
</span> <span class=
"na">key
</span><span class=
"o">=
</span><span class=
"na">key
</span> <span class=
"na">item
</span><span class=
"o">=
</span><span class=
"na">item
</span> <span class=
"na">glue
</span><span class=
"o">=
</span><span class=
"s2">";
"</span><span class=
"cp">}{
</span><span class=
"nv">$key
</span><span class=
"cp">}
</span><span class=
"x">:
</span><span class=
"cp">{
</span><span class=
"nv">$value
</span><span class=
"cp">}{
</span><span class=
"nf">/implode
</span><span class=
"cp">}
</span><span class=
"x"></span>
3070 <th>Description
</th>
3075 <td><code>from
</code></td>
3076 <td>array with the imploded values
</td>
3079 <td><code>glue
</code></td>
3080 <td>separator between the different array values;
<code>', '
</code> by default
</td>
3083 <td><code>item
</code></td>
3084 <td>template variable name where the current array value is stored during the iteration
</td>
3087 <td><code>key
</code></td>
3088 <td>optional template variable name where the current array key is stored during the iteration
</td>
3092 <h2 id=
"52-ipsearch"><span class=
"label label-info">5.2+
</span> <code>ipSearch
</code><a class=
"headerlink" href=
"#52-ipsearch" title=
"Permanent link">#
</a></h2>
3093 <p><code>ipSearch
</code> generates a link to search for an IP address.
</p>
3094 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"s2">"127.0.0.1"</span><span class=
"o">|
</span><span class=
"na">ipSearch
</span><span class=
"cp">}
</span><span class=
"x"></span>
3097 <h2 id=
"30-js"><span class=
"label label-info">3.0+
</span> <code>js
</code><a class=
"headerlink" href=
"#30-js" title=
"Permanent link">#
</a></h2>
3098 <p><code>js
</code> generates script tags based on whether
<code>ENABLE_DEBUG_MODE
</code> and
<code>VISITOR_USE_TINY_BUILD
</code> are enabled.
</p>
3099 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal"> 1</span>
3100 <span class=
"normal"> 2</span>
3101 <span class=
"normal"> 3</span>
3102 <span class=
"normal"> 4</span>
3103 <span class=
"normal"> 5</span>
3104 <span class=
"normal"> 6</span>
3105 <span class=
"normal"> 7</span>
3106 <span class=
"normal"> 8</span>
3107 <span class=
"normal"> 9</span>
3108 <span class=
"normal">10</span>
3109 <span class=
"normal">11</span>
3110 <span class=
"normal">12</span>
3111 <span class=
"normal">13</span>
3112 <span class=
"normal">14</span>
3113 <span class=
"normal">15</span>
3114 <span class=
"normal">16</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">js
</span> <span class=
"na">application
</span><span class=
"o">=
</span><span class=
"s1">'wbb
'</span> <span class=
"na">file
</span><span class=
"o">=
</span><span class=
"s1">'WBB
'</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/js/WBB.js
' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3116 <span class=
"cp">{
</span><span class=
"nf">js
</span> <span class=
"na">application
</span><span class=
"o">=
</span><span class=
"s1">'wcf
'</span> <span class=
"na">file
</span><span class=
"o">=
</span><span class=
"s1">'WCF.Like
'</span> <span class=
"na">bundle
</span><span class=
"o">=
</span><span class=
"s1">'WCF.Combined
'</span><span class=
"cp">}
</span><span class=
"x"></span>
3117 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/wcf/js/WCF.Like.js
' if ENABLE_DEBUG_MODE=
1 *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3118 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/wcf/js/WCF.Combined.min.js
' if ENABLE_DEBUG_MODE=
0 *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3120 <span class=
"cp">{
</span><span class=
"nf">js
</span> <span class=
"na">application
</span><span class=
"o">=
</span><span class=
"s1">'wcf
'</span> <span class=
"na">lib
</span><span class=
"o">=
</span><span class=
"s1">'jquery
'</span><span class=
"cp">}
</span><span class=
"x"></span>
3121 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/wcf/js/
3rdParty/jquery.js
' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3123 <span class=
"cp">{
</span><span class=
"nf">js
</span> <span class=
"na">application
</span><span class=
"o">=
</span><span class=
"s1">'wcf
'</span> <span class=
"na">lib
</span><span class=
"o">=
</span><span class=
"s1">'jquery-ui
'</span> <span class=
"na">file
</span><span class=
"o">=
</span><span class=
"s1">'awesomeWidget
'</span><span class=
"cp">}
</span><span class=
"x"></span>
3124 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/wcf/js/
3rdParty/jquery-ui/awesomeWidget.js
' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3126 <span class=
"cp">{
</span><span class=
"nf">js
</span> <span class=
"na">application
</span><span class=
"o">=
</span><span class=
"s1">'wcf
'</span> <span class=
"na">file
</span><span class=
"o">=
</span><span class=
"s1">'WCF.Like
'</span> <span class=
"na">bundle
</span><span class=
"o">=
</span><span class=
"s1">'WCF.Combined
'</span> <span class=
"na">hasTiny
</span><span class=
"o">=
</span><span class=
"kc">true
</span><span class=
"cp">}
</span><span class=
"x"></span>
3127 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/wcf/js/WCF.Like.js
' if ENABLE_DEBUG_MODE=
1 *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3128 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/wcf/js/WCF.Combined.min.js
' (ENABLE_DEBUG_MODE=
0 *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3129 <span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* generates
'http://example.com/wcf/js/WCF.Combined.tiny.min.js
' if ENABLE_DEBUG_MODE=
0 and VISITOR_USE_TINY_BUILD=
1 *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3132 <h2 id=
"53-jslang"><span class=
"label label-info">5.3+
</span> <code>jslang
</code><a class=
"headerlink" href=
"#53-jslang" title=
"Permanent link">#
</a></h2>
3133 <p><code>jslang
</code> works like
<a href=
"#lang"><code>lang
</code></a> with the difference that the resulting string is automatically passed through
<a href=
"#encodejs"><code>encodeJS
</code></a>.
</p>
3134 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3135 <span class=
"normal">2</span>
3136 <span class=
"normal">3</span>
3137 <span class=
"normal">4</span>
3138 <span class=
"normal">5</span>
3139 <span class=
"normal">6</span>
3140 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x">require([
'Language
', /* … */], function(Language, /* … */)
</span><span class=
"cp">{
</span>
3141 <span class=
"na">Language
</span><span class=
"o">.
</span><span class=
"na">addObject
</span><span class=
"o">(
</span><span class=
"cp">{
</span>
3142 <span class=
"s1">'app.foo.bar
'</span><span class=
"o">:
</span> <span class=
"s1">'{jslang}app.foo.bar{/jslang}
'</span><span class=
"o">,
</span>
3143 <span class=
"cp">}
</span><span class=
"o">);
</span>
3145 <span class=
"o">//
</span> <span class=
"err">…
</span>
3146 <span class=
"cp">}
</span><span class=
"x">);
</span>
3149 <h2 id=
"lang"><code>lang
</code><a class=
"headerlink" href=
"#lang" title=
"Permanent link">#
</a></h2>
3150 <p><code>lang
</code> replaces a language items with its value.
</p>
3151 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3152 <span class=
"normal">2</span>
3153 <span class=
"normal">3</span>
3154 <span class=
"normal">4</span>
3155 <span class=
"normal">5</span>
3156 <span class=
"normal">6</span>
3157 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">lang
</span><span class=
"cp">}
</span><span class=
"x">foo.bar.baz
</span><span class=
"cp">{
</span><span class=
"nf">/lang
</span><span class=
"cp">}
</span><span class=
"x"></span>
3159 <span class=
"cp">{
</span><span class=
"nf">lang
</span> <span class=
"na">__literal
</span><span class=
"o">=
</span><span class=
"kc">true
</span><span class=
"cp">}
</span><span class=
"x">foo.bar.baz
</span><span class=
"cp">{
</span><span class=
"nf">/lang
</span><span class=
"cp">}
</span><span class=
"x"></span>
3161 <span class=
"cp">{
</span><span class=
"nf">lang
</span> <span class=
"na">foo
</span><span class=
"o">=
</span><span class=
"s1">'baz
'</span><span class=
"cp">}
</span><span class=
"x">foo.bar.baz
</span><span class=
"cp">{
</span><span class=
"nf">/lang
</span><span class=
"cp">}
</span><span class=
"x"></span>
3163 <span class=
"cp">{
</span><span class=
"nf">lang
</span><span class=
"cp">}
</span><span class=
"x">foo.bar.baz.
</span><span class=
"cp">{
</span><span class=
"nv">$action
</span><span class=
"cp">}{
</span><span class=
"nf">/lang
</span><span class=
"cp">}
</span><span class=
"x"></span>
3170 <th>Description
</th>
3175 <td><code>__encode
</code></td>
3176 <td>if
<code>true
</code>, the output will be passed through
<code>StringUtil::encodeHTML()
</code></td>
3179 <td><code>__literal
</code></td>
3180 <td>if
<code>true
</code>, template variables will not resolved but printed as they are in the language item;
<code>false
</code> by default
</td>
3183 <td><code>__optional
</code></td>
3184 <td>if
<code>true
</code> and the language item does not exist, an empty string is printed;
<code>false
</code> by default
</td>
3188 <p>All additional attributes are available when parsing the language item.
</p>
3189 <h2 id=
"language"><code>language
</code><a class=
"headerlink" href=
"#language" title=
"Permanent link">#
</a></h2>
3190 <p><code>language
</code> replaces a language items with its value.
3191 If the template variable
<code>__language
</code> exists, this language object will be used instead of
<code>WCF::getLanguage()
</code>.
3192 This modifier is useful when assigning the value directly to a variable.
</p>
3193 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3194 <span class=
"normal">2</span>
3195 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$languageItem
</span><span class=
"o">|
</span><span class=
"na">language
</span><span class=
"cp">}
</span><span class=
"x"></span>
3197 <span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">foo
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$languageItem
</span><span class=
"o">|
</span><span class=
"na">language
</span><span class=
"cp">}
</span><span class=
"x"></span>
3200 <h2 id=
"link"><code>link
</code><a class=
"headerlink" href=
"#link" title=
"Permanent link">#
</a></h2>
3201 <p><code>link
</code> generates internal links using
<code>LinkHandler
</code>.
</p>
3202 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><a href=
"</span><span class=
"cp">{
</span><span class=
"nf">link
</span> <span class=
"na">controller
</span><span class=
"o">=
</span><span class=
"s1">'FooList
'</span> <span class=
"na">application
</span><span class=
"o">=
</span><span class=
"s1">'bar
'</span><span class=
"cp">}
</span><span class=
"x">param1=
2&param2=A
</span><span class=
"cp">{
</span><span class=
"nf">/link
</span><span class=
"cp">}
</span><span class=
"x">">Foo
</a
></span>
3209 <th>Description
</th>
3214 <td><code>application
</code></td>
3215 <td>abbreviation of the application the controller belongs to;
<code>wcf
</code> by default
</td>
3218 <td><code>controller
</code></td>
3219 <td>name of the controller; if not present, the landing page is linked in the frontend and the index page in the ACP
</td>
3222 <td><code>encode
</code></td>
3223 <td>if
<code>true
</code>, the generated link is passed through
<code>wcf\util\StringUtil::encodeHTML()
</code>;
<code>true
</code> by default
</td>
3226 <td><code>isEmail
</code></td>
3227 <td>sets
<code>encode=false
</code> and forces links to link to the frontend
</td>
3231 <p>Additional attributes are passed to
<code>LinkHandler::getLink()
</code>.
</p>
3232 <h2 id=
"newlinetobreak"><code>newlineToBreak
</code><a class=
"headerlink" href=
"#newlinetobreak" title=
"Permanent link">#
</a></h2>
3233 <p><code>newlineToBreak
</code> transforms newlines into HTML
<code><br
></code> elements after encoding the content via
<code>wcf\util\StringUtil::encodeHTML()
</code>.
</p>
3234 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$foo
</span><span class=
"o">|
</span><span class=
"na">newlineToBreak
</span><span class=
"cp">}
</span><span class=
"x"></span>
3237 <h2 id=
"54-objectaction"><span class=
"label label-info">5.4+
</span> <code>objectAction
</code><a class=
"headerlink" href=
"#54-objectaction" title=
"Permanent link">#
</a></h2>
3238 <p><code>objectAction
</code> generates action buttons to be used in combination with the
<a href=
"../../migration/wsc53/javascript/#wcfactiondelete-and-wcfactiontoggle"><code>WoltLabSuite/Core/Ui/Object/Action
</code> API
</a>.
3239 For detailed information on its usage, we refer to the extensive documentation in the
<a href=
"https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/template/plugin/ObjectActionFunctionTemplatePlugin.class.php"><code>ObjectActionFunctionTemplatePlugin
</code> class
</a> itself.
</p>
3240 <h2 id=
"30-page"><span class=
"label label-info">3.0+
</span> <code>page
</code><a class=
"headerlink" href=
"#30-page" title=
"Permanent link">#
</a></h2>
3241 <p><code>page
</code> generates an internal link to a CMS page.
</p>
3242 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3243 <span class=
"normal">2</span>
3244 <span class=
"normal">3</span>
3245 <span class=
"normal">4</span>
3246 <span class=
"normal">5</span>
3247 <span class=
"normal">6</span>
3248 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">page
</span><span class=
"cp">}
</span><span class=
"x">com.woltlab.wcf.CookiePolicy
</span><span class=
"cp">{
</span><span class=
"nf">/page
</span><span class=
"cp">}
</span><span class=
"x"></span>
3250 <span class=
"cp">{
</span><span class=
"nf">page
</span> <span class=
"na">pageID
</span><span class=
"o">=
</span><span class=
"m">1</span><span class=
"cp">}{
</span><span class=
"nf">/page
</span><span class=
"cp">}
</span><span class=
"x"></span>
3252 <span class=
"cp">{
</span><span class=
"nf">page
</span> <span class=
"na">language
</span><span class=
"o">=
</span><span class=
"s1">'de
'</span><span class=
"cp">}
</span><span class=
"x">com.woltlab.wcf.CookiePolicy
</span><span class=
"cp">{
</span><span class=
"nf">/page
</span><span class=
"cp">}
</span><span class=
"x"></span>
3254 <span class=
"cp">{
</span><span class=
"nf">page
</span> <span class=
"na">languageID
</span><span class=
"o">=
</span><span class=
"m">2</span><span class=
"cp">}
</span><span class=
"x">com.woltlab.wcf.CookiePolicy
</span><span class=
"cp">{
</span><span class=
"nf">/page
</span><span class=
"cp">}
</span><span class=
"x"></span>
3261 <th>Description
</th>
3266 <td><code>pageID
</code></td>
3267 <td>unique id of the page (cannot be used together with a page identifier as value)
</td>
3270 <td><code>languageID
</code></td>
3271 <td>id of the page language (cannot be used together with
<code>language
</code>)
</td>
3274 <td><code>language
</code></td>
3275 <td>language code of the page language (cannot be used together with
<code>languageID
</code>)
</td>
3279 <h2 id=
"pages"><code>pages
</code><a class=
"headerlink" href=
"#pages" title=
"Permanent link">#
</a></h2>
3280 <p><code>pages
</code> generates a pagination.
</p>
3281 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3282 <span class=
"normal">2</span>
3283 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">pages
</span> <span class=
"na">controller
</span><span class=
"o">=
</span><span class=
"s1">'FooList
'</span> <span class=
"na">link
</span><span class=
"o">=
</span><span class=
"s2">"pageNo=%d
"</span> <span class=
"na">print
</span><span class=
"o">=
</span><span class=
"kc">true
</span> <span class=
"na">assign
</span><span class=
"o">=
</span><span class=
"na">pagesLinks
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints pagination *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3285 <span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$pagesLinks
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints same pagination again *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3292 <th>Description
</th>
3297 <td><code>assign
</code></td>
3298 <td>optional name of the template variable the pagination is assigned to
</td>
3301 <td><code>controller
</code></td>
3302 <td>controller name of the generated links
</td>
3305 <td><code>link
</code></td>
3306 <td>additional link parameter where
<code>%d
</code> will be replaced with the relevant page number
</td>
3309 <td><code>pages
</code></td>
3310 <td>maximum number of of pages; by default, the template variable
<code>$pages
</code> is used
</td>
3313 <td><code>print
</code></td>
3314 <td>if
<code>false
</code> and
<code>assign=true
</code>, the pagination is not printed
</td>
3317 <td><code>application
</code>,
<code>id
</code>,
<code>object
</code>,
<code>title
</code></td>
3318 <td>additional parameters passed to
<code>LinkHandler::getLink()
</code> to generate page links
</td>
3322 <h2 id=
"plaintime"><code>plainTime
</code><a class=
"headerlink" href=
"#plaintime" title=
"Permanent link">#
</a></h2>
3323 <p><code>plainTime
</code> formats a timestamp to include year, month, day, hour, and minutes.
3324 The exact formatting depends on the current language (via the language items
<code>wcf.date.dateTimeFormat
</code>,
<code>wcf.date.dateFormat
</code>, and
<code>wcf.date.timeFormat
</code>).
</p>
3325 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$timestamp
</span><span class=
"o">|
</span><span class=
"na">plainTime
</span><span class=
"cp">}
</span><span class=
"x"></span>
3328 <h2 id=
"53-plural"><span class=
"label label-info">5.3+
</span> <code>plural
</code><a class=
"headerlink" href=
"#53-plural" title=
"Permanent link">#
</a></h2>
3329 <p><code>plural
</code> allows to easily select the correct plural form of a phrase based on a given
<code>value
</code>.
3330 The pluralization logic follows the
<a href=
"https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_plural_rules.md">Unicode Language Plural Rules
</a> for cardinal numbers.
</p>
3331 <p>The
<code>#
</code> placeholder within the resulting phrase is replaced by the
<code>value
</code>.
3332 It is automatically formatted using
<code>StringUtil::formatNumeric
</code>.
</p>
3334 <p>Note the use of
<code>1</code> if the number (
<code>#
</code>) is not used within the phrase and the use of
<code>one
</code> otherwise.
3335 They are equivalent for English, but following this rule generalizes better to other languages, helping the translator.
3336 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3337 <span class=
"normal">2</span>
3338 <span class=
"normal">3</span>
3339 <span class=
"normal">4</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">numberOfWorlds
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"m">2</span><span class=
"cp">}
</span><span class=
"x"></span>
3340 <span class=
"x"><h1
>Hello
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'World
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'Worlds
'</span><span class=
"cp">}
</span><span class=
"x">!
</h1
></span>
3341 <span class=
"x"><p
>There
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'is one world
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'are # worlds
'</span><span class=
"cp">}
</span><span class=
"x">!
</p
></span>
3342 <span class=
"x"><p
>There
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"na">one
</span><span class=
"o">=
</span><span class=
"s1">'is # world
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'are # worlds
'</span><span class=
"cp">}
</span><span class=
"x">!
</p
></span>
3344 </td></tr></table></p>
3346 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3347 <span class=
"normal">2</span>
3348 <span class=
"normal">3</span>
3349 <span class=
"normal">4</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">numberOfWorlds
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"m">2</span><span class=
"cp">}
</span><span class=
"x"></span>
3350 <span class=
"x"><h1
>Hallo
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'Welt
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'Welten
'</span><span class=
"cp">}
</span><span class=
"x">!
</h1
></span>
3351 <span class=
"x"><p
>Es gibt
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'eine Welt
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'# Welten
'</span><span class=
"cp">}
</span><span class=
"x">!
</p
></span>
3352 <span class=
"x"><p
>Es gibt
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"na">one
</span><span class=
"o">=
</span><span class=
"s1">'# Welt
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'# Welten
'</span><span class=
"cp">}
</span><span class=
"x">!
</p
></span>
3354 </td></tr></table></p>
3356 <p>Note the additional use of
<code>few
</code> which is not required in English or German.
3357 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3358 <span class=
"normal">2</span>
3359 <span class=
"normal">3</span>
3360 <span class=
"normal">4</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">numberOfWorlds
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"m">2</span><span class=
"cp">}
</span><span class=
"x"></span>
3361 <span class=
"x"><h1
>Salut
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'lume
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'lumi
'</span><span class=
"cp">}
</span><span class=
"x">!
</h1
></span>
3362 <span class=
"x"><p
>Există
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'o lume
'</span> <span class=
"na">few
</span><span class=
"o">=
</span><span class=
"s1">'# lumi
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'# de lumi
'</span><span class=
"cp">}
</span><span class=
"x">!
</p
></span>
3363 <span class=
"x"><p
>Există
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"na">one
</span><span class=
"o">=
</span><span class=
"s1">'# lume
'</span> <span class=
"na">few
</span><span class=
"o">=
</span><span class=
"s1">'# lumi
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'# de lumi
'</span><span class=
"cp">}
</span><span class=
"x">!
</p
></span>
3365 </td></tr></table></p>
3367 <p>Note the difference between
<code>1</code> (exactly
<code>1</code>) and
<code>one
</code> (ending in
<code>1</code>, except ending in
<code>11</code>).
3368 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3369 <span class=
"normal">2</span>
3370 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">numberOfWorlds
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"m">2</span><span class=
"cp">}
</span><span class=
"x"></span>
3371 <span class=
"x"><h1
>Привет
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorld
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'мир
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'миры
'</span><span class=
"cp">}
</span><span class=
"x">!
</h1
></span>
3372 <span class=
"x"><p
>Есть
</span><span class=
"cp">{
</span><span class=
"nf">plural
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"nv">$numberOfWorlds
</span> <span class=
"m">1</span><span class=
"o">=
</span><span class=
"s1">'мир
'</span> <span class=
"na">one
</span><span class=
"o">=
</span><span class=
"s1">'# мир
'</span> <span class=
"na">few
</span><span class=
"o">=
</span><span class=
"s1">'# мира
'</span> <span class=
"na">many
</span><span class=
"o">=
</span><span class=
"s1">'# миров
'</span> <span class=
"na">other
</span><span class=
"o">=
</span><span class=
"s1">'# миров
'</span><span class=
"cp">}
</span><span class=
"x">!
</p
></span>
3374 </td></tr></table></p>
3379 <th>Description
</th>
3385 <td>The value that is used to select the proper phrase.
</td>
3389 <td>The phrase that is used when no other selector matches.
</td>
3392 <td>Any Category Name
</td>
3393 <td>The phrase that is used when
<code>value
</code> belongs to the named category. Available categories depend on the language.
</td>
3396 <td>Any Integer
</td>
3397 <td>The phrase that is used when
<code>value
</code> is that exact integer.
</td>
3401 <h2 id=
"prepend"><code>prepend
</code><a class=
"headerlink" href=
"#prepend" title=
"Permanent link">#
</a></h2>
3402 <p>If a string should be prepended to the value of a variable,
<code>prepend
</code> can be used:
</p>
3403 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3404 <span class=
"normal">2</span>
3405 <span class=
"normal">3</span>
3406 <span class=
"normal">4</span>
3407 <span class=
"normal">5</span>
3408 <span class=
"normal">6</span>
3409 <span class=
"normal">7</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">assign
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">templateVariable
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"s1">'newValue
'</span><span class=
"cp">}
</span><span class=
"x"></span>
3411 <span class=
"cp">{
</span><span class=
"nv">$templateVariable
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
'newValue *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3413 <span class=
"cp">{
</span><span class=
"nf">prepend
</span> <span class=
"na">var
</span><span class=
"o">=
</span><span class=
"na">templateVariable
</span> <span class=
"na">value
</span><span class=
"o">=
</span><span class=
"s1">'2'</span><span class=
"cp">}
</span><span class=
"x"></span>
3415 <span class=
"cp">{
</span><span class=
"nv">$templateVariable
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* now prints
'2newValue
' *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3418 <p>If the variables does not exist yet,
<code>prepend
</code> creates a new one with the given value.
3419 If
<code>prepend
</code> is used on an array as the variable, the value is prepended to all elements of the array.
</p>
3420 <h2 id=
"shortunit"><code>shortUnit
</code><a class=
"headerlink" href=
"#shortunit" title=
"Permanent link">#
</a></h2>
3421 <p><code>shortUnit
</code> shortens numbers larger than
1000 by using unit suffixes:
</p>
3422 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3423 <span class=
"normal">2</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"m">10000</span><span class=
"o">|
</span><span class=
"na">shortUnit
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
10k *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3424 <span class=
"cp">{
</span><span class=
"m">5400000</span><span class=
"o">|
</span><span class=
"na">shortUnit
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints
5.4M *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3427 <h2 id=
"smallpages"><code>smallpages
</code><a class=
"headerlink" href=
"#smallpages" title=
"Permanent link">#
</a></h2>
3428 <p><code>smallpages
</code> generates a smaller version of
<code>pages
</code> by using adding the
<code>small
</code> CSS class to the generated
<code><nav
></code> element and only showing
7 instead of
9 links.
</p>
3429 <h2 id=
"tablewordwrap"><code>tableWordwrap
</code><a class=
"headerlink" href=
"#tablewordwrap" title=
"Permanent link">#
</a></h2>
3430 <p><code>tableWordwrap
</code> inserts zero width spaces every
30 characters in words longer than
30 characters.
</p>
3431 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$foo
</span><span class=
"o">|
</span><span class=
"na">tableWordwrap
</span><span class=
"cp">}
</span><span class=
"x"></span>
3434 <h2 id=
"time"><code>time
</code><a class=
"headerlink" href=
"#time" title=
"Permanent link">#
</a></h2>
3435 <p><code>time
</code> generates an HTML
<code>time
</code> elements based on a timestamp that shows a relative time or the absolute time if the timestamp more than six days ago.
</p>
3436 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$timestamp
</span><span class=
"o">|
</span><span class=
"na">time
</span><span class=
"cp">}
</span><span class=
"x"> </span><span class=
"cp">{
</span><span class=
"c">* prints a
'<time
>' element *
</span><span class=
"cp">}
</span><span class=
"x"></span>
3439 <h2 id=
"truncate"><code>truncate
</code><a class=
"headerlink" href=
"#truncate" title=
"Permanent link">#
</a></h2>
3440 <p><code>truncate
</code> truncates a long string into a shorter one:
</p>
3441 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span>
3442 <span class=
"normal">2</span>
3443 <span class=
"normal">3</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nv">$foo
</span><span class=
"o">|
</span><span class=
"na">truncate
</span><span class=
"o">:
</span><span class=
"m">35</span><span class=
"cp">}
</span><span class=
"x"></span>
3445 <span class=
"cp">{
</span><span class=
"nv">$foo
</span><span class=
"o">|
</span><span class=
"na">truncate
</span><span class=
"o">:
</span><span class=
"m">35</span><span class=
"o">:
</span><span class=
"s1">'_
'</span><span class=
"o">:
</span><span class=
"kc">true
</span><span class=
"cp">}
</span><span class=
"x"></span>
3451 <th>Parameter Number
</th>
3452 <th>Description
</th>
3458 <td>truncated string
</td>
3462 <td>truncated length;
<code>80</code> by default
</td>
3466 <td>ellipsis symbol;
<code>wcf\util\StringUtil::HELLIP
</code> by default
</td>
3470 <td>if
<code>true
</code>, words can be broken up in the middle;
<code>false
</code> by default
</td>
3474 <h2 id=
"53-user"><span class=
"label label-info">5.3+
</span> <code>user
</code><a class=
"headerlink" href=
"#53-user" title=
"Permanent link">#
</a></h2>
3475 <p><code>user
</code> generates links to user profiles.
3476 The mandatory
<code>object
</code> parameter requires an instances of
<code>UserProfile
</code>.
3477 The optional
<code>type
</code> parameter is responsible for what the generated link contains:
</p>
3479 <li><code>type='default'
</code> (also applies if no
<code>type
</code> is given) outputs the formatted username relying on the “User Marking” setting of the relevant user group.
3480 Additionally, the user popover card will be shown when hovering over the generated link.
</li>
3481 <li><code>type='plain'
</code> outputs the username without additional formatting.
</li>
3482 <li><code>type='avatar(\d+)'
</code> outputs the user’s avatar in the specified size, i.e.,
<code>avatar48
</code> outputs the avatar with a width and height of
48 pixels.
</li>
3484 <p>The last special attribute is
<code>append
</code> whose contents are appended to the
<code>href
</code> attribute of the generated anchor element.
</p>
3485 <p>All of the other attributes matching
<code>~^[a-z]+([A-z]+)+$~
</code>, except for
<code>href
</code> which may not be added, are added as attributes to the anchor element.
</p>
3487 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">user
</span> <span class=
"na">object
</span><span class=
"o">=
</span><span class=
"nv">$user
</span><span class=
"cp">}
</span><span class=
"x"></span>
3491 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><a href=
"</span><span class=
"cp">{
</span><span class=
"nv">$user
</span><span class=
"o">-
></span><span class=
"na">getLink
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x">" data-object-id=
"</span><span class=
"cp">{
</span><span class=
"nv">$user
</span><span class=
"o">-
></span><span class=
"na">userID
</span><span class=
"cp">}
</span><span class=
"x">" class=
"userLink
"></span><span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$user
</span><span class=
"o">-
></span><span class=
"na">getFormattedUsername
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x"></a
></span>
3495 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"cp">{
</span><span class=
"nf">user
</span> <span class=
"na">object
</span><span class=
"o">=
</span><span class=
"nv">$user
</span> <span class=
"na">type
</span><span class=
"o">=
</span><span class=
"s1">'avatar48
'</span> <span class=
"na">foo
</span><span class=
"o">=
</span><span class=
"s1">'bar
'</span><span class=
"cp">}
</span><span class=
"x"></span>
3499 <table class=
"highlighttable"><tr><td class=
"linenos"><div class=
"linenodiv"><pre><span></span><span class=
"normal">1</span></pre></div></td><td class=
"code"><div class=
"highlight"><pre><span></span><code><span class=
"x"><a href=
"</span><span class=
"cp">{
</span><span class=
"nv">$user
</span><span class=
"o">-
></span><span class=
"na">getLink
</span><span class=
"o">()
</span><span class=
"cp">}
</span><span class=
"x">" foo=
"bar
"></span><span class=
"cp">{
</span><span class=
"o">@
</span><span class=
"nv">$object
</span><span class=
"o">-
></span><span class=
"na">getAvatar
</span><span class=
"o">()-
></span><span class=
"na">getImageTag
</span><span class=
"o">(
</span><span class=
"m">48</span><span class=
"o">)
</span><span class=
"cp">}
</span><span class=
"x"></a
></span>
3507 <div class=
"md-source-date">
3510 Last update:
2021-
04-
20
3529 <footer class=
"md-footer">
3531 <nav class=
"md-footer__inner md-grid" aria-label=
"Footer">
3533 <a href=
"../templates/" class=
"md-footer__link md-footer__link--prev" rel=
"prev">
3534 <div class=
"md-footer__button md-icon">
3535 <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>
3537 <div class=
"md-footer__title">
3538 <div class=
"md-ellipsis">
3539 <span class=
"md-footer__direction">
3548 <a href=
"../css/" class=
"md-footer__link md-footer__link--next" rel=
"next">
3549 <div class=
"md-footer__title">
3550 <div class=
"md-ellipsis">
3551 <span class=
"md-footer__direction">
3557 <div class=
"md-footer__button md-icon">
3558 <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>
3564 <div class=
"md-footer-meta md-typeset">
3565 <div class=
"md-footer-meta__inner md-grid">
3566 <div class=
"md-footer-copyright">
3568 <div class=
"md-footer-copyright__highlight">
3569 Copyright ©
2020 WoltLab GmbH
3573 <a href=
"https://squidfunk.github.io/mkdocs-material/" target=
"_blank" rel=
"noopener">
3578 <div class=
"md-footer-copyright">
3579 <a href=
"https://www.woltlab.com/legal-notice/">Legal Notice
</a>
3580 <a href=
"https://www.woltlab.com/privacy-policy/">Privacy Policy
</a>
3587 <div class=
"md-dialog" data-md-component=
"dialog">
3588 <div class=
"md-dialog__inner md-typeset"></div>
3590 <script id=
"__config" type=
"application/json">{
"base":
"../..",
"features": [],
"translations": {
"clipboard.copy":
"Copy to clipboard",
"clipboard.copied":
"Copied to clipboard",
"search.config.lang":
"en",
"search.config.pipeline":
"trimmer, stopWordFilter",
"search.config.separator":
"[\\s\\-]+",
"search.placeholder":
"Search",
"search.result.placeholder":
"Type to start searching",
"search.result.none":
"No matching documents",
"search.result.one":
"1 matching document",
"search.result.other":
"# matching documents",
"search.result.more.one":
"1 more on this page",
"search.result.more.other":
"# more on this page",
"search.result.term.missing":
"Missing"},
"search":
"../../assets/javascripts/workers/search.fe42c31b.min.js",
"version": {
"provider":
"mike"}}
</script>
3593 <script src=
"../../assets/javascripts/bundle.4ea5477f.min.js"></script>