Modèles
Note : si vous modifiez cette page, vous acceptez de placer votre contribution sous licence CC0. Plus d’informations sont disponibles sur le projet Aide dans le domaine public. |
Si vous avez des textes standard que vous voulez inclure sur plusieurs pages, les modèles (templates) de MediaWiki peuvent vous aider. À la différence des extensions et des fichiers multimédia , il n'y a pas de lieu centralisé pour le stockage des modèles. Les modèles peuvent être écrits nouvellement ou, pour enregistrer la copie d'un travail déjà réalisé venant d'un autre wiki comme Wikipedia et être importé dans le wiki cible.
Utilisation de base
Les modèles sont des pages wiki standard dont le contenu est conçu pour être transclus (inclus) à l'intérieur d'autres pages. Par convention le nom des modèles doit avoir le préfixe "Template:
", qui l'assigne à cet espace de noms en plus de cela, vous pouvez les créer comme n'importe quelle autre page wiki.
Pour transclure un modèle, utilisez les accolades doubles ouvrantes et fermantes {{nom du modèle}}
.
L'utilisation la plus simple des modèles est la suivante : créez une page nommée Template:Welcome
avec pour contenu :
Bonjour ! Bienvenue sur le wiki.
Vous avez créé votre premier modèle ! Maintenant insérez le code ci-dessous dans une nouvelle page :
{{Welcome}}
Lorsque la nouvelle page est vue, le texte "Bonjour ! Bienvenue sur le wiki." apparaîtra à la place de {{Welcome}}
. Le contenu du modèle est transclus dans l'autre page, c'est-à-dire qu'il est intégré dans la page.
Vous pouvez ensuite insérer {{Welcome}}
à n'importe quel endroit de n'importe quelle page où vous voulez souhaiter la bienvenue à quelqu'un. Supposez qu'il soit utilisé dans 100 pages. Si vous changez ensuite le contenu du modèle par :
Salut ! Bienvenue sur ce merveilleux wiki.
et si vous revisitez n'importe laquelle des 100 pages où le modèle est utilisé, vous verrez le nouveau texte à la place de l'original. De cette façon, vous avez changé le contenu de 100 pages sans les avoir éditées, parce que le modèle est transclus dans ces pages.
C'est le mécanisme de base. Plusieurs fonctionnalités supplémentaires de transclusion enrichissent ce mécanisme et rendent les modèles très utiles.
Manière d'appeler un modèle
Les modèles peuvent être utilisés dans d'autres pages de plusieurs manières :
{{Nom du modèle}}
: comme montré plus haut, ce lien est remplacé de manière dynamique par le contenu de la page "[[Template:Nom du modèle]]" en cours au moment où la page avec le lien est chargée. Mais le lien reste inchangé dans la page source. Parce que l'appel du modèle reste dans le source des pages, toute modification ultérieure faite à Template:Name est vue de la page contenant l'appel du modèle. Egalement, la page sera listée parmis les pages (link to) qui appellent le modèle.{{subst:Nom du modèle}}
— avec cette notation, le lien est remplacé une fois pour toutes par le contenu de la page [[Template:Nom du modèle]] au moment où vous enregistrez la page avec le lien : une copie du contenu de [[Template:Nom du modèle]] sera insérée à la place du lien vers le modèle. Le contenu du modèle devient alors un élément à part entière de la page qui l'inclut, et peut être modifié normalement, indépendamment de l'original.Les changements ultérieurs effectués dans le modèle ne seront plus propagés sur votre page par le lien.C'est à dire une copie du contenu de Template:Name sera substitué par l'appel du modèle. Aucun lien n'est maintenu entre la page et le modèle, ce qui permet ensuite de les mettre à jour séparément sans interférence. En effet, il existe une petite différence entre substituer le contenu de cette manière et le saisir simplement à la main dans le source de la page. Voir Aide:Substitution pour d'autres informations.{{safesubst:Nom}}
— ceci a été introduit pour permettre la substitution récursive dans les cas où des modèles contiennent des appels à d'autres modèles ou fonctions d'analyse. Voir Aide:Substitution pour plus d'informations.{{msgnw:Nom}}
- ceci présente le modèle de telle manière que le contenu du modèle s’affiche en syntaxe wiki brute (comme le fait<nowiki>
) quand la page qui le contient est visualisée. Par exemple,{{msgnw:Template:Thankyou}}
affiche :
<noinclude> <languages/> </noinclude> '''Un petit remerciement...''' pour {{{reason|{{{1}}}}}}. bises, {{{signature|{{{2}}}}}} <noinclude> [[Category:Template examples{{#translation:}}|{{PAGENAME}}]] </noinclude>
En fait, une page ordinaire du wiki peut être utilisée comme un modèle, simplement en spécifiant l'espace de nom où elle se trouve, et donc :
{{Template:Nom de la page}}
transclut la page nommée Modèle:Nom de page (équivaut à{{Template:Nom de la page}}
){{Talk:Nom de la page}}
transclut la page nommée Discussion:Nom de la page{{:Nom de la page}}
inclut[[Nom de la page]]
{{subst::Nom de la page}}
est remplacé par le contenu de[[Nom de la page]]
Si un tel espace de noms n'existe pas, le titre complet est considéré comme étant un modèle :
{{Foo:Bar}}
transclut Template:Foo:Bar
Indépendamment de la syntaxe utilisée, le nom du modèle peut être relatif à la page actuelle.
Par exemple, si {{/bar}}
est appelé sur la page foo, il va transclure la page foo/bar.
Il peut aussi être généré automatiquement.
Par exemple, {{ {{foo}} }}
appelle Template:foo et interprète le résultat comme le nom d'un autre modèle à appeler.
Paramètres
Pour enrichir le mécanisme de transclusion, Mediawiki permet de passer des paramètres à un modèle lorsqu'il est transclus. Les paramètres permettent au modèle d'afficher des contenus différents ou d'avoir des comportements différents.
Supposons que vous vouliez insérer une petite note de remerciement sur la page de discussion d'autres utilisateurs, comme ceci :
Un petit remerciement...
pour tous tes efforts.
bises, Moi
La note de remerciement contiendra la raison du remerciement (dans ce cas, tous tes efforts) et une signature (Moi). Votre but est que tout utilisateur soit capable de remercier tout autre utilisateur, quel qu'en soit le motif.
Pour que la note ait la même apparence partout où elle est utilisée, vous pouvez définir un modèle appelé Template:Thankyou , par exemple. Bien que la note doive avoir la même apparence à chaque fois qu'un utilisateur remercie un autre utilisateur, son contenu spécifique (c'est à dire la raison et la signature) sera différent. Pour cela, vous devez les passer en tant que paramètres. Si on omet les autres éléments de mise en forme de la boîte et de l'image, le contenu principal du modèle sera celui-ci :
'''Un petit remerciement...'''
pour {{{1}}}.
bises, {{{2}}}
Notez l'utilisation de {{{1}}}
et {{{2}}}
. C'est la manière d'identifier, à l'intérieur du modèle, les paramètres qui lui sont passés lorsqu'il sera utilisé. Notez qu'à l'intérieur du modèle chaque paramètre est encadré par trois accolades : {{{ }}}
. Cela diffère de l'utilisation normale d'un nom de modèle.
Quand vous utilisez le modèle sur une page, vous complétez les valeurs des paramètres, séparés par un caractère "pipe" (|
). MediaWiki permet la transmission des paramètres aux modèles selon trois manières : anonymement, numéroté, et nommé.
Paramètres anonymes
Pour passer des paramètres anonymes, listez les valeurs de ces paramètres de manière séquentielle :
{{Thankyou/fr|pour tous tes efforts|Moi}}
Dans ce cas, le modèle {{Thankyou/fr}}
reçoit les paramètres {{{1}}}=pour tous tes efforts
et {{{2}}}=Moi
, ce qui produit :
Un petit remerciement...
pour tous tes efforts.
bises, Moi
L'ordre de passage des paramètres anonymes est crucial pour le comportement du modèle. Inverser l'ordre des paramètres, comme ceci :
{{Thankyou/fr|Moi|tous tes efforts}}
produirait ce résultat :
Un petit remerciement...
pour Moi.
bises, tous tes efforts
{{{1}}}
, etc.) ne fonctionne qu'avec des paramètres anonymes. Tout paramètre identifié par son nom, comme montré ci-après, ne sera plus accessible dans le modèle en utilisant un numéro d'ordre.
Paramètres numérotés
Pour passer des paramètres numérotés, identifiez chaque paramètre quand vous le passez :
{{Thankyou/fr|2=Moi|1=ton amitié}}
Cette fois, le modèle {{Thankyou/fr}}
reçoit comme paramètres {{{1}}}=ton amitié
et {{{2}}}=Moi
, même s'ils ont été fournis dans l'ordre inverse, et produit le résultat :
Un petit remerciement...
pour ton amitié.
bises, Moi
- Exemples
{{Thankyou|1=ajouter “=”|2=Moi}}
produit
Un petit remerciement...
pour ajouter “=”.
bises, Moi
Paramètres nommés
La troisième façon de passer des paramètres est d'utiliser des noms, à la place de nombres. Dans ce cas, le contenu du modèle deviendrait :
'''Un petit remerciement...''' pour {{{reason}}}. bises, {{{signature}}}
Dans le modèle, on utilise {{{reason}}}
et {{{signature}}}
pour identifier chaque paramètre, au lieu des numéros. Pour passer ces paramètres par leur nom, identifiez chaque paramètre lorsque vous le passez :
{{thankyou/fr|signature=Moi|reason=être toi-même}}
Dans ce cas, le modèle {{Thankyou/fr}}
reçoit les paramètres {{{reason}}}=être toi-même
et {{{signature}}}=Moi
et produit le résultat :
Un petit remerciement...
pour être toi-même.
bises, Moi
Les paramètres nommés sont sensibles à la casse, donc :
{{Thankyou/fr|signature=Moi|Reason=être moi-même|reason=being case-sensitive}}
produit :
Un petit remerciement...
pour being case-sensitive.
bises, Moi
L'avantage d'utiliser des paramètres nommés dans votre modèle, en plus d'apporter une flexibilité quant à l'ordre dans lequel on peut passer les paramètres, est que le code du modèle est beaucoup facile à comprendre s'il y a beaucoup de paramètres.
Les espaces et les nouvelles lignes sont automatiquement supprimés au début et à la fin des noms et des valeurs des paramètres nommés, mais sont conservés dans les paramètres sans nom.
Utiliser des paramètres nommés avec des paramètres non nommés
Si le modèle prend cela en charge, les deux types de paramètres peuvent être utilisés dans un appel.
Par exemple {{Thankyou|supporting both parameter types|signature=Me}}
donnerait :
Un petit remerciement...
pour supporting both parameter types.
bises, Me
Soyez prudent lorsque vous faites cela, car cela peut entraîner des résultats contradictoires car les numéros des paramètres non nommés ne sont basés que sur les paramètres anonymes, et non sur les paramètres nommés.
Par exemple {{Thankyou|Me|reason=supporting both parameter types}}
donne :
Un petit remerciement...
pour supporting both parameter types.
bises, {{{2}}}
Le modèle est codé pour préférer le paramètre nommé pour son intérêt sur le paramètre non nommé, ce qui entraîne que le Me est perdu et qu'il n'y a pas de signature.
Ce qui résulte dans l'affichage de {{{2}}}, comme expliqué ci-après.
Valeurs par défaut
Si vous incluez un modèle qui attend des paramètres, mais sans lui fournir leurs arguments, comme ici :
{{Thankyou/fr}}
dans l'exemple des paramètres numérotés ci-dessus vous obtiendriez ce qui suit :
Un petit remerciement...
pour {{{1}}}.
bises, {{{2}}}
À partir du moment où aucun argument n'a été passé au modèle, ce dernier affiche les paramètres eux-mêmes, au lieu de leurs valeurs respectives. Dans ce cas, il serait plus utile de définir des valeurs "par défaut" pour les paramètres, c.à.d des valeurs qui seront utilisées si aucune valeur n'est fournie. Par exemple, si le contenu du modèle est changé pour :
'''Un petit remerciement...'''
pour {{{reason|tout}}}.
bises, {{{signature|Moi}}}
alors {{{reason|tout}}}
définit que si aucun argument n'est fourni pour le paramètre {{{reason}}}
, alors la valeur tout
sera utilisée. De même, le paramètre {{{signature|Moi}}}
fait que la valeur par défaut de {{{signature}}}
est Moi
. Maintenant, inclure le modèle à nouveau et sans passer d'argument donnera le résultat suivant :
Un petit remerciement...
pour tout.
bises, Moi
{{foo|bar=}}
ou {{foo|bar=|baz=qux}}
, le modèle foo
considère le paramètre bar
comme valant ""
. C'est différent du cas où les paramètres sont tous omis, ce qui les laisse à des valeurs non définies et déclenche le mécanisme des valeurs par défaut décrit ci-dessus.{{#if:{{{1|}}}|{{{1|}}}|undefined}}
renvoie non défini si le paramètre est soit indéfini ou vide, tandis que {{{1|undefined}}}
le fait uniquement si le paramétre est non défini.Souvent les valeurs par défaut sont utilisées pour préciser les noms alternatifs des paramètres.
Par exemple, si vous avez {{{a|{{{b|}}} }}}
, le modèle cherchera d'abord un paramètre qui s'appelle « a ».
S'il n'est pas renseigné, il utilisera le paramètre « b ».
Si ni « a » ni « b » ne sont renseignés, il ne produira rien.
Transférer des paramètres vers d'autres modèles
Si la syntaxe à plat du paramètre est générée par l'appel du modèle ci-dessus, puis passée à un autre modèle, elle n'est pas interprétée comme un paramètre. Cela signifie que {{Thankyou2 }}, qui appelle simplement {{Thankyou }} sans paramètre, ne fonctionne pas : {{thankyou2|everything|me}} → Un petit remerciement... pour {{{1}}}. bises, {{{2}}}
Vous devez plutôt passer explicitement le paramètre à l'autre modèle, c'est-à-dire si {{Thankyou3 }} contient
{{thankyou|{{{1}}}|{{{2}}}}}
alors ceci fonctionne correctement : {{thankyou3|everything|me}} → Un petit remerciement... pour everything. bises, me
Cet exemple ne conserve pas le caractère vide ou non défini des valeurs de paramètre - pour cela il vous faudrait une syntaxe plus complexe.
Paramètres vides et paramètres non définis
Le {{t2demo|| a }}
(voir {{T2demo }}) avec une barre verticale double, initialise le premier paramètre à une chaîne vide au lieu de le laisser non défini.
Cela produit la sortie start--middle- a -end
, similaire à la manière dont {{t2demo|1=|2= a }}
produit start--middle- a -end
.
D'un autre côté, en déclarant explicitement le paramètre "2" à "a," le premier paramètre non nommé reste non défini :
{{t2demo|2= a }} résulte en start-{{{1}}}-middle- a -end
Si le deuxième paramètre ne doit pas être coupé, il doit être non nommé.
Par conséquent, vous pouvez attribuer une chaîne vide au premier paramètre, mais vous ne pouvez pas le laisser indéfini.
Rendre équivalentes l'absence et la non-définition
Les bonnes pratiques de codage des modèles impliquent de passer une chaîne vide à un paramètre pour fonctionner de la même manière que si on lui attribuait aucune valeur. Cela rend les choses plus faciles et plus cohérentes.
Par exemple, l'utilisation de p=
peut montrer qu'un modèle a un paramètre "p" sans valeur encore.
Pour créer une chaîne vide et un équivalent de valeur indéfinie, utilisez les approches suivantes :
- Utilisez exclusivement
{{{p|}}}
au lieu de{{{p}}}
ouq
où "q" est une valeur non vide. - Utilisez des contrôles conditionnels comme
{{#if:{{{p|}}}|..{{{p}}}..|..}}
, pour vous assurer que{{{p}}}
est utilisé que s'il a une valeur.
Si pour une raison quelconque vous voulez traiter les paramètres non définis différemment des paramètres vides ou toute autre valeur possible, vous pouvez comparer le même paramètre deux fois avec des valeurs par défaut différentes, comme {{#ifeq:{{{foo|bar}}}|{{{foo|baz}}}|parameter is defined|parameter is undefined}}
.
Utiliser le signe égale dans les paramètres non nommés
Les paramètres non nommés peuvent inclure le signe égal, mais cela doit être fait indirectement. Voici quelques méthodes qui utilisent template:T1demo :
- Valeur par défaut pour le paramètre indéfini
Assigner une valeur par défaut à un paramètre non défini :
{{T1demo|{{{1| a=b }}}}}
Ce qui donne : start a=b end
.
- En utilisant la fonction d'analyse
{{=}}
Utiliser une fonction d'analyse syntaxique qui inclut un signe égal de manière sécurisée :
{{T1demo| a{{=}}b }}
Ce qui donne : start a=b end
.
- Entités HTML
Remplacer le signe égal par une entité HTML pour l'affichage :
{{T1demo| a=b }}
Ce qui donne : start a=b end
.
Le rendu est correct et n'affecte pas les autres paramètres.
Gestion des accolades et des crochets non appairés
Les accolades non appairées ({{
, }}
) ou les crochets ([[
, ]]
) doivent être encadrées par des balises nowiki ou utiliser les entités HTML :
- Pour faire le rendu des accolades il y a deux options :
- Utiliser
<nowiki>{{</nowiki>
ou{
pour{
- Utiliser
<nowiki>}}</nowiki>
ou}
pour}
.
- Utiliser
- Utiliser
[
ou[
et]
pour]
.
Vous trouverez quelques exemples ci-dessous :
- Accolades non appairées
{{T1demo| <nowiki>{{</nowiki>content<nowiki>}}</nowiki> }}
Cela rend correctement les accolades sans casser le modèle.
- Crochets non appairés
{{T1demo| text [link] more text }}
Cela rend correctement les accolades sans casser le modèle.
Ce qui donne :
start text [link] more text end
Les éléments non appairés et qui ne sont pas encadrés par des balises nowiki empêchent soit l'expansion du modèle, ou sont pris comme des accolades de fermeture dans l'appel du modèle.
Vous trouverez quelques exemples ci-dessous :
{{T1demo|abc]]def[[ghi}}
Le développement ne se fera pas correctement à cause des crochets non appairés.
Utilisation correcte :
{{T1demo|abc<nowiki>]]</nowiki>def<nowiki>[[</nowiki>ghi}}
Ce qui donne :
startabc]]def[[ghiend
Crochets générés par modèle
La technique alternative quand vous devez passer des arguments avec des crochets non appairés est de les inclure à l'intérieur d'un autre modèle.. Dans cette situation, (qui existe avec {{(( }} et {{)) }}) sur ce wiki), les crochets non appairés seront rendues littéralement, et non décodées comme pour un autre appel de modèle. Par exemple :
{{t1demo|{{((}}t1demo{{))}}}}
donne : start{{t1demo}}end
Quand vous substituez un modèle, les inclusions de modèles ne sont pas analysées syntaxiquement tant que les substitutions ne sont pas faites (avec les mêmes mises en garde que celles expliquées ci-dessus) et encore une fois lors de la génération du wikicode résultant. Par exemple :
{{subst:((}}t1demo|foo}}
qui sera expansé lors de la sauvegarde en :
{{t1demo|foo}}
ce qui donnera :
startfooend
Si le wikicode généré par la première substitution inclut la syntaxe subst: il ne sera pas traité dans la même sauvegarde, mais peut être lors de la sauvegarde suivante. Cette technique peut être utilisée pour implémenter les substitutions récursives qui utilisent plusieurs sauvegardes pour s'évaluer.
Utiliser les barres verticales dans les valeurs de paramètre
Une valeur de paramètre ne peut pas contenir de barre verticale (|), car elle serait interprétée comme la fin du paramètre et le début du suivant.
Ceci peut être contourné en utilisant la fonction d'analyse {{!}}
, ou l'entité HTML &124;.
Ces deux méthodes ont un comportement légèrement différent qui peut s'avérer important dans certains cas particuliers comme lorsqu'un modèle produit une syntaxe wikitable.
Exemple :
{{T1demo|abc|def}}
donne :
startabcend
Le "def" n'est pas affiché car il est traité comme faisant partie d'un autre paramètre non nommé, que le modèle n'utilise pas.
{{T1demo|abc{{!}}def}}
donne :
startabc|defend
Le def s'affiche correctement.
{{T1demo|abc|def}}
donne :
startabc|defend
Le def s'affiche à nouveau correctement.
Formater les appels de modèles à l'aide de paramètres supplémentaires
Étant donné que les modèles ignorent les paramètres passés et non gérés spécifiquement, ils peuvent être utilisés comme moyen pour ajouter un espace blanc supplémentaire ou un contenu inutilisé à l'appel du modèle.
Par exemple :
{{template name|foo|bar|baz|mumble|quux}}
en supposant que le modèle ne reconnaisse pas SPACEN comme nom de paramètre, cela équivaut à :
{{template name|SPACE1=
|foo|SPACE2=
|bar|SPACE3=Random stuff
|baz|SPACE4=
|mumble|SPACE5=
quux
}}
Il est également possible d'utiliser le même nom pour chaque séparateur (souvent une chaîne vide), mais cela remplira Category:Pages using duplicate arguments in template calls, que de nombreux wikis préfèrent garder vide pour identifier les cas d'erreur utilisateur.
Ceci peut être utilisé afin que le modèle génère similairement à ses sorties, comme afficher chaque ligne de w:Template:Chess position à sa position réelle comme pour faire que le wikicode ait aussi l'aspect d'un échiquier.
Suivi de l'utilisation des paramètres
Il peut être judicieux pour un modèle d'ajouter un lien ou une catégorie à une page si un certain paramètre ou une combinaison de paramètres est utilisée, afin de déterminer si possible facilement quelles pages utilisent un paramètre donné et, par conséquent, quelles conséquences auraient la modification de ce paramètre dans le modèle.
Processus d'évaluation
D'une manière générale, les paramètres des modèles sont substitués dans le modèle après l'attribution des marques (tokenization). Ils ne sont pas évalués tant qu'ils ne sont pas utilisés.
Ceci a quelques conséquences.
- D'abord si vous avez un
Template:Start
contenant{{mytemplate
, et unTemplate:End
contenant|foo=bar}}
, et que vous mettez{{start}}{{end}}
sur une page, mytemplate ne sera pas transclus car les éléments tels que "|" ne peuvent pas être ajoutés par un modèle et ils conservent leur signification spéciale dans les modèles. Vous pouvez toujours utiliser les modèles pour contrôler le nom d'un paramètre ou du modèle, mais vous ne pouvez pas répartir l'appel d'un modèle sur plusieurs modèles. - Suppression du code mort : Si vous faites l'appel d'un modèle comme
{{foo|{{DISPLAYTITLE:Bar}} }}
, et queTemplate:Foo
ne contient pas {{{1}}}, alors leDISPLAYTITLE
n'est pas utilisé car il n'est évalué que lorsque c'est nécessaire et qu'ici aucun paramètre ne demande sa substitution, il est donc jamais évalué. Ceci apparait avec l'utilisation de Extension:ParserFunctions et peut être observé particulièrement dans sa combinaison avec le mot magiqueint:
qui dépend de la langue de l'utilisateur. Ceci n'est pas parfait et dans certains cas même si le résultat de l'expansion du modèle n'est pas utilisé (parce qu'il fait partie de la condition d'un test if par exemple), le processus qui l'évalue peut encore avoir des effets de bord. Par exemple tout lien généré ou tout autre modèle utilisé, seront encore ajoutés à Special:WhatLinksHere même s'il ne sont pas affichés.
Les paramètres du modèle sont passés par valeur, ce qui signifie qu'un modèle ne peut pas modifier ses arguments. Les paramètres sont traités comme des tableaux associatifs, et le nom des paramètres est évalué avant sa valeur. Si un même nom de paramètre est donné plus d'une fois (qu'il soit nommé ou non nommé), seule la dernière instance est utilisée, et la page est ajoutée à Category:Pages using duplicate arguments in template calls.
L'appel aux modèles commençant par le mot magique subst:
ou safesubst:
est évalué dans une première passe indépendante qui n'apparaît qu'au moment de la sauvegarde, en même temps que ~~~~ et s'enchaîne en utilisant l'astuce des pipes '|'.
S'ils ne peuvent pas être évalués durant la première passe, les appels subst:
sont ignorés, et les safesubst:
sont traités comme pour un modèle normal.
Beaucoup de fonctions de l'analyseur syntaxique (mais pas toutes), de l'analyseur de balises et des pages spéciales transcluses ne sont pas directement incluses comme les modèles mais sont remplacées à la place par une étiquette d'identification (strip marker). Cela signifie que vous ne pouvez pas manipuler les résultats avec les fonctions d'analyse des extensions telles que padleft: ou équivalent, parce qu'elles voient le strip marker au lieu du résultat de la fonction d'analyse.
Récursivité dans les modèles
Appeler un modèle à partir de lui-même ne bloquera pas MediaWiki sur une récursion infinie.
MediaWiki arrêtera la récursivité au modèle dont le nom figure en gras.
Par exemple, si le contenu de Template:Aaaa est a {{Aaaa}} z
, il sera montré "a a Template loop detected: Template:Aaaa z z".
Cette sauvegarde exclut un nom de modèle potentiellement utile où un modèle auto-normalise ses propres arguments d'appel.
Dans cet exemple interdit template:d
peut être appelé soit {{d|20200311}}
soit {{d|y=2020|m=3|d=11}}
.
S'il est appelé de la première façon, il revient sur lui-même avec la deuxième structure d'argument (obtenue à l'aide de fonctions d'analyseur de chaînes), qui suit ensuite un chemin de traitement unifié.
{{#if:{{{1|}}}|{{d|y={{#sub:{{{1}}}|0|4}}|m={{#sub:{{{1}}}|4|2}}|d={{#sub:{{{1}}}|6|2}}}}|<!-- processing path with arguments y,m,d regardless of original call pattern -->}}
Si template:d
est modifié pour se récurser en template:d/2
et template:d/2
est une copie manuelle identique de template:d
, cet idiome fonctionne bien car la protection d'auto-récursivité fonctionne de manière dynamique et non statique.
Un moyen possible pour le logiciel MediaWiki d'assouplir la règle d'auto-récursivité serait d'exiger que chaque appel récursif ait un nombre d'arguments distinct de tous les appels actifs précédents, récurrent au plus une fois, avec le nombre d'arguments non décroissant. Cela fournirait une garantie solide contre l'auto-récursivité infinie tout en permettant des idiomes utiles tels que celui décrit ici de manière flexible.
Si la séquence de traitement est de faible complexité, une simple solution en utilisant seulement un seul modèle est de gérer chacune des conventions d'appel dans une branche séparée if/else, en dupliquant la logique du traitement à l'intérieur de chaque cas. Si la séquence de traitement est trop complexe, chaque cas de structure d'appel peut être délégué à un modèle d'implémentation avec une structure d'appel unifiée fournissant le comportement final du modèle.
Tableaux dans les paramètres
Parce que la barre verticale (|
) et le signe égal (=
) ont différentes significations dans l'appel des modèles et les tables wiki, pour utiliser le balisage des tables comme valeur de paramètre de modèle, on a généralement recours à l'échappement de ces caractères (pour empêcher qu'ils ne soient interprétés comme balisage du modèle) en utilisant des séquences spéciales :
- le mot magique embarqué
{{!}}
fournit une version échappée de|
depuis MediaWiki 1.24 - le mot magique embarqué
{{=}}
fournit une version échappée de=
depuis MediaWiki 1.39
Avant l'introduction de ces mots magiques, beaucoup de wikis utilisaient les modèles pour accomplir les mêmes choses. Sur un tel wiki, les mots magiques prévalent sur les modèles ayant le même nom.
Tableau d'exemple
A | B | C |
---|---|---|
A1 | B1 | C1 |
A2 | B2 | C1 |
Code de la table :
{| class=wikitable
!A!!B!!C
|-
|A1||B1||C1
|-
|A2||B2||C1
|}
Code échappé, de la table :
{{{!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!}}{{!}}B1{{!}}{{!}}C1
{{!}}-
{{!}}A2{{!}}{{!}}B2{{!}}{{!}}C2
{{!}}}
Notez que la première accolade ouvrante ({
) est interprétée comme un caractère littéral parce qu'elle est immédiatement suivie du mot magique {{!}}
.
De manière équivalente, la dernière accolade fermante (}
) et interprétée comme un caractère littéral car elle est immédiatement précédée du même mot magique.
Néanmoins, dans certains cas ces caractères accolades causent réellement des problèmes, et quelques wikis fournissent des modèles pour échapper ces caractères, comme :
- l'appel du modèle
{{(}}
pourrait fournir une version échappée de{
- l'appel du modèle
{{)}}
pourrait fournir une version échappée de}
Certains wikis vont même plus loin et fournissent d'autres modèles pratiques comme {{(!}} ({|
), {{!)}} (|}
), {{!!}} (||
).
Sur un tel wiki, le code peut être un peu simplifié sous cette forme :
{{(!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!!}}B1{{!!}}C1
{{!}}-
{{!}}A2{{!!}}B2{{!!}}C2
{{!)}}
Contrôler l'inclusion des modèles
Par défaut, le contenu d'un modèle est affiché intégralement, qu'il soit affiché directement ou qu'il soit inclus dans une autre page. La page du modèle, lorsqu'elle est visualisée directement apparaît exactement telle que le modèle la génère lorsqu'il est appelé sans paramètre. Si le modèle a besoin de paramètres pour fonctionner correctement, ceci génerera la syntaxe du wikicode brute ou produira des erreurs suite à leur absence. Par exemple :
- Si un paramètre n'a pas de valeur par défaut, il s'affiche comme le texte littéral {{{1}}}, indiquant que le modèle nécessite un paramètre.
- Si un paramètre a une valeur par défaut vide (il est écrit comme {{{1|}}}), il n'affiche rien, ce qui produit l'effet prévu mais manque de clarté pour l'auto-documentation. L'utilisation d'une valeur par défaut non vide comme
{{{1|image}}}
clarifie le rôle du paramètre, en particulier pour les modèles impliquant des images. - Si un paramètre sans valeur par défaut est passé à la fonction d'analyse syntaxique
#expr
, il produit un message d'erreur : "Erreur d'expression : caractère de ponctuation non reconnu '{'." - Si un modèle crée un tableau, il est plus utile d'afficher sa structure sur la page du modèle plutôt que le wikicode qui a servi à le créer. Pour ce faire, la syntaxe du tableau n'est pas encadrée de balises et chaque élément contient à la fois les parties
<noinclude>...</noinclude>
et<includeonly>...</includeonly>
, là où c'est nécessaire.
Néanmoins vous pouvez contrôler les parties affichées et incluses, en utilisant les balises <noinclude>
, <includeonly>
et <onlyinclude>
.
Tout ce qui est contenu entre <noinclude>
et </noinclude>
est affiché uniquement sur la page du modèle lorsqu'elle est affichée directement, mais pas lorsqu'elle sera incluse dans une autre page. Ceci est utile lorsque vous désirez inclure du texte ou du code dans un modèle, sans que ces éléments ne soient propagés sur les pages appelant le modèle, comme par exemple :
- liens de catégorie pour la catégorisation du modèle lui-même
- des liens interwikis pour les modèles similaires dans d'autres langues
- texte d'explication sur l'utilisation du modèle Il est courant sur certains wikis d'utiliser un modèle comme {{Documentation }} pour transcure la documentation à partir d'une sous-page du modèle. Pour l'exemple, Template:Void est documenté sur Template:Void/doc.
De manière équivalente, tout ce qui est contenu entre <includeonly>
et </includeonly>
sera pris en compte et affiché uniquement quand la page est incluse, et non pas quand la page du modèle est affichée directement, ceci est utile dans des situations telles que :
- la catégorisation des pages qui incluent le modèle. Remarque : quand vous modifiez de cette manière les catégories appliquées à un modèle, la catégorisation des pages qui incluent ce modèle peut ne pas être mise à jour immédiatement. Ceci est géré par la file des travaux . Pour forcer la re-catégorisation d'une page particulière, ouvrez cette page pour la modifier et enregistrez-la sans rien changer.
- le fait de s'assurer que le code du modèle n'est pas exécuté lors de la lecture de la page même du modèle. Habituellement, c'est parce que ce code attend des paramètres et que son exécution sans paramètres produit un résultat inattendu.
Tout ce qui est en dehors des balises <noinclude>
et <includeonly>
est pris en compte et affiché normalement, que ce soit sur la page même du modèle qui est affiché, ou sur une page où ce modèle est inclus.
Le focus concerne ce qui se trouve entre ces deux balises.
Tout ce qui se trouve à l'extérieur des balises <onlyinclude>
n'est pas pris en compte pour l'inclusion.
Même les sections balisées includeonly sont exclues de l'inclusion à moins qu'elles ne soient également balisées onlyinclude.
Le focus ne concerne que ce qui se trouve à l'intérieur de cette balise.
Par exemple, si une page comme la démonstration de onlyinclude contient ce wikicode :
abc<onlyinclude>def</onlyinclude>ghi<includeonly>jkl</includeonly>
Le résultat de la transclusion est def.
Il est aussi possible d'imbriquer ces balises.
Les trois balises d'inclusion partielles autorisent toutes les combinaisons possibles de ce qui est traité et mis en forme.
Les commentaires jouent aussi un rôle.
Les balises d'inclusion sont prises en compte si on utilise {{subst:templatename}}
, mais sont ignorées si on utilise {{msgnw:templatename}}
car ceci affiche le wikicode brut sans l'interpréter.
Transclusion de section
Pour transclure différentes sections d'un modèle sur différentes pages, vous pouvez envelopper le contenu dans des balises onlyinclude et utiliser une déclaration if sur les paramètres pour sélectionner la section désirée.
Considérez Template:Example avec ce wikicode :
== Section 1 ==
{{#ifeq:{{{1|1}}}|1|
Content of section one.
}}
{{#ifeq:{{{1|2}}}|2|
== Section 2 ==
Content of section two.
}}
Cela affichera les deux sections de la page d'exemple elle-même, et permettra à d'autres pages de transclure la première section avec {{example|1}}
et la deuxième section avec {{example|2}}
.
Une autre approche est d'utiliser la syntaxe des paramètres littéraux à la place :
{{{section1|
== Section 1 ==
Content of section one.
}}}
{{{section2|
== Section 2 ==
Content of section two.
}}}
Transclure la première section avec {{example|section2=}}
et la deuxième section avec {{example|section1=}}
.
Si aucun paramètre n'est utilisé, alors les deux sections seront affichées.
Une troisième approche est d'utiliser la transclusion de section étiquetée.
Organiser les modèles
Pour que les modèles soient utiles, les utilisateurs doivent les trouver et savoir comment les utiliser.
Pour les trouver, les utilisateurs peuvent :
- cliquer sur Pages spéciales > Toutes les pages
- dans la liste des Espace de noms :, choisir Modèle et cliquer sur Lister.
Pour donner des informations sur l'utilisation, incluez un exemple comme celui-ci sur la page du modèle :
<noinclude> == Utilisation == Remercier les utilisateurs : {{Thankyou/fr|reason=votre raison|signature=votre signature}} </noinclude>
Ainsi, un utilisateur peut simplement copier et coller l'exemple pour utiliser le modèle.
Durant la modification d'une page, une liste de tous les modèles utilisés est disponible sous le formulaire d'édition, dans une section repliable intitulée Modèle utilisé par cette page : (appelée aussi Modèle utilisé dans cette prévisualisation :, ou Modèle utilisé dans cette section : en fonction du contexte). Cette liste fournit un lien pratique vers la page du modèle, ainsi que des informations sur l'état de protection. Les modèles redirigés sont affichés en italiques, avec la cible de la redirection ajoutée comme élément de liste séparé.
Faire un lien vers un modèle
Il est possible de faire un lien vers une page de modèle comme pour n'importe quelle autre page du wiki. Par exemple, le lien Template:Navbar est généré en utilisant le code wiki [[Template:Navbar]]
.
Sur de nombreux wikis, Template:Tl peut être utilisé pour fournir un lien vers un modèle mis en forme de manière à montrer le code entre « double accolades » nécessaire pour transclure le modèle, sans réaliser la transclusion. Par exemple, le code {{tl|Navbar}}
peut être utilisé pour créer le lien {{Navbar }}.
Cette construction est couramment utilisée dans les pages de documentation des modèles, sur les pages d'aide, et sur les pages de discussion lorsqu'il est fait référence aux modèles.
Le même objectif peut être atteint en utilisant {{[[Template:Navbar|Navbar]]}}
, mais l'approche utilisant le modèle {{Tl }}
est plus simple à saisir au clavier.
Sur n'importe quel wiki, le modèle Tl s'il est défini, peut ou pas, effectuer le rendu du texte encadré par les balises « code », ou avec un type à largeur fixe.
Si ce n’est pas le cas (comme sur ce wiki), il devrait exister un autre modèle avec un nom similaire pour réaliser la même chose.
Voir, par exemple, la section « Voir aussi » de notre documentation du modèle Tl.
Nom des modèles
Un nom de modèle est sensible à la cesse sauf pour le premier caractère.
Vous créez des redirections pour les casses équivalentes.
Par exemple si un modèle s'appelle AdminAbbr, vous pouvez créer une redirection appelée Adminabbr.
De cette manière le modèle peut être appelé avec {{AdminAbbr}}
ou {{adminabbr}}
.
Si un éditeur préfère mélanger les majuscules et les minuscules pour des raisons de clareté, il peut utiliser des fonctions telles que lc ou uc.
Par exemple au lieu de {{CURRENTINTERNETTIME}}
on peut utiliser {{ {{uc:CurrentInternetTime}} }}
Comme le nom des modèles est interprété de la même manière que le nom des autres pages, les caractères de soulignement sont remplacés par des espaces, et tout texte qui suit un croisillon (qui serait une ancre dans un lien standard) est ignoré.
Un caractère de soulignement _
peut être une alternative au caractère espace,
Utilisation possible de modèles
Les modèles peuvent être utilisés pour toute situation où l'on veut que deux pages ou plus contiennent un contenu identique ou similaire qui est édité ensemble plutôt que de manière séparée. Ils peuvent être utilisés pour :
- Fournir des éléments structurés sur plusieurs pages, comme les boîtes d'information, les modèles de maintenance, les boîtes de navigation, etc.
- Réaliser des calculs utilisés comme outil de programmation sur diverses pages comme w:Template:Sum.
- Construire des pages composites qui affichent ensemble le contenu de plusieurs pages existantes, comme w:WP:Village pump (all) qui inclut le contenu de chaque section de la pompe du village. Le contenu de ces pages peut être affiché individuellement ou ensemble, mais l'historique de révision, la liste de suivi, etc. ne montreront que les modifications des pages transcluses et le wikicode brut de la page composite elle-même, et non les modifications implicites de la page composite.
- Partager du contenu entre quelques pages liées. Par exemple la liste sur les fonctionnalités bêta est dupliquée sur les fonctionnalités bêta actuelles. Alors que sur MediaWiki.org ceci est réalisé à l'aide de Extension:LabeledSectionTransclusion on aurait pu le faire à la place en utilisant un modèle.
- Enregistre le contenu référencé plusieurs fois sur la même page, pour qu'il ne soit écrit et évalué qu'une seule fois. Par exemple w:Template:Cite Monumentenregister/URL est appelé deux fois par w:Template:Cite Monumentenregister à deux endroits différents, et l'utilisation d'un autre modèle signifie que seul le motif de l'URL doit être écrit une fois dans le modèle de base.
- Utilisez les modèles comme des éléments de programmation pour générer des boucles : si Modèle:A appelle Modèle:B 10 fois avec différents paramètres, alors on devine l'utilisation d'une boucle for. Si Modèle:B appelle Modèle:C 10 fois, alors vous avez une boucle imbriquée de 100 appels au Modèle:C. Mais gardez à l'esprit que vous pouvez vite atteindre les limites du modèle lorsque vous utilisez des modèles en tant que structures de programmation avancée et l'utilisation de Scribunto est généralement plus claire et plus facile à suivre.
Copier d'un wiki vers un autre
Il est possible de transclure des modèles d'autres wikis si la configuration du wiki actuel le permet . Ce paramètre de configuration est désactivé sur les wikis Wikimedia. Sinon, vous devez copier manuellement le modèle et ses dépendances à partir du wiki source vers le wiki destination pour pouvoir l'utiliser.
Les modèles requièrent parfois du CSS ou d'autres modèles, les utilisateurs ont parfois des problèmes lorsqu'ils copient les modèles d'un wiki à un autre. Les étapes ci-dessous doivent fonctionner avec la plupart des modèles.
Code MediaWiki
Si vous avez les droits d'importation (et en particulier importupload
) sur le wiki cible :
- Allez à Special:Export sur le wiki original, et téléchargez un fichier .XML avec l'historique complet de tous les modèles nécessaires, comme ceci :
- Entrez le nom du modèle dans la grande zone de texte, par exemple "Modèle:Bienvenue". Faites très attention à la casse et aux caractères spéciaux - si le nom du modèle n'est pas correctement entré, l'export aura bien lieu mais le fichier .XML ne contiendra pas les données attendues.
- Sélectionnez la case « Inclure les modèles ».
- Sélectionnez la case « Exporter uniquement la version courante, sans l’historique complet ».
- Cliquez sur « Exporter » .
- Allez à Special:Import sur le nouveau wiki et téléversez le fichier XML.
Si vous n'avez pas les droits d'importation sur le wiki cible :
- Allez sur le modèle que vous voulez copier du wiki source. Allez sur la page de modification, et copier tout le code wiki.
- Sur le nouveau wiki, allez sur la page de même nom que celui du modèle que vous avez copié. Cliquer sur créer ou modifier et coller le code copié. Dans le résumé d'édition de chaque modèle, liez à la page originale pour l'attribution des droits.
- De retour sur le wiki original, en dessous de la boîte d'édition, regardez la liste des modèles utilisés dans cette page. Pour chaque modèle listé, suivez ces mêmes instructions d'importation. Faites de même pour les modèles utilisés par ces modèles, et ainsi de suite.
Cette procédure va copier entièrement le code nécessaire, et sera suffisante pour certains modèles. Notez-bien que ne sont exportés que les éléments de page analysés pour le rendu de la page, donc les sous-pages de documentation ne sont pas exportées car elles ne font pas partie du processus. Si ça ne marche pas, vérifiez aussi qu'il n'y a pas de liens rouges sous pages incluses dans la version actuelle de cette page, au dessous de la boîte d'édition. Si il y en a, répétez les étapes ci-dessus pour chacun des liens corrigés et recopiez aussi le code dans les modules.
Après avoir importé correctement le modèle et ses modèles liés depuis d'autres wikis, modifiez-le pour le personnaliser et l'adapter à votre wiki. Par exemple pour changer un logo, pour enlever les catégories redondantes ou faire disparaître les liens rouges.
Extensions
ParserFunctions est une extension souvent utilisée dans les modèles. Allez sur Extension:Fonctions d'analyse et vérifiez si, parmi les fonctions affichées, certaines sont utilisées dans les modèles que vous avez copiés. Si c'est le cas, vous devez installer l'extension ParserFunctions . Pour l'installer, vous avez besoin de l'accès administrateur système au serveur de votre instance de MediaWiki.
Une autre dépendance qui peut être utilisée dans les modèles, notamment ceux de Wikipédia, est Lua. La présence de {{#invoke: }}
dans le code des modèles est un bon indice de son utilisation.
Dans le cas où il est utilisé, vous devez installer l'extension Scribunto et il faut avoir également l'accès administrateur.
Voir cette page pour les instructions détaillées concernant l'installation et l'usage de l'extension.
Code CSS et JavaScript
En plus du code MediaWiki, beaucoup de modèles font usage du CSS et certains emploient le JavaScript pour fonctionner. Si les modèles copiés n'ont pas le comportement attendu, cela pourrait venir de cela. Pour copier le CSS et le JavaScript requis sur votre wiki, vous devez normalement avoir besoin des droits d'administrateur, car vous aurez à éditer les messages système dans l'espace de noms « MediaWiki: ».
- Recherchez l'utilisation de classes CSS dans le texte de votre modèle (ex :
class="foobar"
). Si ces classes apparaissent dans « MediaWiki:Common.css » ou « MediaWiki:Monobook.css » sur le wiki d'origine, copiez-les dans « MediaWiki:Common.css » sur le nouveau wiki et vérifiez si le modèle fonctionne mieux. - Si le modèle copié ne fonctionne toujours pas comme prévu, vérifier s'il y a du code dans « MediaWiki:Common.js » ou « MediaWiki:Monobook.js » sur le wiki d'origine. Si c'est le cas, vous pouvez essayer de le copier dans « MediaWiki:Common.js » sur le nouveau wiki. Normalement, le mieux serait de copier seulement le code issu de sources fiables, et de parcourir d'abord le code pour identifier et sélectionner les parties pertinentes. Vous devriez trouver des commentaires qui peuvent vous servir d'indice pour identifier la fonction de chaque partie.
Redirection
Si une page utilise une redirection comme un modèle, la redirection est résolue avant de traiter le modèle et la cible est utilisée à la place. Ceci ne fonctionne pas si la cible n'existe pas (la redirection est cassée), ou si elle-même est une redirection (cas d'une double redirection).
Une page qui ne fait qu'inclure une autre page en tant que modèle pourrait être une redirection mais il existe quelques différences entre-elles :
- L'entête des résultats affiche le titre de la page d'où il provient.
- Aucun message Redirigé depuis n'est affiché.
- Les boutons comme modifier, suivre, discuter, historique, Pages liées, et Modifications récentes pointent vers la page référencée. Pour accéder à la page cible, utilisez un lien de modification de section et naviguez à partir de là.
- A moins que includeonly et / ou noinclude tags ne soient utilisés, la page appelante partage les mêmes catégories que la page cible.
- Les double redirections fonctionnent quand l'une, l'autre, ou les deux ont ce type de pseudo-redirection.
Fonctions d'analyse
MediaWiki prend aussi en charge les fonctions d'analyse, qui fonctionnent de manière similaire aux modèles mais qui suivent une syntaxe un peu différente :
- Les fonctions d'analyse utilisent un : à la place du | initial.
- Une page de modification n'affiche pas les fonctions d'analyse utilisées sur cette page.
- Il n'y a pas de fonction Pages liées pour les fonctions d'analyse servant à identifier les pages où elles sont utilisées.
- Les modèles des fonctions d'analyse n'acceptent pas généralement les paramètres nommés, donc les signes égal n'ont généralement pas de signification particulière. Par exemple :
{{ #if: not blank | x=abc }}
givesx=abc
Voir aussi
Utilisation générale des modèles
- Manual:Expr parser function syntax
- Help:Substitution
- w:Help:Template
- Manual:Advanced templates – décrit des techniques encore plus avancées telles que l'appel des modèles dynamiques et des noms variables de paramètres
- Help:Multiple-instance templates - sur l'utilisation de plusieurs instances du même modèle sur une page.
- Manual:Newlines and spaces#Automatic newline
Constructions spéciales utilisées dans les modèles
- Aide:Mots magiques – trucs et astuces que vous pourriez rencontrer dans certains modèles.
- Aide:Extension:Fonctions d'analyse – autres fonctions de contrôle pratiques comme #if et #switch
- Aide:Fonctions d'analyse dans les modèles – règles sur l'utilisation des fonctions de l'analyseur dans les modèles
- Aide:TemplateData
- Aide:Extension:Fonctions d'analyse
- Extension:Scribunto
Autres informations relatives
- ExpandTemplates
- Recherches externes – exemple d'utilisation spéciale des modèles.
- Manual:Importing Wikipedia infoboxes tutorial
- Extension:PageTemplates
- Manuel:Création de pages avec du texte préchargé – Utiliser les modèles comme texte initial d'une page
- Aide:Transclusion – inclure des pages depuis des espaces de noms autres que
Template:
- Manual:Template limits
- Aide:Pages liées
- Special:Mostlinkedtemplates - affiche les modèles les plus utilisés
- Special:Unusedtemplates - affiche les modèles sans utilisation (bien qu'ils puissent être substitués)
- Manuel:$wgEnableScaryTranscluding - utiliser les modèles d'autres wikis
- w:WP:Anatomy of a template
- w:Wikipedia:Transclusion costs and benefits
- Manual:Parser.php
- Aide:Extension:TemplateSandbox - pour avoir l'aperçu des modifications que vous avez faites sur un modèle tel qu'il est généré ailleurs
Liens externes
- Dépôt des modèles Miraheze - modèles MediaWiki à usage général.