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>
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">
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>
27 <link rel=
"shortcut icon" href=
"https://docs.woltlab.com/5.3/images/favicon.ico">
29 <link rel=
"alternate" type=
"application/rss+xml" title=
"woltlab.github.io" href=
"https://docs.woltlab.com/5.3feed.xml">
32 $(document).ready(function() {
33 // Initialize navgoco with default options
34 $(
"#mysidebar").navgoco({
37 openClass: 'active', // open
38 save: false, // leave false or nav highlighting doesn't work right
50 $(
"#collapseAll").click(function(e) {
52 $(
"#mysidebar").navgoco('toggle', false);
55 $(
"#expandAll").click(function(e) {
57 $(
"#mysidebar").navgoco('toggle', true);
65 $('[
data-toggle=
"tooltip"]').tooltip()
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>
82 <a class=
"fa fa-home fa-lg navbar-brand" href=
"index.html"> <span class=
"projectTitle"> WoltLab Suite
5.3 Documentation
</span></a>
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 -->
90 <li><a href=
"https://www.woltlab.com" target=
"_blank">woltlab.com
</a></li>
96 <li><a href=
"https://github.com/WoltLab/WCF/" target=
"_blank">Code on github.com
</a></li>
100 <!-- entries with drop-downs appear here -->
101 <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
104 <!--comment out this block if you want to hide search-->
107 <div id=
"search-demo-container">
108 <input type=
"text" id=
"search-input" placeholder=
"search...">
109 <ul id=
"results-container"></ul>
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.',
132 <div class=
"container">
133 <div class=
"col-lg-12"> </div>
136 <div class=
"col-md-3">
140 <ul id=
"mysidebar" class=
"nav">
141 <li class=
"sidebarTitle">WoltLab Suite
5.3</li>
146 <a href=
"#">Getting Started
</a>
152 <li data-identifier=
"index"><a href=
"index.html">Introduction
</a></li>
161 <li data-identifier=
"getting-started_quick-start"><a href=
"getting-started_quick-start.html">Quick Start
</a></li>
171 <a href=
"#">PHP API
</a>
177 <li data-identifier=
"php_pages"><a href=
"php_pages.html">Pages
</a></li>
186 <li data-identifier=
"php_database-objects"><a href=
"php_database-objects.html">Database Objects
</a></li>
195 <li data-identifier=
"php_database-access"><a href=
"php_database-access.html">Database Access
</a></li>
204 <li data-identifier=
"php_exceptions"><a href=
"php_exceptions.html">Exceptions
</a></li>
213 <li class=
"subfolders">
219 <li data-identifier=
"php_api_caches"><a href=
"php_api_caches.html">Caches
</a></li>
224 <li data-identifier=
"php_api_comments"><a href=
"php_api_comments.html">Comments
</a></li>
229 <li data-identifier=
"php_api_cronjobs"><a href=
"php_api_cronjobs.html">Cronjobs
</a></li>
234 <li data-identifier=
"php_api_events"><a href=
"php_api_events.html">Events
</a></li>
239 <li data-identifier=
"php_api_form_builder"><a href=
"php_api_form_builder.html">Form Builder
</a></li>
244 <li data-identifier=
"php_api_package_installation_plugins"><a href=
"php_api_package_installation_plugins.html">Package Installation Plugins
</a></li>
249 <li data-identifier=
"php_api_user_activity_points"><a href=
"php_api_user_activity_points.html">User Activity Points
</a></li>
254 <li data-identifier=
"php_api_user_notifications"><a href=
"php_api_user_notifications.html">User Notifications
</a></li>
259 <li data-identifier=
"php_api_sitemaps"><a href=
"php_api_sitemaps.html">Sitemaps
</a></li>
269 <li data-identifier=
"php_code-style"><a href=
"php_code-style.html">Code Style
</a></li>
278 <li data-identifier=
"php_apps"><a href=
"php_apps.html">Apps
</a></li>
287 <li data-identifier=
"php_gdpr"><a href=
"php_gdpr.html">GDPR
</a></li>
297 <a href=
"#">Languages, Templates & CSS
</a>
303 <li data-identifier=
"view_languages"><a href=
"view_languages.html">Languages
</a></li>
312 <li data-identifier=
"view_templates"><a href=
"view_templates.html">Templates
</a></li>
321 <li data-identifier=
"view_css"><a href=
"view_css.html">CSS
</a></li>
331 <a href=
"#">JavaScript API
</a>
337 <li data-identifier=
"javascript_general-usage"><a href=
"javascript_general-usage.html">General Usage
</a></li>
346 <li class=
"subfolders">
347 <a href=
"#">New API
</a>
352 <li data-identifier=
"javascript_new-api_writing-a-module"><a href=
"javascript_new-api_writing-a-module.html">Writing a module
</a></li>
357 <li data-identifier=
"javascript_new-api_data-structures"><a href=
"javascript_new-api_data-structures.html">Data Structures
</a></li>
362 <li data-identifier=
"javascript_new-api_core"><a href=
"javascript_new-api_core.html">Core Functions
</a></li>
367 <li data-identifier=
"javascript_new-api_dom"><a href=
"javascript_new-api_dom.html">DOM
</a></li>
372 <li data-identifier=
"javascript_new-api_events"><a href=
"javascript_new-api_events.html">Event Handling
</a></li>
377 <li data-identifier=
"javascript_new-api_ajax"><a href=
"javascript_new-api_ajax.html">Ajax
</a></li>
382 <li data-identifier=
"javascript_new-api_dialogs"><a href=
"javascript_new-api_dialogs.html">Dialogs
</a></li>
387 <li data-identifier=
"javascript_new-api_browser"><a href=
"javascript_new-api_browser.html">Browser and Screen Sizes
</a></li>
392 <li data-identifier=
"javascript_new-api_ui"><a href=
"javascript_new-api_ui.html">User Interface
</a></li>
402 <li data-identifier=
"javascript_legacy-api"><a href=
"javascript_legacy-api.html">Legacy API
</a></li>
411 <li data-identifier=
"javascript_helper-functions"><a href=
"javascript_helper-functions.html">Helper Functions
</a></li>
420 <li data-identifier=
"javascript_code-snippets"><a href=
"javascript_code-snippets.html">Code Snippets
</a></li>
430 <a href=
"#">Package Components
</a>
436 <li data-identifier=
"package_package-xml"><a href=
"package_package-xml.html">package.xml
</a></li>
445 <li data-identifier=
"package_pip"><a href=
"package_pip.html">PIPs
</a></li>
455 <a href=
"#">Migration
</a>
461 <li class=
"subfolders">
462 <a href=
"#">Migrating from WSC
5.2</a>
467 <li data-identifier=
"migration_wsc-52_php"><a href=
"migration_wsc-52_php.html">PHP API
</a></li>
472 <li data-identifier=
"migration_wsc-52_templates"><a href=
"migration_wsc-52_templates.html">Templates and Languages
</a></li>
477 <li data-identifier=
"migration_wsc-52_libraries"><a href=
"migration_wsc-52_libraries.html">Third Party Libraries
</a></li>
483 <li class=
"subfolders">
484 <a href=
"#">Migrating from WSC
3.1</a>
489 <li data-identifier=
"migration_wsc-31_php"><a href=
"migration_wsc-31_php.html">PHP API
</a></li>
495 <li class=
"subfolders">
496 <a href=
"#">Migrating from WSC
3.0</a>
501 <li data-identifier=
"migration_wsc-30_php"><a href=
"migration_wsc-30_php.html">PHP API
</a></li>
506 <li data-identifier=
"migration_wsc-30_javascript"><a href=
"migration_wsc-30_javascript.html">JavaScript API
</a></li>
511 <li data-identifier=
"migration_wsc-30_templates"><a href=
"migration_wsc-30_templates.html">Templates
</a></li>
516 <li data-identifier=
"migration_wsc-30_css"><a href=
"migration_wsc-30_css.html">CSS
</a></li>
521 <li data-identifier=
"migration_wsc-30_package"><a href=
"migration_wsc-30_package.html">Package Components
</a></li>
527 <li class=
"subfolders">
528 <a href=
"#">Migrating from WCF
2.1</a>
533 <li data-identifier=
"migration_wcf-21_php"><a href=
"migration_wcf-21_php.html">PHP API
</a></li>
538 <li data-identifier=
"migration_wcf-21_templates"><a href=
"migration_wcf-21_templates.html">Templates
</a></li>
543 <li data-identifier=
"migration_wcf-21_css"><a href=
"migration_wcf-21_css.html">CSS
</a></li>
548 <li data-identifier=
"migration_wcf-21_package"><a href=
"migration_wcf-21_package.html">Package Components
</a></li>
559 <a href=
"#">Tutorials
</a>
565 <li data-identifier=
"tutorial_tutorial-series"><a href=
"tutorial_tutorial-series.html">Tutorial Series
</a></li>
579 var sidebar = $('#mysidebar');
580 var item = sidebar.find('.active');
581 if (item.length ===
0) {
582 var parent = 'view_templates';
584 sidebar.find('li[
data-identifier=
"' + parent + '"]').addClass('active');
588 sidebar.find(
".active").parents('li').toggleClass(
"active");
594 <div class=
"col-md-9">
595 <div class=
"post-header">
596 <h1 class=
"post-title-main">Template Plugins
</h1>
601 <div class=
"post-content">
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. -->
609 $( document ).ready(function() {
610 // Handler for .ready() called.
612 $('#toc').toc({ minimumHeaders:
0, listType: 'ul', showSpeed:
0, headers: 'h2,h3,h4' });
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
619 $(window).scrollTop(scroll_target -
10);
630 <h2 id=
"53-anchor"><span class=
"label label-info">5.3+
</span> <code class=
"language-plaintext highlighter-rouge">anchor
</code></h2>
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>
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>
638 <p>generates the same output as
</p>
640 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"nt"><a
</span> <span class=
"na">href=
</span><span class=
"s">"</span><span class="k
">{</span><span class="nv
">$object</span><span class="o
">-></span><span class="na
">getLink</span><span class="o
">()</span><span class="k
">}</span><span class="s
">"</span><span class=
"nt">></span><span class=
"k">{
</span><span class=
"nv">$object
</span><span class=
"o">-
></span><span class=
"na">getTitle
</span><span class=
"o">()
</span><span class=
"k">}
</span><span class=
"nt"></a
></span>
641 </code></pre></div></div>
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>
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>
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>
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>
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>
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.
658 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"nt"><a
</span> <span class=
"na">href=
</span><span class=
"s">"</span><span class="k
">{</span><span class="nv
">$entry</span><span class="o
">-></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->entryID}"</span><span class=
"nt">></span><span class=
"k">{
</span><span class=
"nv">$entry
</span><span class=
"o">-
></span><span class=
"na">subject
</span><span class=
"k">}
</span><span class=
"nt"></a
></span>
659 </code></pre></div></div>
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>
666 <p>is sufficient if
<code class=
"language-plaintext highlighter-rouge">Entry::getPopoverLinkClass()
</code> returns
<code class=
"language-plaintext highlighter-rouge">blogEntryLink
</code>.
</p>
668 <h2 id=
"53-anchorattributes"><span class=
"label label-info">5.3+
</span> <code class=
"language-plaintext highlighter-rouge">anchorAttributes
</code></h2>
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>
673 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"nt"><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">></span>
674 </code></pre></div></div>
685 <td><code class=
"language-plaintext highlighter-rouge">url
</code></td>
686 <td>destination URL
</td>
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>
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>
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>
703 <h2 id=
"append"><code class=
"language-plaintext highlighter-rouge">append
</code></h2>
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>
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>
709 <span class=
"k">{
</span><span class=
"nv">$templateVariable
</span><span class=
"k">}
</span> <span class=
"c">{* prints 'newValue *}
</span>
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>
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>
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>
719 <h2 id=
"assign"><code class=
"language-plaintext highlighter-rouge">assign
</code></h2>
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>
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>
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>
728 <h2 id=
"capture"><code class=
"language-plaintext highlighter-rouge">capture
</code></h2>
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>
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"><p
></span><span class=
"k">{
</span><span class=
"nv">$bar
</span><span class=
"k">}
</span><span class=
"nt"></p
></span>
736 <span class=
"k">{
</span><span class=
"nb">else
</span><span class=
"k">}
</span>
737 <span class=
"nt"><small
></span><span class=
"k">{
</span><span class=
"nv">$baz
</span><span class=
"k">}
</span><span class=
"nt"></small
></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>
742 <h2 id=
"concat"><code class=
"language-plaintext highlighter-rouge">concat
</code></h2>
744 <p><code class=
"language-plaintext highlighter-rouge">concat
</code> is a modifier used to concatenate multiple strings:
</p>
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>
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>
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>
753 <h2 id=
"counter"><code class=
"language-plaintext highlighter-rouge">counter
</code></h2>
755 <p><code class=
"language-plaintext highlighter-rouge">counter
</code> can be used to generate and optionally print a counter:
</p>
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>
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>
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>
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>
766 <p>Counter supports the following attributes:
</p>
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>
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>
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>
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>
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>
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>
803 <h2 id=
"currency"><code class=
"language-plaintext highlighter-rouge">currency
</code></h2>
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>
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>
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>
812 <h2 id=
"cycle"><code class=
"language-plaintext highlighter-rouge">cycle
</code></h2>
814 <p><code class=
"language-plaintext highlighter-rouge">cycle
</code> can be used to cycle between different values:
</p>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
866 <h2 id=
"date"><code class=
"language-plaintext highlighter-rouge">date
</code></h2>
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>
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>
873 <h2 id=
"31-dateinterval"><span class=
"label label-info">3.1+
</span> <code class=
"language-plaintext highlighter-rouge">dateInterval
</code></h2>
875 <p><code class=
"language-plaintext highlighter-rouge">dateInterval
</code> calculates the difference between two unix timestamps and generated a textual date interval.
</p>
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>
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>
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>
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>
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>
907 <h2 id=
"encodejs"><code class=
"language-plaintext highlighter-rouge">encodeJS
</code></h2>
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>
911 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"nt"><script
></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"></script
></span>
914 </code></pre></div></div>
916 <h2 id=
"encodejson"><code class=
"language-plaintext highlighter-rouge">encodeJSON
</code></h2>
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">&#
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>
921 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code>'{@$foo|encodeJSON}'
922 </code></pre></div></div>
924 <h2 id=
"escapecdata"><code class=
"language-plaintext highlighter-rouge">escapeCDATA
</code></h2>
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">]]
></code> with
<code class=
"language-plaintext highlighter-rouge">]]]]
><![CDATA[
></code>.
</p>
928 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><![CDATA[{@$foo|encodeCDATA}]]
></span>
929 </code></pre></div></div>
931 <h2 id=
"event"><code class=
"language-plaintext highlighter-rouge">event
</code></h2>
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>
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>
938 <h2 id=
"fetch"><code class=
"language-plaintext highlighter-rouge">fetch
</code></h2>
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>
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>
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>
947 <h2 id=
"filesizebinary"><code class=
"language-plaintext highlighter-rouge">filesizeBinary
</code></h2>
949 <p><code class=
"language-plaintext highlighter-rouge">filesizeBinary
</code> formats the filesize using binary filesize (in bytes).
</p>
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>
954 <h2 id=
"filesize"><code class=
"language-plaintext highlighter-rouge">filesize
</code></h2>
956 <p><code class=
"language-plaintext highlighter-rouge">filesize
</code> formats the filesize using filesize (in bytes).
</p>
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>
961 <h2 id=
"hascontent"><code class=
"language-plaintext highlighter-rouge">hascontent
</code></h2>
963 <p>In many cases, conditional statements can be used to determine if a certain section of a template is shown:
</p>
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>
970 <p>In some situations, however, such conditional statements are not sufficient.
971 One prominent example is a template event:
</p>
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"><ul
></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"><li
></span>Bar
<span class=
"nt"></li
></span>
977 <span class=
"k">{/
</span><span class=
"nb">if
</span><span class=
"k">}
</span>
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"></li
></span>
981 <span class=
"k">{/
</span><span class=
"nb">if
</span><span class=
"k">}
</span>
982 </code></pre></div></div>
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>
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"><ul
></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"><li
></span>Bar
<span class=
"nt"></li
></span>
992 <span class=
"k">{/
</span><span class=
"nb">if
</span><span class=
"k">}
</span>
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"></ul
></span>
997 <span class=
"k">{/
</span><span class=
"na">hascontent
</span><span class=
"k">}
</span>
998 </code></pre></div></div>
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>
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>
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"><ul
></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"></ul
></span>
1011 <span class=
"k">{
</span><span class=
"na">hascontentelse
</span><span class=
"k">}
</span>
1013 <span class=
"k">{/
</span><span class=
"na">hascontent
</span><span class=
"k">}
</span>
1014 </code></pre></div></div>
1016 <h2 id=
"htmlcheckboxes"><code class=
"language-plaintext highlighter-rouge">htmlCheckboxes
</code></h2>
1018 <p><code class=
"language-plaintext highlighter-rouge">htmlCheckboxes
</code> generates a list of HTML checkboxes.
</p>
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>
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>
1029 <th>Description
</th>
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>
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>
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>
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>
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>
1054 <td><code class=
"language-plaintext highlighter-rouge">selected
</code></td>
1055 <td>current selected value(s)
</td>
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>
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>
1068 <h2 id=
"htmloptions"><code class=
"language-plaintext highlighter-rouge">htmlOptions
</code></h2>
1070 <p><code class=
"language-plaintext highlighter-rouge">htmlOptions
</code> generates an
<code class=
"language-plaintext highlighter-rouge">select
</code> HTML element.
</p>
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>
1074 <span class=
"nt"><select
</span> <span class=
"na">name=
</span><span class=
"s">"bar"</span><span class=
"nt">></span>
1075 <span class=
"nt"><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">></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"></option
></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"></select
></span>
1078 </code></pre></div></div>
1084 <th>Description
</th>
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>
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>
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>
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>
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>
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>
1113 <td><code class=
"language-plaintext highlighter-rouge">selected
</code></td>
1114 <td>current selected value(s)
</td>
1119 <p>All additional attributes are added as attributes of the
<code class=
"language-plaintext highlighter-rouge">select
</code> HTML element.
</p>
1121 <h2 id=
"implode"><code class=
"language-plaintext highlighter-rouge">implode
</code></h2>
1123 <p><code class=
"language-plaintext highlighter-rouge">implodes
</code> transforms an array into a string and prints it.
</p>
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>
1132 <th>Description
</th>
1137 <td><code class=
"language-plaintext highlighter-rouge">from
</code></td>
1138 <td>array with the imploded values
</td>
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>
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>
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>
1155 <h2 id=
"52-ipsearch"><span class=
"label label-info">5.2+
</span> <code class=
"language-plaintext highlighter-rouge">ipSearch
</code></h2>
1157 <p><code class=
"language-plaintext highlighter-rouge">ipSearch
</code> generates a link to search for an IP address.
</p>
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>
1162 <h2 id=
"30-js"><span class=
"label label-info">3.0+
</span> <code class=
"language-plaintext highlighter-rouge">js
</code></h2>
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>
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>
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>
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>
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>
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>
1184 <h2 id=
"53-jslang"><span class=
"label label-info">5.3+
</span> <code class=
"language-plaintext highlighter-rouge">jslang
</code></h2>
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>
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>',
1195 </code></pre></div></div>
1197 <h2 id=
"lang"><code class=
"language-plaintext highlighter-rouge">lang
</code></h2>
1199 <p><code class=
"language-plaintext highlighter-rouge">lang
</code> replaces a language items with its value.
</p>
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>
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>
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>
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>
1214 <th>Description
</th>
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>
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>
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>
1233 <p>All additional attributes are available when parsing the language item.
</p>
1235 <h2 id=
"language"><code class=
"language-plaintext highlighter-rouge">language
</code></h2>
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>
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>
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>
1246 <h2 id=
"link"><code class=
"language-plaintext highlighter-rouge">link
</code></h2>
1248 <p><code class=
"language-plaintext highlighter-rouge">link
</code> generates internal links using
<code class=
"language-plaintext highlighter-rouge">LinkHandler
</code>.
</p>
1250 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"nt"><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&param2=A</span><span class="k
">{/</span><span class="na
">link</span><span class="k
">}</span><span class="s
">"</span><span class=
"nt">></span>Foo
<span class=
"nt"></a
></span>
1251 </code></pre></div></div>
1257 <th>Description
</th>
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>
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>
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>
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>
1280 <p>Additional attributes are passed to
<code class=
"language-plaintext highlighter-rouge">LinkHandler::getLink()
</code>.
</p>
1282 <h2 id=
"newlinetobreak"><code class=
"language-plaintext highlighter-rouge">newlineToBreak
</code></h2>
1284 <p><code class=
"language-plaintext highlighter-rouge">newlineToBreak
</code> transforms newlines into HTML
<code class=
"language-plaintext highlighter-rouge"><br
></code> elements after encoding the content via
<code class=
"language-plaintext highlighter-rouge">wcf\util\StringUtil::encodeHTML()
</code>.
</p>
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>
1289 <h2 id=
"30-page"><span class=
"label label-info">3.0+
</span> <code class=
"language-plaintext highlighter-rouge">page
</code></h2>
1291 <p><code class=
"language-plaintext highlighter-rouge">page
</code> generates an internal link to a CMS page.
</p>
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>
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>
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>
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>
1306 <th>Description
</th>
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>
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>
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>
1325 <h2 id=
"pages"><code class=
"language-plaintext highlighter-rouge">pages
</code></h2>
1327 <p><code class=
"language-plaintext highlighter-rouge">pages
</code> generates a pagination.
</p>
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>
1331 {@$pagesLinks}
<span class=
"c">{* prints same pagination again *}
</span>
1332 </code></pre></div></div>
1338 <th>Description
</th>
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>
1347 <td><code class=
"language-plaintext highlighter-rouge">controller
</code></td>
1348 <td>controller name of the generated links
</td>
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>
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>
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>
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>
1369 <h2 id=
"plaintime"><code class=
"language-plaintext highlighter-rouge">plainTime
</code></h2>
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>
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>
1377 <h2 id=
"53-plural"><span class=
"label label-info">5.3+
</span> <code class=
"language-plaintext highlighter-rouge">plural
</code></h2>
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>
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>
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"><h1
></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"></h1
></span>
1391 <span class=
"nt"><p
></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"></p
></span>
1392 <span class=
"nt"><p
></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"></p
></span>
1393 </code></pre></div></div>
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"><h1
></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"></h1
></span>
1398 <span class=
"nt"><p
></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"></p
></span>
1399 <span class=
"nt"><p
></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"></p
></span>
1400 </code></pre></div></div>
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"><h1
></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"></h1
></span>
1407 <span class=
"nt"><p
></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"></p
></span>
1408 <span class=
"nt"><p
></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"></p
></span>
1409 </code></pre></div></div>
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"><h1
></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"></h1
></span>
1416 <span class=
"nt"><p
></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"></p
></span>
1417 </code></pre></div></div>
1423 <th>Description
</th>
1429 <td>The value that is used to select the proper phrase.
</td>
1433 <td>The phrase that is used when no other selector matches.
</td>
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>
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>
1446 <h2 id=
"prepend"><code class=
"language-plaintext highlighter-rouge">prepend
</code></h2>
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>
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>
1452 <span class=
"k">{
</span><span class=
"nv">$templateVariable
</span><span class=
"k">}
</span> <span class=
"c">{* prints 'newValue *}
</span>
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>
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>
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>
1462 <h2 id=
"shortunit"><code class=
"language-plaintext highlighter-rouge">shortUnit
</code></h2>
1464 <p><code class=
"language-plaintext highlighter-rouge">shortUnit
</code> shortens numbers larger than
1000 by using unit suffixes:
</p>
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>
1470 <h2 id=
"smallpages"><code class=
"language-plaintext highlighter-rouge">smallpages
</code></h2>
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"><nav
></code> element and only showing
7 instead of
9 links.
</p>
1474 <h2 id=
"tablewordwrap"><code class=
"language-plaintext highlighter-rouge">tableWordwrap
</code></h2>
1476 <p><code class=
"language-plaintext highlighter-rouge">tableWordwrap
</code> inserts zero width spaces every
30 characters in words longer than
30 characters.
</p>
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>
1481 <h2 id=
"time"><code class=
"language-plaintext highlighter-rouge">time
</code></h2>
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>
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 '
<time
>' element *}
</span>
1486 </code></pre></div></div>
1488 <h2 id=
"truncate"><code class=
"language-plaintext highlighter-rouge">truncate
</code></h2>
1490 <p><code class=
"language-plaintext highlighter-rouge">truncate
</code> truncates a long string into a shorter one:
</p>
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>
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>
1500 <th>Parameter Number
</th>
1501 <th>Description
</th>
1507 <td>truncated string
</td>
1511 <td>truncated length;
<code class=
"language-plaintext highlighter-rouge">80</code> by default
</td>
1515 <td>ellipsis symbol;
<code class=
"language-plaintext highlighter-rouge">wcf\util\StringUtil::HELLIP
</code> by default
</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>
1524 <h2 id=
"53-user"><span class=
"label label-info">5.3+
</span> <code class=
"language-plaintext highlighter-rouge">user
</code></h2>
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>
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>
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>
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>
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>
1548 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"nt"><a
</span> <span class=
"na">href=
</span><span class=
"s">"</span><span class="k
">{</span><span class="nv
">$user</span><span class="o
">-></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
">-></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">></span>{@$user-
>getFormattedUsername()}
<span class=
"nt"></a
></span>
1549 </code></pre></div></div>
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>
1558 <div class=
"language-smarty highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"nt"><a
</span> <span class=
"na">href=
</span><span class=
"s">"</span><span class="k
">{</span><span class="nv
">$user</span><span class="o
">-></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">></span>{@$object-
>getAvatar()-
>getImageTag(
48)}
<span class=
"nt"></a
></span>
1559 </code></pre></div></div>
1574 <div class=
"footerBox">
1575 <div class=
"container">
1576 <div class=
"footerBoxLeft">
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>
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>
1587 <div class=
"pageFooter">
1588 <div class=
"container">
1589 © 2001 ‐
2021 <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>