Kasutaja:Kaniivel/Näpunäited malliehitajale

Allikas: Vikipeedia

Olen märganud, et erinevad inimesed teevad Vikipeedia mallide toimetamisel ühesuguseid vigu. Osad vead oleks kergelt välditavad. Piisab vaid mõnest teadmisest. Niisiis hakkan siia lisama näpunäited mallide ehitamiseks ja toimetamiseks. Põhjalikumaks arusaamiseks tuleks siiski tutvuda mallide juhenditega; eeskätt ingliskeelse viki ja MediaWiki omadega.

Malli muutujad ja loogiline või[muuda | muuda lähteteksti]

Malli muutujad on malli koodis sellise kujuga: {{{auto}}}. Siin on meil üks muutuja nimega "auto". Kui nüüd artikli teksti sees kirjutada nii: {{autode mall|auto=BMW}}. Siis oleme andnud muutujale nimega "auto" väärtuse "BMW". Seal, kus me malli sees kirjutame {{{auto}}}, asendatakse see kood sõnaga "BMW". Lihtne, kas pole?

Mis aga juhtub, kui me ei anna muutujale {{{auto}}} üldse väärtust, ehk kasutame malli artiklis nii: {{autode mall}}. Sel juhul jääb muutuja {{{auto}}} asendamata ja artiklis kuvataksegi koodi {{{auto}}}. Seepärast kirjutatakse malli koodis tavaliselt nii: {{{auto|}}}.

