Deployed 9d0acbd to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / 5.3 / view_template-plugins.html
1 <!DOCTYPE html>
2 <head>
3 <meta charset="utf-8">
4 <meta http-equiv="X-UA-Compatible" content="IE=edge">
5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 <meta name="description" content="">
7 <meta name="keywords" content=" ">
8 <title>Template Plugins | WoltLab Suite 5.3 Documentation</title>
9
10 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/syntax.css">
11 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,300,600">
12 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/font-awesome.min.css">
13 <!--<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">-->
14 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/modern-business.css">
15 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/lavish-bootstrap.css">
16 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/customstyles.css">
17 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/theme-blue.css?v=3">
18
19 <script src="https://docs.woltlab.com/5.3/js/jquery.min.js"></script>
20 <script src="https://docs.woltlab.com/5.3/js/jquery.cookie.min.js"></script>
21 <script src="https://docs.woltlab.com/5.3/js/jquery.navgoco.min.js"></script>
22 <script src="https://docs.woltlab.com/5.3/js/bootstrap.min.js"></script>
23 <script src="https://docs.woltlab.com/5.3/js/anchor.min.js"></script>
24 <script src="https://docs.woltlab.com/5.3/js/toc.js"></script>
25 <script src="https://docs.woltlab.com/5.3/js/customscripts.js"></script>
26
27 <link rel="shortcut icon" href="https://docs.woltlab.com/5.3/images/favicon.ico">
28
29 <link rel="alternate" type="application/rss+xml" title="woltlab.github.io" href="https://docs.woltlab.com/5.3feed.xml">
30
31 <script>
32 $(document).ready(function() {
33 // Initialize navgoco with default options
34 $("#mysidebar").navgoco({
35 caretHtml: '',
36 accordion: true,
37 openClass: 'active', // open
38 save: false, // leave false or nav highlighting doesn't work right
39 cookie: {
40 name: 'navgoco',
41 expires: false,
42 path: '/'
43 },
44 slide: {
45 duration: 400,
46 easing: 'swing'
47 }
48 });
49
50 $("#collapseAll").click(function(e) {
51 e.preventDefault();
52 $("#mysidebar").navgoco('toggle', false);
53 });
54
55 $("#expandAll").click(function(e) {
56 e.preventDefault();
57 $("#mysidebar").navgoco('toggle', true);
58 });
59
60 });
61
62 </script>
63 <script>
64 $(function () {
65 $('[data-toggle="tooltip"]').tooltip()
66 })
67 </script>
68
69
70 </head>
71 <body>
72 <!-- Navigation -->
73 <nav class="navbar navbar-inverse navbar-fixed-top">
74 <div class="container topnavlinks">
75 <div class="navbar-header">
76 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
77 <span class="sr-only">Toggle navigation</span>
78 <span class="icon-bar"></span>
79 <span class="icon-bar"></span>
80 <span class="icon-bar"></span>
81 </button>
82 <a class="fa fa-home fa-lg navbar-brand" href="index.html">&nbsp;<span class="projectTitle"> WoltLab Suite 5.3 Documentation</span></a>
83 </div>
84 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
85 <ul class="nav navbar-nav navbar-right">
86 <!-- entries without drop-downs appear here -->
87
88
89
90 <li><a href="https://www.woltlab.com" target="_blank">woltlab.com</a></li>
91
92
93
94
95
96 <li><a href="https://github.com/WoltLab/WCF/" target="_blank">Code on github.com</a></li>
97
98
99
100 <!-- entries with drop-downs appear here -->
101 <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
102
103
104 <!--comment out this block if you want to hide search-->
105 <li>
106 <!--start search-->
107 <div id="search-demo-container">
108 <input type="text" id="search-input" placeholder="search...">
109 <ul id="results-container"></ul>
110 </div>
111 <script src="https://docs.woltlab.com/5.3/js/jekyll-search.js" type="text/javascript"></script>
112 <script type="text/javascript">
113 SimpleJekyllSearch.init({
114 searchInput: document.getElementById('search-input'),
115 resultsContainer: document.getElementById('results-container'),
116 dataSource: 'https://docs.woltlab.com/5.3/search.json',
117 searchResultTemplate: '<li><a href="{url}" title="Template Plugins">{title}</a></li>',
118 noResultsText: 'No results found.',
119 limit: 10,
120 fuzzy: true,
121 })
122 </script>
123 <!--end search-->
124 </li>
125 </ul>
126 </div>
127 </div>
128 <!-- /.container -->
129 </nav>
130
131
132 <div class="container">
133 <div class="col-lg-12">&nbsp;</div>
134
135 <div class="row">
136 <div class="col-md-3">
137
138
139
140 <ul id="mysidebar" class="nav">
141 <li class="sidebarTitle">WoltLab Suite 5.3</li>
142
143
144
145 <li>
146 <a href="#">Getting Started</a>
147 <ul>
148
149
150
151
152 <li data-identifier="index"><a href="index.html">Introduction</a></li>
153
154
155
156
157
158
159
160
161 <li data-identifier="getting-started_quick-start"><a href="getting-started_quick-start.html">Quick Start</a></li>
162
163
164
165
166
167 </ul>
168 </li>
169
170 <li>
171 <a href="#">PHP API</a>
172 <ul>
173
174
175
176
177 <li data-identifier="php_pages"><a href="php_pages.html">Pages</a></li>
178
179
180
181
182
183
184
185
186 <li data-identifier="php_database-objects"><a href="php_database-objects.html">Database Objects</a></li>
187
188
189
190
191
192
193
194
195 <li data-identifier="php_database-access"><a href="php_database-access.html">Database Access</a></li>
196
197
198
199
200
201
202
203
204 <li data-identifier="php_exceptions"><a href="php_exceptions.html">Exceptions</a></li>
205
206
207
208
209
210
211
212
213 <li class="subfolders">
214 <a href="#">API</a>
215 <ul>
216
217
218
219 <li data-identifier="php_api_caches"><a href="php_api_caches.html">Caches</a></li>
220
221
222
223
224 <li data-identifier="php_api_comments"><a href="php_api_comments.html">Comments</a></li>
225
226
227
228
229 <li data-identifier="php_api_cronjobs"><a href="php_api_cronjobs.html">Cronjobs</a></li>
230
231
232
233
234 <li data-identifier="php_api_events"><a href="php_api_events.html">Events</a></li>
235
236
237
238
239 <li data-identifier="php_api_form_builder"><a href="php_api_form_builder.html">Form Builder</a></li>
240
241
242
243
244 <li data-identifier="php_api_package_installation_plugins"><a href="php_api_package_installation_plugins.html">Package Installation Plugins</a></li>
245
246
247
248
249 <li data-identifier="php_api_user_activity_points"><a href="php_api_user_activity_points.html">User Activity Points</a></li>
250
251
252
253
254 <li data-identifier="php_api_user_notifications"><a href="php_api_user_notifications.html">User Notifications</a></li>
255
256
257
258
259 <li data-identifier="php_api_sitemaps"><a href="php_api_sitemaps.html">Sitemaps</a></li>
260
261
262 </ul>
263 </li>
264
265
266
267
268
269 <li data-identifier="php_code-style"><a href="php_code-style.html">Code Style</a></li>
270
271
272
273
274
275
276
277
278 <li data-identifier="php_apps"><a href="php_apps.html">Apps</a></li>
279
280
281
282
283
284
285
286
287 <li data-identifier="php_gdpr"><a href="php_gdpr.html">GDPR</a></li>
288
289
290
291
292
293 </ul>
294 </li>
295
296 <li>
297 <a href="#">Languages, Templates & CSS</a>
298 <ul>
299
300
301
302
303 <li data-identifier="view_languages"><a href="view_languages.html">Languages</a></li>
304
305
306
307
308
309
310
311
312 <li data-identifier="view_templates"><a href="view_templates.html">Templates</a></li>
313
314
315
316
317
318
319
320
321 <li data-identifier="view_css"><a href="view_css.html">CSS</a></li>
322
323
324
325
326
327 </ul>
328 </li>
329
330 <li>
331 <a href="#">JavaScript API</a>
332 <ul>
333
334
335
336
337 <li data-identifier="javascript_general-usage"><a href="javascript_general-usage.html">General Usage</a></li>
338
339
340
341
342
343
344
345
346 <li class="subfolders">
347 <a href="#">New API</a>
348 <ul>
349
350
351
352 <li data-identifier="javascript_new-api_writing-a-module"><a href="javascript_new-api_writing-a-module.html">Writing a module</a></li>
353
354
355
356
357 <li data-identifier="javascript_new-api_data-structures"><a href="javascript_new-api_data-structures.html">Data Structures</a></li>
358
359
360
361
362 <li data-identifier="javascript_new-api_core"><a href="javascript_new-api_core.html">Core Functions</a></li>
363
364
365
366
367 <li data-identifier="javascript_new-api_dom"><a href="javascript_new-api_dom.html">DOM</a></li>
368
369
370
371
372 <li data-identifier="javascript_new-api_events"><a href="javascript_new-api_events.html">Event Handling</a></li>
373
374
375
376
377 <li data-identifier="javascript_new-api_ajax"><a href="javascript_new-api_ajax.html">Ajax</a></li>
378
379
380
381
382 <li data-identifier="javascript_new-api_dialogs"><a href="javascript_new-api_dialogs.html">Dialogs</a></li>
383
384
385
386
387 <li data-identifier="javascript_new-api_browser"><a href="javascript_new-api_browser.html">Browser and Screen Sizes</a></li>
388
389
390
391
392 <li data-identifier="javascript_new-api_ui"><a href="javascript_new-api_ui.html">User Interface</a></li>
393
394
395 </ul>
396 </li>
397
398
399
400
401
402 <li data-identifier="javascript_legacy-api"><a href="javascript_legacy-api.html">Legacy API</a></li>
403
404
405
406
407
408
409
410
411 <li data-identifier="javascript_helper-functions"><a href="javascript_helper-functions.html">Helper Functions</a></li>
412
413
414
415
416
417
418
419
420 <li data-identifier="javascript_code-snippets"><a href="javascript_code-snippets.html">Code Snippets</a></li>
421
422
423
424
425
426 </ul>
427 </li>
428
429 <li>
430 <a href="#">Package Components</a>
431 <ul>
432
433
434
435
436 <li data-identifier="package_package-xml"><a href="package_package-xml.html">package.xml</a></li>
437
438
439
440
441
442
443
444
445 <li data-identifier="package_pip"><a href="package_pip.html">PIPs</a></li>
446
447
448
449
450
451 </ul>
452 </li>
453
454 <li>
455 <a href="#">Migration</a>
456 <ul>
457
458
459
460
461 <li class="subfolders">
462 <a href="#">Migrating from WSC 5.2</a>
463 <ul>
464
465
466
467 <li data-identifier="migration_wsc-52_php"><a href="migration_wsc-52_php.html">PHP API</a></li>
468
469
470
471
472 <li data-identifier="migration_wsc-52_templates"><a href="migration_wsc-52_templates.html">Templates and Languages</a></li>
473
474
475
476
477 <li data-identifier="migration_wsc-52_libraries"><a href="migration_wsc-52_libraries.html">Third Party Libraries</a></li>
478
479
480 </ul>
481 </li>
482
483 <li class="subfolders">
484 <a href="#">Migrating from WSC 3.1</a>
485 <ul>
486
487
488
489 <li data-identifier="migration_wsc-31_php"><a href="migration_wsc-31_php.html">PHP API</a></li>
490
491
492 </ul>
493 </li>
494
495 <li class="subfolders">
496 <a href="#">Migrating from WSC 3.0</a>
497 <ul>
498
499
500
501 <li data-identifier="migration_wsc-30_php"><a href="migration_wsc-30_php.html">PHP API</a></li>
502
503
504
505
506 <li data-identifier="migration_wsc-30_javascript"><a href="migration_wsc-30_javascript.html">JavaScript API</a></li>
507
508
509
510
511 <li data-identifier="migration_wsc-30_templates"><a href="migration_wsc-30_templates.html">Templates</a></li>
512
513
514
515
516 <li data-identifier="migration_wsc-30_css"><a href="migration_wsc-30_css.html">CSS</a></li>
517
518
519
520
521 <li data-identifier="migration_wsc-30_package"><a href="migration_wsc-30_package.html">Package Components</a></li>
522
523
524 </ul>
525 </li>
526
527 <li class="subfolders">
528 <a href="#">Migrating from WCF 2.1</a>
529 <ul>
530
531
532
533 <li data-identifier="migration_wcf-21_php"><a href="migration_wcf-21_php.html">PHP API</a></li>
534
535
536
537
538 <li data-identifier="migration_wcf-21_templates"><a href="migration_wcf-21_templates.html">Templates</a></li>
539
540
541
542
543 <li data-identifier="migration_wcf-21_css"><a href="migration_wcf-21_css.html">CSS</a></li>
544
545
546
547
548 <li data-identifier="migration_wcf-21_package"><a href="migration_wcf-21_package.html">Package Components</a></li>
549
550
551 </ul>
552 </li>
553
554
555 </ul>
556 </li>
557
558 <li>
559 <a href="#">Tutorials</a>
560 <ul>
561
562
563
564
565 <li data-identifier="tutorial_tutorial-series"><a href="tutorial_tutorial-series.html">Tutorial Series</a></li>
566
567
568
569
570
571 </ul>
572 </li>
573
574
575 </ul>
576
577 <script>
578 (function() {
579 var sidebar = $('#mysidebar');
580 var item = sidebar.find('.active');
581 if (item.length === 0) {
582 var parent = 'view_templates';
583 if (parent) {
584 sidebar.find('li[data-identifier="' + parent + '"]').addClass('active');
585 }
586 }
587
588 sidebar.find(".active").parents('li').toggleClass("active");
589 })();
590 </script>
591
592 </div>
593
594 <div class="col-md-9">
595 <div class="post-header">
596 <h1 class="post-title-main">Template Plugins</h1>
597 </div>
598
599
600
601 <div class="post-content">
602
603
604
605
606
607 <!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. -->
608 <script>
609 $( document ).ready(function() {
610 // Handler for .ready() called.
611
612 $('#toc').toc({ minimumHeaders: 0, listType: 'ul', showSpeed: 0, headers: 'h2,h3,h4' });
613
614 /* this offset helps account for the space taken up by the floating toolbar. */
615 $('#toc').on('click', 'a', function() {
616 var target = $(this.getAttribute('href'))
617 , scroll_target = target.offset().top
618
619 $(window).scrollTop(scroll_target - 10);
620 return false
621 })
622
623 });
624 </script>
625
626 <div id="toc"></div>
627
628
629
630 <h2 id="53-anchor"><span class="label label-info">5.3+</span> <code class="language-plaintext highlighter-rouge">anchor</code></h2>
631
632 <p>The <code class="language-plaintext highlighter-rouge">anchor</code> template plugin creates <code class="language-plaintext highlighter-rouge">a</code> HTML elements.
633 The easiest way to use the template plugin is to pass it an instance of <code class="language-plaintext highlighter-rouge">ITitledLinkObject</code>:</p>
634
635 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">anchor</span> <span class="na">object</span><span class="o">=</span><span class="nv">$object</span><span class="k">}</span>
636 </code></pre></div></div>
637
638 <p>generates the same output as</p>
639
640 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"</span><span class="k">{</span><span class="nv">$object</span><span class="o">-&gt;</span><span class="na">getLink</span><span class="o">()</span><span class="k">}</span><span class="s">"</span><span class="nt">&gt;</span><span class="k">{</span><span class="nv">$object</span><span class="o">-&gt;</span><span class="na">getTitle</span><span class="o">()</span><span class="k">}</span><span class="nt">&lt;/a&gt;</span>
641 </code></pre></div></div>
642
643 <p>Instead of an <code class="language-plaintext highlighter-rouge">object</code> parameter, a <code class="language-plaintext highlighter-rouge">link</code> and <code class="language-plaintext highlighter-rouge">content</code> parameter can be used:</p>
644
645 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}</span>
646 </code></pre></div></div>
647
648 <p>where <code class="language-plaintext highlighter-rouge">$linkObject</code> implements <code class="language-plaintext highlighter-rouge">ILinkableObject</code> and <code class="language-plaintext highlighter-rouge">$content</code> is either an object implementing <code class="language-plaintext highlighter-rouge">ITitledObject</code> or having a <code class="language-plaintext highlighter-rouge">__toString()</code> method or <code class="language-plaintext highlighter-rouge">$content</code> is a string or a number.</p>
649
650 <p>The last special attribute is <code class="language-plaintext highlighter-rouge">append</code> whose contents are appended to the <code class="language-plaintext highlighter-rouge">href</code> attribute of the generated anchor element.</p>
651
652 <p>All of the other attributes matching <code class="language-plaintext highlighter-rouge">~^[a-z]+([A-z]+)+$~</code>, expect for <code class="language-plaintext highlighter-rouge">href</code> which is disallowed, are added as attributes to the anchor element.</p>
653
654 <p>If an <code class="language-plaintext highlighter-rouge">object</code> attribute is present, the object also implements <code class="language-plaintext highlighter-rouge">IPopoverObject</code> and if the return value of <code class="language-plaintext highlighter-rouge">IPopoverObject::getPopoverLinkClass()</code> is included in the <code class="language-plaintext highlighter-rouge">class</code> attribute of the <code class="language-plaintext highlighter-rouge">anchor</code> tag, <code class="language-plaintext highlighter-rouge">data-object-id</code> is automatically added.
655 This functionality makes it easy to generate links with popover support.
656 Instead of</p>
657
658 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"</span><span class="k">{</span><span class="nv">$entry</span><span class="o">-&gt;</span><span class="na">getLink</span><span class="o">()</span><span class="k">}</span><span class="s">"</span> <span class="na">class=</span><span class="s">"blogEntryLink"</span> <span class="na">data-object-id=</span><span class="s">"{@$entry-&gt;entryID}"</span><span class="nt">&gt;</span><span class="k">{</span><span class="nv">$entry</span><span class="o">-&gt;</span><span class="na">subject</span><span class="k">}</span><span class="nt">&lt;/a&gt;</span>
659 </code></pre></div></div>
660
661 <p>using</p>
662
663 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}</span>
664 </code></pre></div></div>
665
666 <p>is sufficient if <code class="language-plaintext highlighter-rouge">Entry::getPopoverLinkClass()</code> returns <code class="language-plaintext highlighter-rouge">blogEntryLink</code>.</p>
667
668 <h2 id="53-anchorattributes"><span class="label label-info">5.3+</span> <code class="language-plaintext highlighter-rouge">anchorAttributes</code></h2>
669
670 <p><code class="language-plaintext highlighter-rouge">anchorAttributes</code> compliments the <code class="language-plaintext highlighter-rouge">StringUtil::getAnchorTagAttributes(string, bool): string</code> method.
671 It allows to easily generate the necessary attributes for an anchor tag based off the destination URL.</p>
672
673 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"https://www.example.com"</span> <span class="k">{</span><span class="na">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="k">}</span><span class="nt">&gt;</span>
674 </code></pre></div></div>
675
676 <table>
677 <thead>
678 <tr>
679 <th>Attribute</th>
680 <th>Description</th>
681 </tr>
682 </thead>
683 <tbody>
684 <tr>
685 <td><code class="language-plaintext highlighter-rouge">url</code></td>
686 <td>destination URL</td>
687 </tr>
688 <tr>
689 <td><code class="language-plaintext highlighter-rouge">appendHref</code></td>
690 <td>whether the <code class="language-plaintext highlighter-rouge">href</code> attribute should be generated; <code class="language-plaintext highlighter-rouge">true</code> by default</td>
691 </tr>
692 <tr>
693 <td><code class="language-plaintext highlighter-rouge">isUgc</code></td>
694 <td>whether the <code class="language-plaintext highlighter-rouge">rel="ugc"</code> attribute should be generated; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
695 </tr>
696 <tr>
697 <td><code class="language-plaintext highlighter-rouge">appendClassname</code></td>
698 <td>whether the <code class="language-plaintext highlighter-rouge">class="externalURL"</code> attribute should be generated; <code class="language-plaintext highlighter-rouge">true</code> by default</td>
699 </tr>
700 </tbody>
701 </table>
702
703 <h2 id="append"><code class="language-plaintext highlighter-rouge">append</code></h2>
704
705 <p>If a string should be appended to the value of a variable, <code class="language-plaintext highlighter-rouge">append</code> can be used:</p>
706
707 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
708
709 <span class="k">{</span><span class="nv">$templateVariable</span><span class="k">}</span> <span class="c">{* prints 'newValue *}</span>
710
711 <span class="k">{</span><span class="nb">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="k">}</span>
712
713 <span class="k">{</span><span class="nv">$templateVariable</span><span class="k">}</span> <span class="c">{* now prints 'newValue2 *}</span>
714 </code></pre></div></div>
715
716 <p>If the variables does not exist yet, <code class="language-plaintext highlighter-rouge">append</code> creates a new one with the given value.
717 If <code class="language-plaintext highlighter-rouge">append</code> is used on an array as the variable, the value is appended to all elements of the array.</p>
718
719 <h2 id="assign"><code class="language-plaintext highlighter-rouge">assign</code></h2>
720
721 <p>New template variables can be declared and new values can be assigned to existing template variables using <code class="language-plaintext highlighter-rouge">assign</code>:</p>
722
723 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
724
725 <span class="k">{</span><span class="nv">$templateVariable</span><span class="k">}</span> <span class="c">{* prints 'newValue *}</span>
726 </code></pre></div></div>
727
728 <h2 id="capture"><code class="language-plaintext highlighter-rouge">capture</code></h2>
729
730 <p>In some situations, <code class="language-plaintext highlighter-rouge">assign</code> is not sufficient to assign values to variables in templates if the value is complex.
731 Instead, <code class="language-plaintext highlighter-rouge">capture</code> can be used:</p>
732
733 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">capture</span> <span class="na">var</span><span class="o">=</span><span class="na">templateVariable</span><span class="k">}</span>
734 <span class="k">{</span><span class="nb">if</span> <span class="nv">$foo</span><span class="k">}</span>
735 <span class="nt">&lt;p&gt;</span><span class="k">{</span><span class="nv">$bar</span><span class="k">}</span><span class="nt">&lt;/p&gt;</span>
736 <span class="k">{</span><span class="nb">else</span><span class="k">}</span>
737 <span class="nt">&lt;small&gt;</span><span class="k">{</span><span class="nv">$baz</span><span class="k">}</span><span class="nt">&lt;/small&gt;</span>
738 <span class="k">{/</span><span class="nb">if</span><span class="k">}</span>
739 <span class="k">{/</span><span class="nb">capture</span><span class="k">}</span>
740 </code></pre></div></div>
741
742 <h2 id="concat"><code class="language-plaintext highlighter-rouge">concat</code></h2>
743
744 <p><code class="language-plaintext highlighter-rouge">concat</code> is a modifier used to concatenate multiple strings:</p>
745
746 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
747
748 <span class="k">{</span><span class="nb">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="k">}</span>
749
750 <span class="k">{</span><span class="nv">$templateVariable</span><span class="k">}</span> <span class="c">{* prints 'foobar *}</span>
751 </code></pre></div></div>
752
753 <h2 id="counter"><code class="language-plaintext highlighter-rouge">counter</code></h2>
754
755 <p><code class="language-plaintext highlighter-rouge">counter</code> can be used to generate and optionally print a counter:</p>
756
757 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span> <span class="c">{* prints '1' *}</span>
758
759 <span class="k">{</span><span class="nb">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="k">}</span> <span class="c">{* prints '2' now *}</span>
760
761 <span class="k">{</span><span class="nb">counter</span> <span class="na">name</span><span class="o">=</span><span class="na">fooCounter</span><span class="k">}</span> <span class="c">{* prints nothing, but counter value is '3' now internally *}</span>
762
763 <span class="k">{</span><span class="nb">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="k">}</span> <span class="c">{* prints '4' *}</span>
764 </code></pre></div></div>
765
766 <p>Counter supports the following attributes:</p>
767
768 <table>
769 <thead>
770 <tr>
771 <th>Attribute</th>
772 <th>Description</th>
773 </tr>
774 </thead>
775 <tbody>
776 <tr>
777 <td><code class="language-plaintext highlighter-rouge">assign</code></td>
778 <td>optional name of the template variable the current counter value is assigned to</td>
779 </tr>
780 <tr>
781 <td><code class="language-plaintext highlighter-rouge">direction</code></td>
782 <td>counting direction, either <code class="language-plaintext highlighter-rouge">up</code> or <code class="language-plaintext highlighter-rouge">down</code>; <code class="language-plaintext highlighter-rouge">up</code> by default</td>
783 </tr>
784 <tr>
785 <td><code class="language-plaintext highlighter-rouge">name</code></td>
786 <td>name of the counter, relevant if multiple counters are used simultaneously</td>
787 </tr>
788 <tr>
789 <td><code class="language-plaintext highlighter-rouge">print</code></td>
790 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the current counter value is printed; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
791 </tr>
792 <tr>
793 <td><code class="language-plaintext highlighter-rouge">skip</code></td>
794 <td>positive counting increment; <code class="language-plaintext highlighter-rouge">1</code> by default</td>
795 </tr>
796 <tr>
797 <td><code class="language-plaintext highlighter-rouge">start</code></td>
798 <td>start counter value; <code class="language-plaintext highlighter-rouge">1</code> by default</td>
799 </tr>
800 </tbody>
801 </table>
802
803 <h2 id="currency"><code class="language-plaintext highlighter-rouge">currency</code></h2>
804
805 <p><code class="language-plaintext highlighter-rouge">currency</code> is a modifier used to format currency values with two decimals using language dependent thousands separators and decimal point:</p>
806
807 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
808
809 <span class="k">{</span><span class="nv">$currencyValue</span><span class="o">|</span><span class="na">currency</span><span class="k">}</span> <span class="c">{* prints '12.34' *}</span>
810 </code></pre></div></div>
811
812 <h2 id="cycle"><code class="language-plaintext highlighter-rouge">cycle</code></h2>
813
814 <p><code class="language-plaintext highlighter-rouge">cycle</code> can be used to cycle between different values:</p>
815
816 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span> <span class="c">{* prints 'bar' *}</span>
817
818 <span class="k">{</span><span class="nb">cycle</span> <span class="na">name</span><span class="o">=</span><span class="na">fooCycle</span><span class="k">}</span> <span class="c">{* prints 'baz' *}</span>
819
820 <span class="k">{</span><span class="nb">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="k">}</span> <span class="c">{* prints 'baz' again *}</span>
821
822 <span class="k">{</span><span class="nb">cycle</span> <span class="na">name</span><span class="o">=</span><span class="na">fooCycle</span><span class="k">}</span> <span class="c">{* prints 'bar' *}</span>
823 </code></pre></div></div>
824
825 <div class="bs-callout bs-callout-info">The values attribute only has to be present for the first call. If <code class="language-plaintext highlighter-rouge">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.</div>
826
827 <table>
828 <thead>
829 <tr>
830 <th>Attribute</th>
831 <th>Description</th>
832 </tr>
833 </thead>
834 <tbody>
835 <tr>
836 <td><code class="language-plaintext highlighter-rouge">advance</code></td>
837 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the current cycle value is advanced to the next value; <code class="language-plaintext highlighter-rouge">true</code> by default</td>
838 </tr>
839 <tr>
840 <td><code class="language-plaintext highlighter-rouge">assign</code></td>
841 <td>optional name of the template variable the current cycle value is assigned to; if used, <code class="language-plaintext highlighter-rouge">print</code> is set to <code class="language-plaintext highlighter-rouge">false</code></td>
842 </tr>
843 <tr>
844 <td><code class="language-plaintext highlighter-rouge">delimiter</code></td>
845 <td>delimiter between the different cycle values; <code class="language-plaintext highlighter-rouge">,</code> by default</td>
846 </tr>
847 <tr>
848 <td><code class="language-plaintext highlighter-rouge">name</code></td>
849 <td>name of the cycle, relevant if multiple cycles are used simultaneously</td>
850 </tr>
851 <tr>
852 <td><code class="language-plaintext highlighter-rouge">print</code></td>
853 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the current cycle value is printed, <code class="language-plaintext highlighter-rouge">false</code> by default</td>
854 </tr>
855 <tr>
856 <td><code class="language-plaintext highlighter-rouge">reset</code></td>
857 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the current cycle value is set to the first value, <code class="language-plaintext highlighter-rouge">false</code> by default</td>
858 </tr>
859 <tr>
860 <td><code class="language-plaintext highlighter-rouge">values</code></td>
861 <td>string containing the different cycles values, also see <code class="language-plaintext highlighter-rouge">delimiter</code></td>
862 </tr>
863 </tbody>
864 </table>
865
866 <h2 id="date"><code class="language-plaintext highlighter-rouge">date</code></h2>
867
868 <p><code class="language-plaintext highlighter-rouge">date</code> generated a formatted date using <code class="language-plaintext highlighter-rouge">wcf\util\DateUtil::format()</code> with <code class="language-plaintext highlighter-rouge">DateUtil::DATE_FORMAT</code> internally.</p>
869
870 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$timestamp</span><span class="o">|</span><span class="na">date</span><span class="k">}</span>
871 </code></pre></div></div>
872
873 <h2 id="31-dateinterval"><span class="label label-info">3.1+</span> <code class="language-plaintext highlighter-rouge">dateInterval</code></h2>
874
875 <p><code class="language-plaintext highlighter-rouge">dateInterval</code> calculates the difference between two unix timestamps and generated a textual date interval.</p>
876
877 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}</span>
878 </code></pre></div></div>
879
880 <table>
881 <thead>
882 <tr>
883 <th>Attribute</th>
884 <th>Description</th>
885 </tr>
886 </thead>
887 <tbody>
888 <tr>
889 <td><code class="language-plaintext highlighter-rouge">end</code></td>
890 <td>end of the time interval; current timestamp by default (though either <code class="language-plaintext highlighter-rouge">start</code> or <code class="language-plaintext highlighter-rouge">end</code> has to be set)</td>
891 </tr>
892 <tr>
893 <td><code class="language-plaintext highlighter-rouge">format</code></td>
894 <td>output format, either <code class="language-plaintext highlighter-rouge">default</code>, <code class="language-plaintext highlighter-rouge">sentence</code>, or <code class="language-plaintext highlighter-rouge">plain</code>; defaults to <code class="language-plaintext highlighter-rouge">default</code>, see <code class="language-plaintext highlighter-rouge">wcf\util\DateUtil::FORMAT_*</code> constants</td>
895 </tr>
896 <tr>
897 <td><code class="language-plaintext highlighter-rouge">full</code></td>
898 <td>if <code class="language-plaintext highlighter-rouge">true</code>, full difference in minutes is shown; if <code class="language-plaintext highlighter-rouge">false</code>, only the longest time interval is shown; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
899 </tr>
900 <tr>
901 <td><code class="language-plaintext highlighter-rouge">start</code></td>
902 <td>start of the time interval; current timestamp by default (though either <code class="language-plaintext highlighter-rouge">start</code> or <code class="language-plaintext highlighter-rouge">end</code> has to be set)</td>
903 </tr>
904 </tbody>
905 </table>
906
907 <h2 id="encodejs"><code class="language-plaintext highlighter-rouge">encodeJS</code></h2>
908
909 <p><code class="language-plaintext highlighter-rouge">encodeJS</code> encodes a string to be used as a single-quoted string in JavaScript by replacing <code class="language-plaintext highlighter-rouge">\\</code> with <code class="language-plaintext highlighter-rouge">\\\\</code>, <code class="language-plaintext highlighter-rouge">'</code> with <code class="language-plaintext highlighter-rouge">\'</code>, linebreaks with <code class="language-plaintext highlighter-rouge">\n</code>, and <code class="language-plaintext highlighter-rouge">/</code> with <code class="language-plaintext highlighter-rouge">\/</code>.</p>
910
911 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;script&gt;</span>
912 <span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">{@$foo|encodeJS}</span><span class="dl">'</span><span class="p">;</span>
913 <span class="nt">&lt;/script&gt;</span>
914 </code></pre></div></div>
915
916 <h2 id="encodejson"><code class="language-plaintext highlighter-rouge">encodeJSON</code></h2>
917
918 <p><code class="language-plaintext highlighter-rouge">encodeJSON</code> encodes a JSON string to be used as a single-quoted string in JavaScript by replacing <code class="language-plaintext highlighter-rouge">\\</code> with <code class="language-plaintext highlighter-rouge">\\\\</code>, <code class="language-plaintext highlighter-rouge">'</code> with <code class="language-plaintext highlighter-rouge">&amp;#39;</code>, linebreaks with <code class="language-plaintext highlighter-rouge">\n</code>, and <code class="language-plaintext highlighter-rouge">/</code> with <code class="language-plaintext highlighter-rouge">\/</code>.
919 Additionally, <code class="language-plaintext highlighter-rouge">htmlspecialchars</code> is applied to the string.</p>
920
921 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code>'{@$foo|encodeJSON}'
922 </code></pre></div></div>
923
924 <h2 id="escapecdata"><code class="language-plaintext highlighter-rouge">escapeCDATA</code></h2>
925
926 <p><code class="language-plaintext highlighter-rouge">escapeCDATA</code> encodes a string to be used in a <code class="language-plaintext highlighter-rouge">CDATA</code> element by replacing <code class="language-plaintext highlighter-rouge">]]&gt;</code> with <code class="language-plaintext highlighter-rouge">]]]]&gt;&lt;![CDATA[&gt;</code>.</p>
927
928 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;![CDATA[{@$foo|encodeCDATA}]]&gt;</span>
929 </code></pre></div></div>
930
931 <h2 id="event"><code class="language-plaintext highlighter-rouge">event</code></h2>
932
933 <p><code class="language-plaintext highlighter-rouge">event</code> provides extension points in templates that <a href="package_pip_template-listener.html">template listeners</a> can use.</p>
934
935 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">event</span> <span class="na">name</span><span class="o">=</span><span class="s1">'foo'</span><span class="k">}</span>
936 </code></pre></div></div>
937
938 <h2 id="fetch"><code class="language-plaintext highlighter-rouge">fetch</code></h2>
939
940 <p><code class="language-plaintext highlighter-rouge">fetch</code> fetches the contents of a file using <code class="language-plaintext highlighter-rouge">file_get_contents</code>.</p>
941
942 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">fetch</span> <span class="na">file</span><span class="o">=</span><span class="s1">'foo.html'</span><span class="k">}</span> <span class="c">{* prints the contents of `foo.html` *}</span>
943
944 <span class="k">{</span><span class="nb">fetch</span> <span class="na">file</span><span class="o">=</span><span class="s1">'bar.html'</span> <span class="nb">assign</span><span class="o">=</span><span class="na">bar</span><span class="k">}</span> <span class="c">{* assigns the contents of `foo.html` to `$bar`; does not print the contents *}</span>
945 </code></pre></div></div>
946
947 <h2 id="filesizebinary"><code class="language-plaintext highlighter-rouge">filesizeBinary</code></h2>
948
949 <p><code class="language-plaintext highlighter-rouge">filesizeBinary</code> formats the filesize using binary filesize (in bytes).</p>
950
951 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$filesize</span><span class="o">|</span><span class="na">filesizeBinary</span><span class="k">}</span>
952 </code></pre></div></div>
953
954 <h2 id="filesize"><code class="language-plaintext highlighter-rouge">filesize</code></h2>
955
956 <p><code class="language-plaintext highlighter-rouge">filesize</code> formats the filesize using filesize (in bytes).</p>
957
958 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$filesize</span><span class="o">|</span><span class="na">filesize</span><span class="k">}</span>
959 </code></pre></div></div>
960
961 <h2 id="hascontent"><code class="language-plaintext highlighter-rouge">hascontent</code></h2>
962
963 <p>In many cases, conditional statements can be used to determine if a certain section of a template is shown:</p>
964
965 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">if</span> <span class="nv">$foo</span> <span class="o">===</span> <span class="s1">'bar'</span><span class="k">}</span>
966 only shown if $foo is bar
967 <span class="k">{/</span><span class="nb">if</span><span class="k">}</span>
968 </code></pre></div></div>
969
970 <p>In some situations, however, such conditional statements are not sufficient.
971 One prominent example is a template event:</p>
972
973 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">if</span> <span class="nv">$foo</span> <span class="o">===</span> <span class="s1">'bar'</span><span class="k">}</span>
974 <span class="nt">&lt;ul&gt;</span>
975 <span class="k">{</span><span class="nb">if</span> <span class="nv">$foo</span> <span class="o">===</span> <span class="s1">'bar'</span><span class="k">}</span>
976 <span class="nt">&lt;li&gt;</span>Bar<span class="nt">&lt;/li&gt;</span>
977 <span class="k">{/</span><span class="nb">if</span><span class="k">}</span>
978
979 <span class="k">{</span><span class="na">event</span> <span class="na">name</span><span class="o">=</span><span class="s1">'listItems'</span><span class="k">}</span>
980 <span class="nt">&lt;/li&gt;</span>
981 <span class="k">{/</span><span class="nb">if</span><span class="k">}</span>
982 </code></pre></div></div>
983
984 <p>In this example, if <code class="language-plaintext highlighter-rouge">$foo !== 'bar'</code>, the list will not be shown, regardless of the additional template code provided by template listeners.
985 In such a situation, <code class="language-plaintext highlighter-rouge">hascontent</code> has to be used:</p>
986
987 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">hascontent</span><span class="k">}</span>
988 <span class="nt">&lt;ul&gt;</span>
989 <span class="k">{</span><span class="na">content</span><span class="k">}</span>
990 <span class="k">{</span><span class="nb">if</span> <span class="nv">$foo</span> <span class="o">===</span> <span class="s1">'bar'</span><span class="k">}</span>
991 <span class="nt">&lt;li&gt;</span>Bar<span class="nt">&lt;/li&gt;</span>
992 <span class="k">{/</span><span class="nb">if</span><span class="k">}</span>
993
994 <span class="k">{</span><span class="na">event</span> <span class="na">name</span><span class="o">=</span><span class="s1">'listItems'</span><span class="k">}</span>
995 <span class="k">{/</span><span class="na">content</span><span class="k">}</span>
996 <span class="nt">&lt;/ul&gt;</span>
997 <span class="k">{/</span><span class="na">hascontent</span><span class="k">}</span>
998 </code></pre></div></div>
999
1000 <p>If the part of the template wrapped in the <code class="language-plaintext highlighter-rouge">content</code> tags has any (trimmed) content, the part of the template wrapped by <code class="language-plaintext highlighter-rouge">hascontent</code> tags is shown (including the part wrapped by the <code class="language-plaintext highlighter-rouge">content</code> tags), otherwise nothing is shown.
1001 Thus, this construct avoids an empty list compared to the <code class="language-plaintext highlighter-rouge">if</code> solution above.</p>
1002
1003 <p>Like <code class="language-plaintext highlighter-rouge">foreach</code>, <code class="language-plaintext highlighter-rouge">hascontent</code> also supports an <code class="language-plaintext highlighter-rouge">else</code> part:</p>
1004
1005 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">hascontent</span><span class="k">}</span>
1006 <span class="nt">&lt;ul&gt;</span>
1007 <span class="k">{</span><span class="na">content</span><span class="k">}</span>
1008 <span class="c">{* … *}</span>
1009 <span class="k">{/</span><span class="na">content</span><span class="k">}</span>
1010 <span class="nt">&lt;/ul&gt;</span>
1011 <span class="k">{</span><span class="na">hascontentelse</span><span class="k">}</span>
1012 no list
1013 <span class="k">{/</span><span class="na">hascontent</span><span class="k">}</span>
1014 </code></pre></div></div>
1015
1016 <h2 id="htmlcheckboxes"><code class="language-plaintext highlighter-rouge">htmlCheckboxes</code></h2>
1017
1018 <p><code class="language-plaintext highlighter-rouge">htmlCheckboxes</code> generates a list of HTML checkboxes.</p>
1019
1020 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}</span>
1021
1022 <span class="k">{</span><span class="na">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="k">}</span>
1023 </code></pre></div></div>
1024
1025 <table>
1026 <thead>
1027 <tr>
1028 <th>Attribute</th>
1029 <th>Description</th>
1030 </tr>
1031 </thead>
1032 <tbody>
1033 <tr>
1034 <td><span class="label label-info">5.2+</span> <code class="language-plaintext highlighter-rouge">disabled</code></td>
1035 <td>if <code class="language-plaintext highlighter-rouge">true</code>, all checkboxes are disabled</td>
1036 </tr>
1037 <tr>
1038 <td><code class="language-plaintext highlighter-rouge">disableEncoding</code></td>
1039 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the values are not passed through <code class="language-plaintext highlighter-rouge">wcf\util\StringUtil::encodeHTML()</code>; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
1040 </tr>
1041 <tr>
1042 <td><code class="language-plaintext highlighter-rouge">name</code></td>
1043 <td><code class="language-plaintext highlighter-rouge">name</code> attribute of the <code class="language-plaintext highlighter-rouge">input</code> checkbox element</td>
1044 </tr>
1045 <tr>
1046 <td><code class="language-plaintext highlighter-rouge">output</code></td>
1047 <td>array used as keys and values for <code class="language-plaintext highlighter-rouge">options</code> if present; not present by default</td>
1048 </tr>
1049 <tr>
1050 <td><code class="language-plaintext highlighter-rouge">options</code></td>
1051 <td>array selectable options with the key used as <code class="language-plaintext highlighter-rouge">value</code> attribute and the value as the checkbox label</td>
1052 </tr>
1053 <tr>
1054 <td><code class="language-plaintext highlighter-rouge">selected</code></td>
1055 <td>current selected value(s)</td>
1056 </tr>
1057 <tr>
1058 <td><code class="language-plaintext highlighter-rouge">separator</code></td>
1059 <td>separator between the different checkboxes in the generated output; empty string by default</td>
1060 </tr>
1061 <tr>
1062 <td><code class="language-plaintext highlighter-rouge">values</code></td>
1063 <td>array with values used in combination with <code class="language-plaintext highlighter-rouge">output</code>, where <code class="language-plaintext highlighter-rouge">output</code> is only used as keys for <code class="language-plaintext highlighter-rouge">options</code></td>
1064 </tr>
1065 </tbody>
1066 </table>
1067
1068 <h2 id="htmloptions"><code class="language-plaintext highlighter-rouge">htmlOptions</code></h2>
1069
1070 <p><code class="language-plaintext highlighter-rouge">htmlOptions</code> generates an <code class="language-plaintext highlighter-rouge">select</code> HTML element.</p>
1071
1072 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}</span>
1073
1074 <span class="nt">&lt;select</span> <span class="na">name=</span><span class="s">"bar"</span><span class="nt">&gt;</span>
1075 <span class="nt">&lt;option</span> <span class="na">value=</span><span class="s">""</span><span class="k">{</span><span class="nb">if</span> <span class="o">!</span><span class="nv">$selected</span><span class="k">}</span> <span class="na">selected</span><span class="k">{/</span><span class="nb">if</span><span class="k">}</span><span class="nt">&gt;</span><span class="k">{</span><span class="na">lang</span><span class="k">}</span>foo.bar.default<span class="k">{/</span><span class="na">lang</span><span class="k">}</span><span class="nt">&lt;/option&gt;</span>
1076 <span class="k">{</span><span class="na">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="k">}</span> <span class="c">{* no `name` attribute *}</span>
1077 <span class="nt">&lt;/select&gt;</span>
1078 </code></pre></div></div>
1079
1080 <table>
1081 <thead>
1082 <tr>
1083 <th>Attribute</th>
1084 <th>Description</th>
1085 </tr>
1086 </thead>
1087 <tbody>
1088 <tr>
1089 <td><code class="language-plaintext highlighter-rouge">disableEncoding</code></td>
1090 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the values are not passed through <code class="language-plaintext highlighter-rouge">wcf\util\StringUtil::encodeHTML()</code>; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
1091 </tr>
1092 <tr>
1093 <td><code class="language-plaintext highlighter-rouge">object</code></td>
1094 <td>optional instance of <code class="language-plaintext highlighter-rouge">wcf\data\DatabaseObjectList</code> that provides the selectable options (overwrites <code class="language-plaintext highlighter-rouge">options</code> attribute internally)</td>
1095 </tr>
1096 <tr>
1097 <td><code class="language-plaintext highlighter-rouge">name</code></td>
1098 <td><code class="language-plaintext highlighter-rouge">name</code> attribute of the <code class="language-plaintext highlighter-rouge">select</code> element; if not present, only the <strong>contents</strong> of the <code class="language-plaintext highlighter-rouge">select</code> element are printed</td>
1099 </tr>
1100 <tr>
1101 <td><code class="language-plaintext highlighter-rouge">output</code></td>
1102 <td>array used as keys and values for <code class="language-plaintext highlighter-rouge">options</code> if present; not present by default</td>
1103 </tr>
1104 <tr>
1105 <td><code class="language-plaintext highlighter-rouge">values</code></td>
1106 <td>array with values used in combination with <code class="language-plaintext highlighter-rouge">output</code>, where <code class="language-plaintext highlighter-rouge">output</code> is only used as keys for <code class="language-plaintext highlighter-rouge">options</code></td>
1107 </tr>
1108 <tr>
1109 <td><code class="language-plaintext highlighter-rouge">options</code></td>
1110 <td>array selectable options with the key used as <code class="language-plaintext highlighter-rouge">value</code> attribute and the value as the option label; if a value is an array, an <code class="language-plaintext highlighter-rouge">optgroup</code> is generated with the array key as the <code class="language-plaintext highlighter-rouge">optgroup</code> label</td>
1111 </tr>
1112 <tr>
1113 <td><code class="language-plaintext highlighter-rouge">selected</code></td>
1114 <td>current selected value(s)</td>
1115 </tr>
1116 </tbody>
1117 </table>
1118
1119 <p>All additional attributes are added as attributes of the <code class="language-plaintext highlighter-rouge">select</code> HTML element.</p>
1120
1121 <h2 id="implode"><code class="language-plaintext highlighter-rouge">implode</code></h2>
1122
1123 <p><code class="language-plaintext highlighter-rouge">implodes</code> transforms an array into a string and prints it.</p>
1124
1125 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}{</span><span class="nv">$key</span><span class="k">}</span>: <span class="k">{</span><span class="nv">$value</span><span class="k">}{/</span><span class="na">implode</span><span class="k">}</span>
1126 </code></pre></div></div>
1127
1128 <table>
1129 <thead>
1130 <tr>
1131 <th>Attribute</th>
1132 <th>Description</th>
1133 </tr>
1134 </thead>
1135 <tbody>
1136 <tr>
1137 <td><code class="language-plaintext highlighter-rouge">from</code></td>
1138 <td>array with the imploded values</td>
1139 </tr>
1140 <tr>
1141 <td><code class="language-plaintext highlighter-rouge">glue</code></td>
1142 <td>separator between the different array values; <code class="language-plaintext highlighter-rouge">', '</code> by default</td>
1143 </tr>
1144 <tr>
1145 <td><code class="language-plaintext highlighter-rouge">item</code></td>
1146 <td>template variable name where the current array value is stored during the iteration</td>
1147 </tr>
1148 <tr>
1149 <td><code class="language-plaintext highlighter-rouge">key</code></td>
1150 <td>optional template variable name where the current array key is stored during the iteration</td>
1151 </tr>
1152 </tbody>
1153 </table>
1154
1155 <h2 id="52-ipsearch"><span class="label label-info">5.2+</span> <code class="language-plaintext highlighter-rouge">ipSearch</code></h2>
1156
1157 <p><code class="language-plaintext highlighter-rouge">ipSearch</code> generates a link to search for an IP address.</p>
1158
1159 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="s2">"127.0.0.1"</span><span class="o">|</span><span class="na">ipSearch</span><span class="k">}</span>
1160 </code></pre></div></div>
1161
1162 <h2 id="30-js"><span class="label label-info">3.0+</span> <code class="language-plaintext highlighter-rouge">js</code></h2>
1163
1164 <p><code class="language-plaintext highlighter-rouge">js</code> generates script tags based on whether <code class="language-plaintext highlighter-rouge">ENABLE_DEBUG_MODE</code> and <code class="language-plaintext highlighter-rouge">VISITOR_USE_TINY_BUILD</code> are enabled.</p>
1165
1166 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}</span> <span class="c">{* generates 'http://example.com/js/WBB.js' *}</span>
1167
1168 <span class="k">{</span><span class="na">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="k">}</span>
1169 <span class="c">{* generates 'http://example.com/wcf/js/WCF.Like.js' if ENABLE_DEBUG_MODE=1 *}</span>
1170 <span class="c">{* generates 'http://example.com/wcf/js/WCF.Combined.min.js' if ENABLE_DEBUG_MODE=0 *}</span>
1171
1172 <span class="k">{</span><span class="na">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="k">}</span>
1173 <span class="c">{* generates 'http://example.com/wcf/js/3rdParty/jquery.js' *}</span>
1174
1175 <span class="k">{</span><span class="na">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="k">}</span>
1176 <span class="c">{* generates 'http://example.com/wcf/js/3rdParty/jquery-ui/awesomeWidget.js' *}</span>
1177
1178 <span class="k">{</span><span class="na">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="k">}</span>
1179 <span class="c">{* generates 'http://example.com/wcf/js/WCF.Like.js' if ENABLE_DEBUG_MODE=1 *}</span>
1180 <span class="c">{* generates 'http://example.com/wcf/js/WCF.Combined.min.js' (ENABLE_DEBUG_MODE=0 *}</span>
1181 <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>
1182 </code></pre></div></div>
1183
1184 <h2 id="53-jslang"><span class="label label-info">5.3+</span> <code class="language-plaintext highlighter-rouge">jslang</code></h2>
1185
1186 <p><code class="language-plaintext highlighter-rouge">jslang</code> works like <a href="#lang"><code class="language-plaintext highlighter-rouge">lang</code></a> with the difference that the resulting string is automatically passed through <a href="#encodejs"><code class="language-plaintext highlighter-rouge">encodeJS</code></a>.</p>
1187
1188 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code>require(['Language', /* … */], function(Language, /* … */) {
1189 Language.addObject({
1190 'app.foo.bar': '<span class="k">{</span><span class="na">jslang</span><span class="k">}</span>app.foo.bar<span class="k">{/</span><span class="na">jslang</span><span class="k">}</span>',
1191 });
1192
1193 // …
1194 });
1195 </code></pre></div></div>
1196
1197 <h2 id="lang"><code class="language-plaintext highlighter-rouge">lang</code></h2>
1198
1199 <p><code class="language-plaintext highlighter-rouge">lang</code> replaces a language items with its value.</p>
1200
1201 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">lang</span><span class="k">}</span>foo.bar.baz<span class="k">{/</span><span class="na">lang</span><span class="k">}</span>
1202
1203 <span class="k">{</span><span class="na">lang</span> <span class="na">__literal</span><span class="o">=</span><span class="kc">true</span><span class="k">}</span>foo.bar.baz<span class="k">{/</span><span class="na">lang</span><span class="k">}</span>
1204
1205 <span class="k">{</span><span class="na">lang</span> <span class="na">foo</span><span class="o">=</span><span class="s1">'baz'</span><span class="k">}</span>foo.bar.baz<span class="k">{/</span><span class="na">lang</span><span class="k">}</span>
1206
1207 <span class="k">{</span><span class="na">lang</span><span class="k">}</span>foo.bar.baz.<span class="k">{</span><span class="nv">$action</span><span class="k">}{/</span><span class="na">lang</span><span class="k">}</span>
1208 </code></pre></div></div>
1209
1210 <table>
1211 <thead>
1212 <tr>
1213 <th>Attribute</th>
1214 <th>Description</th>
1215 </tr>
1216 </thead>
1217 <tbody>
1218 <tr>
1219 <td><code class="language-plaintext highlighter-rouge">__encode</code></td>
1220 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the output will be passed through <code class="language-plaintext highlighter-rouge">StringUtil::encodeHTML()</code></td>
1221 </tr>
1222 <tr>
1223 <td><code class="language-plaintext highlighter-rouge">__literal</code></td>
1224 <td>if <code class="language-plaintext highlighter-rouge">true</code>, template variables will not resolved but printed as they are in the language item; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
1225 </tr>
1226 <tr>
1227 <td><code class="language-plaintext highlighter-rouge">__optional</code></td>
1228 <td>if <code class="language-plaintext highlighter-rouge">true</code> and the language item does not exist, an empty string is printed; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
1229 </tr>
1230 </tbody>
1231 </table>
1232
1233 <p>All additional attributes are available when parsing the language item.</p>
1234
1235 <h2 id="language"><code class="language-plaintext highlighter-rouge">language</code></h2>
1236
1237 <p><code class="language-plaintext highlighter-rouge">language</code> replaces a language items with its value.
1238 If the template variable <code class="language-plaintext highlighter-rouge">__language</code> exists, this language object will be used instead of <code class="language-plaintext highlighter-rouge">WCF::getLanguage()</code>.
1239 This modifier is useful when assigning the value directly to a variable.</p>
1240
1241 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$languageItem</span><span class="o">|</span><span class="na">language</span><span class="k">}</span>
1242
1243 <span class="k">{</span><span class="nb">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="k">}</span>
1244 </code></pre></div></div>
1245
1246 <h2 id="link"><code class="language-plaintext highlighter-rouge">link</code></h2>
1247
1248 <p><code class="language-plaintext highlighter-rouge">link</code> generates internal links using <code class="language-plaintext highlighter-rouge">LinkHandler</code>.</p>
1249
1250 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"</span><span class="k">{</span><span class="na">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="k">}</span><span class="s">param1=2&amp;param2=A</span><span class="k">{/</span><span class="na">link</span><span class="k">}</span><span class="s">"</span><span class="nt">&gt;</span>Foo<span class="nt">&lt;/a&gt;</span>
1251 </code></pre></div></div>
1252
1253 <table>
1254 <thead>
1255 <tr>
1256 <th>Attribute</th>
1257 <th>Description</th>
1258 </tr>
1259 </thead>
1260 <tbody>
1261 <tr>
1262 <td><code class="language-plaintext highlighter-rouge">application</code></td>
1263 <td>abbreviation of the application the controller belongs to; <code class="language-plaintext highlighter-rouge">wcf</code> by default</td>
1264 </tr>
1265 <tr>
1266 <td><code class="language-plaintext highlighter-rouge">controller</code></td>
1267 <td>name of the controller; if not present, the landing page is linked in the frontend and the index page in the ACP</td>
1268 </tr>
1269 <tr>
1270 <td><code class="language-plaintext highlighter-rouge">encode</code></td>
1271 <td>if <code class="language-plaintext highlighter-rouge">true</code>, the generated link is passed through <code class="language-plaintext highlighter-rouge">wcf\util\StringUtil::encodeHTML()</code>; <code class="language-plaintext highlighter-rouge">true</code> by default</td>
1272 </tr>
1273 <tr>
1274 <td><code class="language-plaintext highlighter-rouge">isEmail</code></td>
1275 <td>sets <code class="language-plaintext highlighter-rouge">encode=false</code> and forces links to link to the frontend</td>
1276 </tr>
1277 </tbody>
1278 </table>
1279
1280 <p>Additional attributes are passed to <code class="language-plaintext highlighter-rouge">LinkHandler::getLink()</code>.</p>
1281
1282 <h2 id="newlinetobreak"><code class="language-plaintext highlighter-rouge">newlineToBreak</code></h2>
1283
1284 <p><code class="language-plaintext highlighter-rouge">newlineToBreak</code> transforms newlines into HTML <code class="language-plaintext highlighter-rouge">&lt;br&gt;</code> elements after encoding the content via <code class="language-plaintext highlighter-rouge">wcf\util\StringUtil::encodeHTML()</code>.</p>
1285
1286 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$foo</span><span class="o">|</span><span class="na">newlineToBreak</span><span class="k">}</span>
1287 </code></pre></div></div>
1288
1289 <h2 id="30-page"><span class="label label-info">3.0+</span> <code class="language-plaintext highlighter-rouge">page</code></h2>
1290
1291 <p><code class="language-plaintext highlighter-rouge">page</code> generates an internal link to a CMS page.</p>
1292
1293 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">page</span><span class="k">}</span>com.woltlab.wcf.CookiePolicy<span class="k">{/</span><span class="na">page</span><span class="k">}</span>
1294
1295 <span class="k">{</span><span class="na">page</span> <span class="na">pageID</span><span class="o">=</span><span class="m">1</span><span class="k">}{/</span><span class="na">page</span><span class="k">}</span>
1296
1297 <span class="k">{</span><span class="na">page</span> <span class="na">language</span><span class="o">=</span><span class="s1">'de'</span><span class="k">}</span>com.woltlab.wcf.CookiePolicy<span class="k">{/</span><span class="na">page</span><span class="k">}</span>
1298
1299 <span class="k">{</span><span class="na">page</span> <span class="na">languageID</span><span class="o">=</span><span class="m">2</span><span class="k">}</span>com.woltlab.wcf.CookiePolicy<span class="k">{/</span><span class="na">page</span><span class="k">}</span>
1300 </code></pre></div></div>
1301
1302 <table>
1303 <thead>
1304 <tr>
1305 <th>Attribute</th>
1306 <th>Description</th>
1307 </tr>
1308 </thead>
1309 <tbody>
1310 <tr>
1311 <td><code class="language-plaintext highlighter-rouge">pageID</code></td>
1312 <td>unique id of the page (cannot be used together with a page identifier as value)</td>
1313 </tr>
1314 <tr>
1315 <td><code class="language-plaintext highlighter-rouge">languageID</code></td>
1316 <td>id of the page language (cannot be used together with <code class="language-plaintext highlighter-rouge">language</code>)</td>
1317 </tr>
1318 <tr>
1319 <td><code class="language-plaintext highlighter-rouge">language</code></td>
1320 <td>language code of the page language (cannot be used together with <code class="language-plaintext highlighter-rouge">languageID</code>)</td>
1321 </tr>
1322 </tbody>
1323 </table>
1324
1325 <h2 id="pages"><code class="language-plaintext highlighter-rouge">pages</code></h2>
1326
1327 <p><code class="language-plaintext highlighter-rouge">pages</code> generates a pagination.</p>
1328
1329 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="nb">assign</span><span class="o">=</span><span class="na">pagesLinks</span><span class="k">}</span> <span class="c">{* prints pagination *}</span>
1330
1331 {@$pagesLinks} <span class="c">{* prints same pagination again *}</span>
1332 </code></pre></div></div>
1333
1334 <table>
1335 <thead>
1336 <tr>
1337 <th>Attribute</th>
1338 <th>Description</th>
1339 </tr>
1340 </thead>
1341 <tbody>
1342 <tr>
1343 <td><code class="language-plaintext highlighter-rouge">assign</code></td>
1344 <td>optional name of the template variable the pagination is assigned to</td>
1345 </tr>
1346 <tr>
1347 <td><code class="language-plaintext highlighter-rouge">controller</code></td>
1348 <td>controller name of the generated links</td>
1349 </tr>
1350 <tr>
1351 <td><code class="language-plaintext highlighter-rouge">link</code></td>
1352 <td>additional link parameter where <code class="language-plaintext highlighter-rouge">%d</code> will be replaced with the relevant page number</td>
1353 </tr>
1354 <tr>
1355 <td><code class="language-plaintext highlighter-rouge">pages</code></td>
1356 <td>maximum number of of pages; by default, the template variable <code class="language-plaintext highlighter-rouge">$pages</code> is used</td>
1357 </tr>
1358 <tr>
1359 <td><code class="language-plaintext highlighter-rouge">print</code></td>
1360 <td>if <code class="language-plaintext highlighter-rouge">false</code> and <code class="language-plaintext highlighter-rouge">assign=true</code>, the pagination is not printed</td>
1361 </tr>
1362 <tr>
1363 <td><code class="language-plaintext highlighter-rouge">application</code>, <code class="language-plaintext highlighter-rouge">id</code>, <code class="language-plaintext highlighter-rouge">object</code>, <code class="language-plaintext highlighter-rouge">title</code></td>
1364 <td>additional parameters passed to <code class="language-plaintext highlighter-rouge">LinkHandler::getLink()</code> to generate page links</td>
1365 </tr>
1366 </tbody>
1367 </table>
1368
1369 <h2 id="plaintime"><code class="language-plaintext highlighter-rouge">plainTime</code></h2>
1370
1371 <p><code class="language-plaintext highlighter-rouge">plainTime</code> formats a timestamp to include year, month, day, hour, and minutes.
1372 The exact formatting depends on the current language (via the language items <code class="language-plaintext highlighter-rouge">wcf.date.dateTimeFormat</code>, <code class="language-plaintext highlighter-rouge">wcf.date.dateFormat</code>, and <code class="language-plaintext highlighter-rouge">wcf.date.timeFormat</code>).</p>
1373
1374 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$timestamp</span><span class="o">|</span><span class="na">plainTime</span><span class="k">}</span>
1375 </code></pre></div></div>
1376
1377 <h2 id="53-plural"><span class="label label-info">5.3+</span> <code class="language-plaintext highlighter-rouge">plural</code></h2>
1378
1379 <p><code class="language-plaintext highlighter-rouge">plural</code> allows to easily select the correct plural form of a phrase based on a given <code class="language-plaintext highlighter-rouge">value</code>.
1380 The pluralization logic follows the <a href="https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_plural_rules.html">Unicode Language Plural Rules</a> for cardinal numbers.</p>
1381
1382 <p>The <code class="language-plaintext highlighter-rouge">#</code> placeholder within the resulting phrase is replaced by the <code class="language-plaintext highlighter-rouge">value</code>.
1383 It is automatically formatted using <code class="language-plaintext highlighter-rouge">StringUtil::formatNumeric</code>.</p>
1384
1385 <p>English:</p>
1386
1387 <p>Note the use of <code class="language-plaintext highlighter-rouge">1</code> if the number (<code class="language-plaintext highlighter-rouge">#</code>) is not used within the phrase and the use of <code class="language-plaintext highlighter-rouge">one</code> otherwise.
1388 They are equivalent for English, but following this rule generalizes better to other languages, helping the translator.</p>
1389 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
1390 <span class="nt">&lt;h1&gt;</span>Hello <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/h1&gt;</span>
1391 <span class="nt">&lt;p&gt;</span>There <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/p&gt;</span>
1392 <span class="nt">&lt;p&gt;</span>There <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/p&gt;</span>
1393 </code></pre></div></div>
1394
1395 <p>German:</p>
1396 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
1397 <span class="nt">&lt;h1&gt;</span>Hallo <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/h1&gt;</span>
1398 <span class="nt">&lt;p&gt;</span>Es gibt <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/p&gt;</span>
1399 <span class="nt">&lt;p&gt;</span>Es gibt <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/p&gt;</span>
1400 </code></pre></div></div>
1401
1402 <p>Romanian:</p>
1403
1404 <p>Note the additional use of <code class="language-plaintext highlighter-rouge">few</code> which is not required in English or German.</p>
1405 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
1406 <span class="nt">&lt;h1&gt;</span>Salut <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/h1&gt;</span>
1407 <span class="nt">&lt;p&gt;</span>Există <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/p&gt;</span>
1408 <span class="nt">&lt;p&gt;</span>Există <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/p&gt;</span>
1409 </code></pre></div></div>
1410
1411 <p>Russian:</p>
1412
1413 <p>Note the difference between <code class="language-plaintext highlighter-rouge">1</code> (exactly <code class="language-plaintext highlighter-rouge">1</code>) and <code class="language-plaintext highlighter-rouge">one</code> (ending in <code class="language-plaintext highlighter-rouge">1</code>, except ending in <code class="language-plaintext highlighter-rouge">11</code>).</p>
1414 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
1415 <span class="nt">&lt;h1&gt;</span>Привет <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/h1&gt;</span>
1416 <span class="nt">&lt;p&gt;</span>Есть <span class="k">{</span><span class="na">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="k">}</span>!<span class="nt">&lt;/p&gt;</span>
1417 </code></pre></div></div>
1418
1419 <table>
1420 <thead>
1421 <tr>
1422 <th>Attribute</th>
1423 <th>Description</th>
1424 </tr>
1425 </thead>
1426 <tbody>
1427 <tr>
1428 <td>value</td>
1429 <td>The value that is used to select the proper phrase.</td>
1430 </tr>
1431 <tr>
1432 <td>other</td>
1433 <td>The phrase that is used when no other selector matches.</td>
1434 </tr>
1435 <tr>
1436 <td>Any Category Name</td>
1437 <td>The phrase that is used when <code class="language-plaintext highlighter-rouge">value</code> belongs to the named category. Available categories depend on the language.</td>
1438 </tr>
1439 <tr>
1440 <td>Any Integer</td>
1441 <td>The phrase that is used when <code class="language-plaintext highlighter-rouge">value</code> is that exact integer.</td>
1442 </tr>
1443 </tbody>
1444 </table>
1445
1446 <h2 id="prepend"><code class="language-plaintext highlighter-rouge">prepend</code></h2>
1447
1448 <p>If a string should be prepended to the value of a variable, <code class="language-plaintext highlighter-rouge">prepend</code> can be used:</p>
1449
1450 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nb">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="k">}</span>
1451
1452 <span class="k">{</span><span class="nv">$templateVariable</span><span class="k">}</span> <span class="c">{* prints 'newValue *}</span>
1453
1454 <span class="k">{</span><span class="na">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="k">}</span>
1455
1456 <span class="k">{</span><span class="nv">$templateVariable</span><span class="k">}</span> <span class="c">{* now prints '2newValue' *}</span>
1457 </code></pre></div></div>
1458
1459 <p>If the variables does not exist yet, <code class="language-plaintext highlighter-rouge">prepend</code> creates a new one with the given value.
1460 If <code class="language-plaintext highlighter-rouge">prepend</code> is used on an array as the variable, the value is prepended to all elements of the array.</p>
1461
1462 <h2 id="shortunit"><code class="language-plaintext highlighter-rouge">shortUnit</code></h2>
1463
1464 <p><code class="language-plaintext highlighter-rouge">shortUnit</code> shortens numbers larger than 1000 by using unit suffixes:</p>
1465
1466 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="m">10000</span><span class="o">|</span><span class="na">shortUnit</span><span class="k">}</span> <span class="c">{* prints 10k *}</span>
1467 <span class="k">{</span><span class="m">5400000</span><span class="o">|</span><span class="na">shortUnit</span><span class="k">}</span> <span class="c">{* prints 5.4M *}</span>
1468 </code></pre></div></div>
1469
1470 <h2 id="smallpages"><code class="language-plaintext highlighter-rouge">smallpages</code></h2>
1471
1472 <p><code class="language-plaintext highlighter-rouge">smallpages</code> generates a smaller version of <code class="language-plaintext highlighter-rouge">pages</code> by using adding the <code class="language-plaintext highlighter-rouge">small</code> CSS class to the generated <code class="language-plaintext highlighter-rouge">&lt;nav&gt;</code> element and only showing 7 instead of 9 links.</p>
1473
1474 <h2 id="tablewordwrap"><code class="language-plaintext highlighter-rouge">tableWordwrap</code></h2>
1475
1476 <p><code class="language-plaintext highlighter-rouge">tableWordwrap</code> inserts zero width spaces every 30 characters in words longer than 30 characters.</p>
1477
1478 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$foo</span><span class="o">|</span><span class="na">tableWordwrap</span><span class="k">}</span>
1479 </code></pre></div></div>
1480
1481 <h2 id="time"><code class="language-plaintext highlighter-rouge">time</code></h2>
1482
1483 <p><code class="language-plaintext highlighter-rouge">time</code> generates an HTML <code class="language-plaintext highlighter-rouge">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>
1484
1485 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$timestamp</span><span class="o">|</span><span class="na">time</span><span class="k">}</span> <span class="c">{* prints a '&lt;time&gt;' element *}</span>
1486 </code></pre></div></div>
1487
1488 <h2 id="truncate"><code class="language-plaintext highlighter-rouge">truncate</code></h2>
1489
1490 <p><code class="language-plaintext highlighter-rouge">truncate</code> truncates a long string into a shorter one:</p>
1491
1492 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="nv">$foo</span><span class="o">|</span><span class="nb">truncate</span><span class="o">:</span><span class="m">35</span><span class="k">}</span>
1493
1494 <span class="k">{</span><span class="nv">$foo</span><span class="o">|</span><span class="nb">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="k">}</span>
1495 </code></pre></div></div>
1496
1497 <table>
1498 <thead>
1499 <tr>
1500 <th>Parameter Number</th>
1501 <th>Description</th>
1502 </tr>
1503 </thead>
1504 <tbody>
1505 <tr>
1506 <td>0</td>
1507 <td>truncated string</td>
1508 </tr>
1509 <tr>
1510 <td>1</td>
1511 <td>truncated length; <code class="language-plaintext highlighter-rouge">80</code> by default</td>
1512 </tr>
1513 <tr>
1514 <td>2</td>
1515 <td>ellipsis symbol; <code class="language-plaintext highlighter-rouge">wcf\util\StringUtil::HELLIP</code> by default</td>
1516 </tr>
1517 <tr>
1518 <td>3</td>
1519 <td>if <code class="language-plaintext highlighter-rouge">true</code>, words can be broken up in the middle; <code class="language-plaintext highlighter-rouge">false</code> by default</td>
1520 </tr>
1521 </tbody>
1522 </table>
1523
1524 <h2 id="53-user"><span class="label label-info">5.3+</span> <code class="language-plaintext highlighter-rouge">user</code></h2>
1525
1526 <p><code class="language-plaintext highlighter-rouge">user</code> generates links to user profiles.
1527 The mandatory <code class="language-plaintext highlighter-rouge">object</code> parameter requires an instances of <code class="language-plaintext highlighter-rouge">UserProfile</code>.
1528 The optional <code class="language-plaintext highlighter-rouge">type</code> parameter is responsible for what the generated link contains:</p>
1529
1530 <ul>
1531 <li><code class="language-plaintext highlighter-rouge">type='default'</code> (also applies if no <code class="language-plaintext highlighter-rouge">type</code> is given) outputs the formatted username relying on the “User Marking” setting of the relevant user group.
1532 Additionally, the user popover card will be shown when hovering over the generated link.</li>
1533 <li><code class="language-plaintext highlighter-rouge">type='plain'</code> outputs the username without additional formatting.</li>
1534 <li><code class="language-plaintext highlighter-rouge">type='avatar(\d+)'</code> outputs the user’s avatar in the specified size, i.e., <code class="language-plaintext highlighter-rouge">avatar48</code> outputs the avatar with a width and height of 48 pixels.</li>
1535 </ul>
1536
1537 <p>The last special attribute is <code class="language-plaintext highlighter-rouge">append</code> whose contents are appended to the <code class="language-plaintext highlighter-rouge">href</code> attribute of the generated anchor element.</p>
1538
1539 <p>All of the other attributes matching <code class="language-plaintext highlighter-rouge">~^[a-z]+([A-z]+)+$~</code>, except for <code class="language-plaintext highlighter-rouge">href</code> which may not be added, are added as attributes to the anchor element.</p>
1540
1541 <p>Examples:</p>
1542
1543 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">user</span> <span class="na">object</span><span class="o">=</span><span class="nv">$user</span><span class="k">}</span>
1544 </code></pre></div></div>
1545
1546 <p>generates</p>
1547
1548 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"</span><span class="k">{</span><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">getLink</span><span class="o">()</span><span class="k">}</span><span class="s">"</span> <span class="na">data-object-id=</span><span class="s">"</span><span class="k">{</span><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">userID</span><span class="k">}</span><span class="s">"</span> <span class="na">class=</span><span class="s">"userLink"</span><span class="nt">&gt;</span>{@$user-&gt;getFormattedUsername()}<span class="nt">&lt;/a&gt;</span>
1549 </code></pre></div></div>
1550
1551 <p>and</p>
1552
1553 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">{</span><span class="na">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="k">}</span>
1554 </code></pre></div></div>
1555
1556 <p>generates</p>
1557
1558 <div class="language-smarty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"</span><span class="k">{</span><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">getLink</span><span class="o">()</span><span class="k">}</span><span class="s">"</span> <span class="na">foo=</span><span class="s">"bar"</span><span class="nt">&gt;</span>{@$object-&gt;getAvatar()-&gt;getImageTag(48)}<span class="nt">&lt;/a&gt;</span>
1559 </code></pre></div></div>
1560
1561
1562 <div class="tags">
1563
1564 </div>
1565
1566
1567
1568 </div>
1569
1570 </div>
1571 </div>
1572 </div>
1573
1574 <div class="footerBox">
1575 <div class="container">
1576 <div class="footerBoxLeft">
1577
1578 <a target="_blank" href="https://github.com/woltlab/woltlab.github.io/blob/master/pages/view/view_template-plugins.md" class="btn btn-default githubEditButton no_icon" role="button"><i class="fa fa-github fa-lg"></i> Edit on GitHub</a>
1579 <p>Site last generated: Mar 5, 2021</p>
1580 </div>
1581 <div class="footerBoxRight">
1582 <a class="no_icon" href="https://www.woltlab.com"><img src="https://docs.woltlab.com/5.3/images/woltlab-black.png" srcset="https://docs.woltlab.com/5.3/images/woltlab-black@2x.png 2x" height="40" width="204" alt=""></a>
1583 </div>
1584 </div>
1585 </div>
1586
1587 <div class="pageFooter">
1588 <div class="container">
1589 &copy; 20012021 <a class="no_icon" href="https://www.woltlab.com">WoltLab GmbH</a>. All rights reserved. | <a class="no_icon" href="https://www.woltlab.com/legal-notice/">Legal Notice</a> | <a class="no_icon" href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
1590 </div>
1591 </div>
1592 </body>
1593
1594 </html>