Help:Advanced templates

From Qi-Hardware
Jump to: navigation, search


This page covers advanced template techniques, in particular the use of variable template names and parameter names in templates. Readers should be thoroughly familiar with the standard template techniques found in Help:Template. Some techniques described below may be outdated or of limited use; for example, ParserFunctions may be more convenient than some of the branching techniques discussed.

In general, these techniques rely on the recursive (inside-out) processing of templates. When a template is processed, it translates template code into string values. These are often sent directly to the web browser for display, but they can be treated as code themselves. By enclosing the text strings in double-curly-brackets ( {{}} ), for instance, they can be reprocessed as template names or variable names, producing different results as the string values are changed.


  • This document refers to features currently only available in the Mediawiki software starting with version 1.6 and later.
  • The term "variable" has two uses in this document:
    • It is sometimes used as a synonym for magic words, which are system-based variables that can be accessed in the same manner as templates (thus {{NAMESPACE}} will return the name of the current namespace, depending on the page).
    • Otherwise, it is used to indicate that something may vary with context (thus, "Variable template names" means that the name of the template being called can change according to parameters or other variables).
  • Using "subst:" with manual recursion gives a stepwise replacement, useful for analyzing and explaining the working of templates calling other templates. For instance, compare {{{{tctc}} }} (discussed below) with {{{{subst:tctc}} }} on a sandbox page. Though both produce the same visible result, the first will will remain as the full code {{{{tctc}} }}, while the second will replace the inner template {{tctc}} with its value, leaving the code {{tc }}. See, e.g., Template talk:Lop.


[edit] Variable templates

<section begin=vartemp />In some cases, it may be useful for a template to call different templates depending on a variable or a passed parameter. This allows a type of branching that can be simpler than with ParserFunctions, though they are generally less versatile.<section end=vartemp />


Using a variable to choose a template - {{ {{NAMESPACE}} }}
The Magic Word {{NAMESPACE}} returns the current namespace, like so: {{NAMESPACE}} = Help. The outer brackets then process this result as a template in its own right - in this case Template:Help - which produces Template:Help.
Using a template to choose a template - {{{{tctc}} }}
the template {{Tctc}} contains the text "tc". This text is processed by the outer brackets as Template:tc which contains the word "{{Template:Tctc }}".

The extra spaces in the above examples are needed: without them, the code is not processed as a template or a magic word, but just as a plain text string like so: {{{{NAMESPACE}}}}.

Using a variable to choose a template, and passing it a parameter - {{{{{2}}}x|{{{1}}}}}
The second parameter passed becomes part of the template name to which the first parameter is passed. In this case {{2x|{{{1}}}}} would produce {{{1}}}{{{1}}}, {{3x|{{{1}}}}} would produce {{{1}}}{{{1}}}{{{1}}}, and etc. Template:Histogram uses this technique repeatedly in {{histogram|X|4|7|3|2|9}} to produce the following 5 line histogram:

Since there is no convenient way to test substring values (even using parser functions), these techniques work best if the variable template has only a limited number of possible values. For example, the variable {{CURRENTDAYNAME}} has only seven possible values, so all cases can be handled with seven templates (or fewer, if some are redirects), and the variable {{NAMESPACE}} currently has 18 possible values. On the other hand, {{CURRENTTIME}} has 1440 possible values, which would require the creation of 1440 template pages or redirects, which would be impractical. Even with parser functions, all 1440 values would have to be listed (see Template:Tim and Template:Tim). In cases like that, it would be better to construct the template with multiple parameters that each only take a few values, rather than trying to account for all possibilities in a single parameter.

If a template depends on PAGENAME, then the many possible values of PAGENAME may not be a problem. Only the pagenames of the pages that call the template apply, and these can be limited to a small, enumerable set.

[edit] Templates passed as parameters

Templates can be passed as parameters to other templates. This can mean either that the template is evaluated and the result is passed as a parameter or that the template name is passed and evaluated as part of the other template.

