Help:Parameter default
Notation: on this page the wikitext {{{a}}} is written as [a].
In a template, [a|b] is equal to [a] if that is defined, and else equal to b.
These results [a] and b can be end results, but they can also be parameter names, parameter values, template names, parts thereof, etc.
If the results are template names as part of template calls involving a parameter of the outer template which may be undefined, one can arrange that an inner template is called with a parameter depending on an undefined outer parameter only if the parameter concerned is not actually used in the inner template, e.g. dummy template Template:x0 containing "<noinclude>{{documentation}}</noinclude>
" can be called as {{x0|[a]}} even if [a] is undefined, see e.g. m:Template:foreach/pass1 (backlinks edit).
Limitation
In the case of multiple default parts, only the first applies: [a|b|c|d] is equivalent with [a|b]. The default part can only contain "|" as part of full template, parameter or link syntax within it, and within nowiki-tags. Note that "|" can be avoided in table syntax by applying HTML coding (element "<table>").
The expression for the parameter name can also contain "|", as part of full template or parameter syntax within it.
Examples, using Template:x3 containing "<noinclude>{{Please leave this line alone (template sandbox heading)}}<!--
* Welcome to the template sandbox! *
* Please leave this part alone *
* The page is cleared regularly *
* Feel free to try your editing skills below *
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■--></noinclude>
" and Template:t2 containing "[[w:List of people by name: {{{1}}}{{{2}}}|{{{1}}}{{{2}}}]]<noinclude>[[Category:Help:Templates templates]]</noinclude>
":
- {{{a|b|c|d}}} gives b
- {{{a|{{x3|b}}}}} gives
- {{{a|{{{b|c}}}}}} gives c
- {{{a|[[b|c]]}}} gives c
- {{{a|<nowiki>b|c</nowiki>}}} gives b|c - works fine for rendering text, but is not suitable for putting parameters b and c in a template call (there is no function for removing nowiki tags):
- {{t2|{{{a|<nowiki>b|c</nowiki>}}}}} gives [[w:List of people by name: b|c{{{2}}}|b|c{{{2}}}]]
- {{{{{x3|a}}|b}}} gives b - parameter aaa is undefined
- {{{{{{a|b}}}|c}}} gives c - parameter b is undefined
Expressions containing a parameter, with default
Consider the expression [a[b|c]|f([b])] occurring in a template, where f([b]) denotes an expression in [b].
Assume:
- [a[b]] is undefined for all applicable [b] (all values of parameter b for which the template is called)
- [ac]=d (the template is called with ac=d)
Then the expression gives f([b]) if [b] is defined, and otherwise d.
Note that the assumptions require that no applicable [b] has value c. If one wants to be able to use all letters and digits in [b], and also allow null (the empty string), then for c one can take e.g. "@".
If it is desirable or at least acceptable that if [b] is empty, the result is not f("") but "", just like when [b] is undefined, we can for example choose c and d to be the empty string. Then we have the expression [a[b|]|f([b])] occurring in the template, giving f([b]) if [b] is defined, and otherwise the empty string, under the following assumptions:
- [a[b]] is undefined for all applicable [b] (all values of parameter b for which the template is called)
- the template is called with "a=" (while normally a parameter specification in a template call represents a choice the user of the template has, the need to specify "a=" is an unfortunate technical requirement imposed on the user of the template; it can be shielded from the user by putting the template call inside another template; on projects where server-strain is a concern this may not be desirable).
The name "a" can be chosen such that no other parameters of the template have a name starting with it; then the first condition is fulfilled (apart from the case, already discussed, that [b] is the empty string).
If the result, f([b]) or the empty string, is for final display only, i.e., not for use in expressions for template names, parameter names, parameter values, page names in links, etc., an alternative is using CSS, see MediaWiki talk:Common.css.
Repetition
A "for-loop" is achieved using
m:Template:fors (backlinks edit), containing:
{{fors/aux |v@= |c={{{call}}} |pv={{{pv|1}}} |s={{{sep|}}} |pc1={{{pc1|=}}} |pc2={{{pc2|=}}} |pc3={{{pc3|=}}} |pc4={{{pc4|=}}}| 1={{{1|@}}}|2={{{2|@}}}|3={{{3|@}}} }}
with m:Template:fors/aux (backlinks edit), containing:
{{{v{{{1}}}|{{{{{c}}}|{{{pc1}}}|{{{pc2}}}|{{{pc3}}}|{{{pc4}}}|{{{pv}}}={{{1}}}}}}}} {{{v{{{2}}}|{{{s}}}{{{{{c}}}|{{{pc1}}}|{{{pc2}}}|{{{pc3}}}|{{{pc4}}}|{{{pv}}}={{{2}}}}}}}} {{{v{{{3}}}|{{{s}}}{{{{{c}}}|{{{pc1}}}|{{{pc2}}}|{{{pc3}}}|{{{pc4}}}|{{{pv}}}={{{3}}}}}}}}
In short form the latter consists of components
[ v[i] | [s] {{[c]|[pc1]|[pc2]|[pc3]|[pc4]|[pv]=[i]}} ]
(i = 1, 2, 3, for i = 1 without [s])
or in terms of the parameters of the first template:
[v[i|@] | [sep|] {{[call]|[pc1|]|[pc2|]|[pc3|]|[pc4|]|[pv|1]=[i]}} ]
This is indeed of the above-mentioned form [a[b|c]|f([b])], with a=v, b=i, c=@, and
f(x) = [sep|] {{[call]|[pc1|]|[pc2|]|[pc3|]|[pc4|]|[pv|1]=x}}
The assumptions mentioned above apply for d equal to null, and provided that no [i] is equal to "@".
Variations
Since v@=null we can also take make the concatenation the outer operation:
[v[i|@] | [sep|]] [v[i|@] | {{[call]|[pc1|]|[pc2|]|[pc3|]|[pc4|]|[pv|1]=[i]}} ]
Conditional statement
m:Template:if (backlinks edit) contains:
{{{else{{{test|}}}|{{{test{{{test|}}}|{{{then|}}}}}}}}}
or in short form:
[ else[test|] | [ test[test|] | [then|] ] ]
If [test] is defined this reduces to
[ else[test] | [ test[test] | [then|] ] ]
For test equal to null this reduces to [else|]; otherwise, if no parameter name starting with "test" or "else" applies except these themselves, then this reduces to [then|].
If [test] is undefined we get
[ else | [then|] ]
Server efficiency
Parameter default constructs are said to be more efficiently executed by the server than similar constructs using extra layers of templates.
See also
- m:Template:T opt par (backlinks edit) - examples