Wikipedia:Conditional tables

From Wikipedia, the free encyclopedia
Jump to: navigation, search

ParserFunctions allow for the conditional display of table rows, columns or cells (and really, just about anything else). But Parser functions have some limits.

Basic use[edit]

The following example shows a basic use for #if:

{{#if:{{{variable_foo|}}}
|foo is set to '''{{{variable_foo}}}'''
|foo is ''blank''}}

Here, {{{variable_foo}}} is checked to see if it is defined with a non-blank value. The table below shows the output from a template call (we'll call the template {{Conditional tables/example 1}}) with different values for {{{variable_foo}}}:

Template call Result
{{Conditional tables/example 1}} foo is blank
{{Conditional tables/example 1|variable_foo=}} foo is blank
{{Conditional tables/example 1|variable_foo=value}} foo is set to value

Positional parameters {{{1}}} etc. work like named parameters:

{{#if:{{{1|}}}
|1st parameter is '''{{{1}}}'''
|1st parameter is ''blank''}}

Template call Result
{{Conditional tables/example 1b| |bar}} 1st parameter is blank
{{Conditional tables/example 1b|foo|bar}} 1st parameter is foo
{{Conditional tables/example 1b|[[m:|not empty]]}} 1st parameter is not empty
{{Conditional tables/example 1b|bad=idea}} 1st parameter is blank
{{Conditional tables/example 1b|1=ok=yes}} 1st parameter is ok=yes

Note how the pipe symbol (vertical bar) in the link works as is, it's not quite that easy within Wiki tables, see below.

Hiding rows entirely[edit]

It's also possible to hide rows of data within a table, however, there are issues you should be aware of.

Incorrect usage[edit]

Unfortunately #if and the MediaWiki table syntax do not work together well. For example, the following, {{Conditional tables/example 2}} is invalid and will not work:

{| class="infobox"
{{#if:{{{variable_foo|}}}
|
|-
! Foo
| {{{variable_foo}}}
}}
|-
! Bar
| {{{variable_bar}}}
|}

The table below demonstrates the effect when {{Conditional tables/example 2}} is used:

Template call Result
{{Conditional tables/example 2}} -
Foo
Bar {{{variable_bar}}}
{{Conditional tables/example 2|variable_foo=}} -
Foo
Bar {{{variable_bar}}}
{{Conditional tables/example 2|variable_foo=|variable_bar=bar}} -
Foo
Bar bar
{{Conditional tables/example 2|variable_foo=value}}
Bar {{{variable_bar}}}
{{Conditional tables/example 2|variable_foo=value|variable_bar=bar}}
Bar bar

The problem is with the usage of the pipe character (|). This character, in template calls, is used to separate parameters and so is invalid.

Correct usage[edit]

Plan A[edit]

One method of hiding rows in tables (or other structures within tables) uses HTML directly.[1] HTML is more complicated than MediaWiki table syntax, but not much more so. In general, there are only a handful of HTML tags you need to be aware of

  • <tr> - this tag creates a new row (similar to |- in MediaWiki table syntax)
  • <th> - this tag creates a new header cell within a row (similar to ! in MediaWiki table syntax)
  • <td> - this tag creates a new cell within a row (similar to | in MediaWiki table syntax)
  • <caption> - this tag creates a caption (similar to |+ in MediaWiki table syntax)

Working from the invalid template example above, by switching to HTML we end up with the following code:

{| class="infobox"
{{#if:{{{variable_foo|}}}
|<tr><th>Foo</th><td>{{{variable_foo}}}</td></tr>}}
|-
! Bar
| {{{variable_bar}}}
|}

The code above is in {{Conditional tables/example 2a}}. As before, the table below demonstrates the effect when it's used:

Template call Result
{{Conditional tables/example 2a}}
Bar {{{variable_bar}}}
{{Conditional tables/example 2a|variable_foo=}}
Bar {{{variable_bar}}}
{{Conditional tables/example 2a|variable_foo=|variable_bar=bar}}
Bar bar
{{Conditional tables/example 2a|variable_foo=value}}
Foo value
Bar {{{variable_bar}}}
{{Conditional tables/example 2a|variable_foo=value|variable_bar=bar}}
Foo value
Bar bar

Plan B[edit]

As noted above the only problem is the vertical bar or pipe symbol within a template. Often it's good enough to replace problematic characters by numeric references, e.g. "{" by &#123;, "|" by &#124;, and "}" by &#125;. But for Wiki tables a real "|" delimiter is required — using &#124; doesn't work as delimiter.

A simple trick allows to protect the "|" in template parameter values while still arriving as real "|" delimiter in the Wiki table, see Template:!(edit talk links history). Note that "!" (exclamation mark) has no problems with templates, it's the other delimiter used in Wiki tables. Here's the code for plan B:

{| class="infobox"
{{#if:{{{foo|}}}|
{{!}}-
! Foo
{{!}} {{{foo}}}
}}
|-
! Bar
| {{{bar}}}
|}

The code above is in {{Conditional tables/example 2b}}. As before, the table below demonstrates the effect when it's used:

Template call Result
{{Conditional tables/example 2b|bar=nobar}}
Bar nobar
{{Conditional tables/example 2b|foo=|bar=vbar}}
Bar vbar
{{Conditional tables/example 2b|foo=value}}
Foo value
Bar {{{bar}}}
{{Conditional tables/example 2b|foo=value|bar=vbar}}
Foo value
Bar vbar

Plan C[edit]

Perhaps the simplest option is to use the conditional with the CSS "display: none" property as follows:

{| class="infobox"
|- {{#if: {{{variable_foo|}}} | | style="display: none;" }}
! Foo
| {{{variable_foo}}}
|-
! Bar
| {{{variable_bar}}}
|}

In this way there is no need for the wikitables pipe character to appear in the #if conditional.

The code above is in {{Conditional tables/example 2c}}. As before, the table below demonstrates the effect when it's used:

Template call Result
{{Conditional tables/example 2c|variable_bar=bar}}
Foo {{{variable_foo}}}
Bar bar
{{Conditional tables/example 2c|variable_foo=|variable_bar=bar}}
Foo
Bar bar
{{Conditional tables/example 2c|variable_foo=foo}}
Foo foo
Bar {{{variable_bar}}}
{{Conditional tables/example 2c|variable_foo=foo|variable_bar=bar}}
Foo foo
Bar bar

Getting help[edit]

If you find yourself unable to get a template to behave how you like, you can try asking on Village pump, placing a request at Requested templates, or contacting an editor via IRC.

See also[edit]

For avoiding blank rows in the case of successive optional rows, see m:Help:Table#Conditional_table_row.

For more information on #if (and other # functions), see:

The following help topics deal with templates:

This help topic deals with table design (since most templates use tables, this may be useful):

And finally:

  • Template:Infobox - a "generic" infobox template which demonstrates these methods.

Notes and references[edit]

  1. ^ Using HTML table code in templates can make them non-portable to other MediaWiki wikis. This is because Wikipedia and other Wikimedia Foundation wikis process wikitext through HTML Tidy; most other wikis do not have the same setup, and the HTML table tags do not render. See Wikipedia:WikiProject Transwiki#Special templates.