Passing a template result - {{3x|{{tc}}}}
Template:3x contains {{{1}}}{{{1}}}{{{1}}}. {{3x|{{tc}}}} first evaluates {{tc}} (which yields the word in), and passes that to template {{3x}}, to give Template:3x
Passing a template result recursively - {{3x|{{5x|{{tc}}}}}}
Just as above except {{tc}} (in) is first passed to {{5x}} and the result of that is passed to {{3x}}, to give Template:3x.
Passing a template name - {{tt|t|V}}
Template:tt - {{{{{1}}}|a{{{2}}}b{{{2}}}c{{{2}}}d}} - takes the value V (passed as the second parameter) and produces aVbVcVd. This value is then passed to template:t (which was passed by name as the first parameter), producing "Template:Tt"

[edit] Variable parameters

A parameter name in a template can be a variable. This is useful if you want the behavior of a template to change based on the information that is provided to it.

Choosing parameters contextually - {{t pnd|parameter name}}

Template:t p contains {{{capital}}} is the capital of {{{country}}}, with two parameters - "capital" and "country". Template:Timc can be used to select which parameter is used in a particular case. Thus:
This... Produces this
{{t pnd|capital}} Template:T pnd
{{t pnd|country}} Template:T pnd
{{t pnd|something else}} Template:T pnd

This applies to integer parameters as well, since integer parameters can be specified using the "#=" notation. Passing the integer value N to {{t pnd}} as its parameter will make it look for the Nth unnamed parameter.

Parameter name from another parameter in the same template - {{tvv|parameter=foo|foo=bar}}
Using Template:tvv, which contains {{{{{{parameter}}}}}}, the code Template:Tvv will first set the parameter named "foo" to the value "bar", and then set the parameter named "parameter" to the value of foo, yielding Template:Tvv. The order in which the parameters appear in the code does not matter, but the technique cannot be applied multiple times—e.g., {{foo}}—and it may fail if substituted rather than transcoded.

The following branching methods are generally obsolete; Parser Functions give easier forms of control. However, they may be useful in particular situations, and point out some unintuitive features of template behavior.

Blank parameter branch - {{t pdc|abc}}, {{t pdc}}, {{t pdc}}
Template {{tts}} contains Template:Tcw, which takes a parameter with a blank name (i.e., {{tts}}) and processes it as a template, but ignores any other parameter. Template:T pdc, which contains Template:Tcw, will produce Template:T pdc in the first and last cases, {{t pdc}} will give Template:T pdc because a blank parameter name is explicitly passed.
If-defined branches - {{{test{{{test|}}}|{{{then}}}}}}
If no value is passed for the parameter test, then {{{test{{{test|}}}|{{{then}}}}}} resolves to {{{test|{{{then}}}}}} and returns a blank entry (since test is defined as blank). If the parameter "test" is assigned the value "boo", however, {{{test{{{test|}}}|{{{then}}}}}} resolves to {{{testboo|{{{then}}}}}}, and so long as no parameter "testboo" exists, then this will return the value of the parameter "then".

[edit] Variable variables (Magic Words)

Variables (Magic Words) names can also be generated as variables.

Magic word generated as a variable - {{t curr}}
Template:Timc gives the text {{CURRENTTemplate:T day}} without parameters, since it defaults to {{CURRENTDAY}}, but {{t curr|DAYNAME}} gives Template:T curr while {{t curr|MONTHNAME}} gives Template:T curr. Any magic word that begins with "CURRENT" can be accessed this way.
Namespace generated as a variable - {{ns:{{{1}}}}}
In Template:Namespace, which contains [[:Template:Namespace]], the last use of the parameter evaluates to a number #, and the entire phrase ns:# is evaluated as a template. Thus, {{namespace|4}} gives Template:Namespace, where Meta is the name of Namespace 4.

[edit] External examples

    • Template:Tiw, which contains a 2D array in the form {{{{{1}}}|{{{2}}}|1-1=a11|..|m-n=amn}}. The first parameter is the name of a template that provides a particular selection and presentation of a selected row of the array, e.g., Template:Tiw, the second parameter (which is the first parameter of the latter template) specifies the row. The latter template references element j of the row concerned by a tag of the form {{{{{{1}}}-j}}}

[edit] See also


Personal tools