Kuidas seda lugeda? Püstkriips on loogiline või-operaator. See toimib nii, et esmalt kontrollitakse, kas muutujal {{{auto}}} on mingi väärtus. Kui on, siis kuvatakse seda. Kui pole, siis kuvatakse eimiskit. Seal teisel pool kriipsu pole ju üldse miskit. Kui me näiteks hooletusest jätaks sinna tühiku (nii: {{{auto| }}}, siis kuvataksegi seda tühikut. Kui me paneme sinna mingi sõna, siis kuvatakse seda: {{{auto|Volga}}}. Loe: kui muutujal {{{auto}}} pole mingit väärtust, siis kuva seal kohas sõna "Volga".

Võime minna veel kaugemale. Ütleme, et meil on mallis kaks muutujat. Üks on {{{auto}}} ja teine on {{{käru}}}. Nüüd võime teha sellise reegli, et kui muutujal {{{auto}}} pole mingit väärtust, siis kuvada sellel kohal muutuja {{{käru}}} väärtust. Malli koodis näeb see välja nii: {{{auto|{{{käru}}}}}}. Aga kui kummalgi muutujal väärtust pole, siis kuvatakse artiklis teksti {{{käru}}}. Selleks, et seda ei juhtuks, lisame viimase muutuja lõppu veel ühe loogilise või: {{{auto|{{{käru|}}}}}}. Seda muutujate rida võib jätkata:

{{{auto|{{{käru|{{{automobiil|}}}}}}}}}

Ära vaid unusta, et iga muutuja nõuab kummaski otsas kolme loogelist sulgu. Iga täiendav muutuja lisandub teiste muutujate "sisemusse". Selguse mõttes tõin näites viimase muutuja loogelised sulud punase värvusega esile. Muutujate rida evalueeritakse vasemalt paremale: kõigepealt kontrollitakse, kas muutujal {{{auto}}} on väärtus, seejärel, kas muutujal {{{käru}}} on väärtus jne. Rea tulemusena kuvatakse (täpsem on öelda, et rida tagastab, näiteks kui tulemust ei kuvata, vaid kasutatakse mõnes tingimuslauses) vasakult esimest muutujat, millele on väärtus antud.

Praktiline kasu selliste pikkade muutujaridade loomisel on, et muutujatele saab teha paralleelnimesid. Saab teha nii, et mall töötab nii ingliskeelsete kui ka eestikeelsete muutujatega. Või et see töötab nii vanade muutujatega, mis kuskil artiklitesse ikka veel sisse on kirjutatud, kui ka uute muutujatega.

Miks liivakastimallid head on[muuda | muuda lähteteksti]

Mall on idee poolest selline koodijupp, mis võib olla kasutusel tuhandetes artiklites. Kui lähed mõnd taolist paljukasutatud malli muutma ja teed muutmisel vea (milleks pole palju vaja, piisab, et kuskilt on üks loogeline sulg puudu), siis kuvatakse õnnetut käkki potentsiaalselt sadades või tuhandetes artiklites. Palju rahulikum ja turvalisem on teha muudatused malli liivakastiversioonis, kontrollida need üle ja alles siis kopeerida uus kood senise malli asemele.

Malli liivakasti võib teha peaaegu ükskõik kuhu ja ükskõik mis nimega. Mina teen tavaliselt mallile alamlehe /liivakast. Kopeerin sinna olemasoleva malli koodi (ilma kategooriate ja dokumentatsiooni alamlehtedeta). Nüüd töötab {{malli nimi/liivakast}} iseseisva mallina. Kui kõik senised muutujate nimed samaks jätta (ja mõistlik on), siis peab liivakastimall töötama igal pool seal, kus praegu on artiklites sees tavaline mall. Seega, kui asendada artikli tekstis kood {{malli nimi}} koodiga {{malli nimi/liivakast}}, jättes kõik argumendid samaks, ja vajutada nuppu Eelvaade, siis näebki seda, kuidas artikkel katsemalliga välja näeb. Samas pole artiklis ühtegi muudatust tehtud ja kõik tavalugejad, kes peaks sel ajal artiklit vaatama, näevad artiklit vanamoodi.

Kui muudetav mall kutsub ise välja teist malli või moodulit, mida on vaja testida, siis saab tollest mallist või moodulist teha omakorda liivakastiversiooni ja panna liivakastimall välja kutsuma liivakastimoodulit.

Tingimuslaused[muuda | muuda lähteteksti]

Miks on oluline aru saada, mida muutuja tagastab[muuda | muuda lähteteksti]

Kõige lihtsam tingimuslause on if:

{{#if: katsestring | täidetakse siis, kui katsestring pole tühi | täidetakse siis, kui katsestring on tühi }}

If katsetab vaid seda, kas katsestring on tühi või ei. Tühi on string siis, kui see on nullpikkusega (""). Tulles tagasi esimese teema juurde: kui malli muutujale pole antud väärtust, siis kuvatakse seda artiklis just sellisel kujul nagu see malli koodis on (muutujat {{{auto}}} kuvatakse {{{auto}}}). Mida see tähendab tingimuslause jaoks? Tingimuslause

{{#if: {{{auto}}} | tee tuut | tee uhuu }}

annab väärtustamata {{{auto}}} puhul tulemuseks

tee tuut

See pole just see, mida me sooviksime. Me sooviks, et kui muutujale {{{auto}}} pole väärtust antud, siis if-lause tulemuseks on "tee uhuu". Selleks, et see nii toimiks, on if-lause katsemuutujas vaja kasutada loogilist võid: {{{auto|}}}. Nii on tagatud, et kui katsemuutujal pole väärtust, annab ta tulemuseks eimiski. Ja if-lause töötab nagu me eeldame, et ta võiks töötada:

{{#if: {{{auto|}}} | tee tuut | tee uhuu }}

annab tulemuseks

tee uhuu

Teisisõnu võib öelda, et enne seda kui if-lauset täitma hakatakse, evalueeritakse kõik selle sees olevad muutujad. Muutuja {{{auto}}} asendatakse stringiga {{{auto}}}, kui muutujale pole väärtust antud ja kui muutujas pole kasutatud loogilist võid.

Võib testida ka mitut muutujat korraga[muuda | muuda lähteteksti]

{{#if: {{{auto|}}} | tee tuut | tee uhuu }}

ja

{{#if: {{{auto|}}}{{{käru|}}}{{{automobiil|}}} | tee tuut | tee uhuu }}

töötavad mõlemad sama moodi. If-lause testib lause esimeses pooles olevat stringi. Viimase näite puhul: kui ükskõik milline muutujatest {{{auto|}}}, {{{käru|}}}, {{{automobiil|}}} on väärtustatud, pole muutujate evalueeerimise järel tekkiv katsestring tühi, ja tulemuseks on "tee tuut". Viimase näite võiks kirjutada ka nii:

{{#if: {{{auto|{{{käru|{{{automobiil|}}}}}}}}} | tee tuut | tee uhuu }}

Testime võrdsust[muuda | muuda lähteteksti]

See tingimuslause on mallides kasutatavuselt teine (laest võetud hinnangu järgi) ja testib stringide võrdsust:

{{#ifeq: string1 | string2 | täida, kui stringid on võrdsed | täida, kui stringid pole võrdsed }}

See lause suudab mitte ainult stringe, vaid ka numbreid omavahel võrrelda, nt 01 ja 1 loetakse võrdseks. Mallides võib sageli kohata järgmist loomingulist konstruktsiooni:

{{#ifeq: {{{tüüp|pole}}} | pole | tüüpi pole või tüüp on "pole" | tüüp on ja pole "pole"  }}

Näites testitakse muutuja {{{tüüp}}} võrdsust stringiga "pole". Kui {{{tüüp}}} on väärtustamata, saab loogilise või tulemusena esimese katsestringi väärtuseks "pole". Stringid "pole" ja "pole" on omavahel võrdsed, järelikult täidetakse esimene pool "tüüpi pole või tüüp on "pole"". Sama juhtub siis, kui muutuja {{{tüüp}}} väärtuseks on "pole". Aga kui muutuja {{{tüüp}}} on väärtustatud ja väärtuseks pole "pole", täidetakse "tüüp on ja pole "pole"". Lause teises pooles võime "tüüp on ja pole "pole"" asemele panna edasise testi, mis testib, mis tüübiga siis tegu on.