3.x/Template inheritance (Template overnemen)

Uit phpBB.nl Wiki
Ga naar: navigatie, zoeken

phpBB3

Dit is een kleine handleiding over het maken van templates in phpBB3.

Bestandsnamen

In 3.0.x eindigen bestanden niet meer op ".tpl", maar op ".html". Dit is onder andere gedaan om het voor sommige mensen gemakkelijker te maken om deze bestanden te bewerken (highlighten van HTML bijvoorbeeld).

Variabelen (vars)

De variabelen in 3.0.x zijn hetzelfde als in 2.0.x. Dat betekent dat variabelen worden aangegeven met accolades.

Er zijn verschillende soorten variables in phpBB3 die op verschillende manier worden aangegeven.

  • {XXXXX} De algemene variabele. Heeft geen voorvoegsel
  • {L_XXXXX} De taalvariabele. Heeft als voorvoegsel L_
  • {LA_XXXXX} Taalvariabele met addslashes. Heeft LA_ als voorvoegsel maar leest ook L_-variabelen

Verder wordt aangeraden om bij een normale variabele met voorvoegsels te werken om de leesbaarheid te verbeteren.

  • {S_XXXXX} Een switch met als waarde alleen true of false.
  • {U_XXXXX} Een koppeling (URL).


Bij taalvariabelen wordt altijd eerst gekeken of deze variabele in de core-bestanden welke gebruikt worden voor de opgevraagde pagina aangemaakt wordt. Is dit niet het geval bekijkt phpBB of deze variabele in de taalbestanden bestaat, maar als dit ook niet het geval is wordt simpelweg het volgende weergegegen: { TAALVARIABLE }.

Blokken

De basis van alle blokken ziet er zo uit:

<!-- BEGIN loopname -->
 markup, {loopname.X_YYYYY}, etc.
 <!-- END loopname -->

Dit is nu uitgebreid is met de volgende toevoegingen. Ten eerste kun je de begin- en eindpunten van de lus instellen.

Voorbeeld:

<!-- BEGIN loopnaam(2) -->
 layout
 <!-- END loopnaam -->

We starten de lus bij de derde rij (dit komt, omdat alles niet met 1, maar met 0 begint). Dit kun je als volgt gebruiken:

  • lusnaam(2,4): Begint met de derde; eindigt met de vierde
  • lusnaam(-4): Begint met de lus vanaf de op vier-na-laatste waarde
  • lusnaam(2, -4): Start met de derde; eindigt met de op vier-na-laatste waarde

Let er op, dat de index-methode kan veranderen, omdat het niet echt verenigbaar is op het moment. :)

Een verdere extensie van "begin" is "BEGINELSE":

<!-- BEGIN loop -->
markup
<!-- BEGINELSE -->
markup
<!-- END loop -->

Dit zorgt ervoor, dat de documentbeschrijving tussen BEGINELSE en END tot een uitvoer komt, als de lus geen waarden bevat. Dit is nuttig voor forums, die geen topics bevatten (bijvoorbeeld) ... in sommige gevallen vervangt het "bits of" de bestaande "switch_" type beheer (terwijl de rest wordt vervangen door voorwaardelijke code; zie onderstaand).

Include van bestanden

Iets dat bestond in 2.0.x, en niet langer bestaat in 3.0.x, is de mogelijkheid om een template toe te wijzen aan een variabele. Dit werd (bijvoorbeeld) gebruikt om de jumpbox tot uitvoer te krijgen. In plaats daarvan (misschien beter, misschien niet, maar zeker meer flexibel) hebben we nu INCLUDE. Dit heeft de simpele vorm:

<!-- INCLUDE filename -->

Je zult in de 3.0 templates zien, dat de belangrijkste broncodes beginnen met INCLUDE overall_header.html of INCLUDE simple_header.html, enz. In 2.0.x werd de controle op "welke" header te gebruiken geheel gedefiniëerd binnen de code. In 3.0.x kan de template-ontwerper uitvoeren wat hij wil. Merk op, dat je nieuwe templates kunt introduceren (dus andere dan die in de standaard set), gebruikmakend van dit systeem en dat je ze kunt "includen" zoals je wilt. Dit kan nuttig zijn voor een extra menubalk van de overkoepelende site, advertenties of iets dergelijks. Hierdoor is er geen noodzaak meer om vrachten bestanden te wijzigen zoals in 2.0.x.

PHP

Een contentieuze beslissing heeft de mogelijkheid gegeven om PHP te "includen" binnen de geïntroduceerde template. Dit wordt bereikt door de PHP in te kapselen binnen relevante tags:

<!-- PHP -->
echo "hello!";
<!-- ENDPHP -->

Je mag PHP ook "includen" vanuit een extern bestand, gebruikmakend van:

<!-- INCLUDEPHP eenbestand.php -->

Het zal worden "included" en uitgevoerd "inline".

Noot: het wordt zeer sterk ontmoedigd, om PHP te "includen". De mogelijkheid om "raw PHP" te "includen" werd hoofdzakelijk geïntroduceerd om eindgebruikers de mogelijkheid te geven om banner code e.d. te "includen", zonder meerdere bestanden te moeten aanpassen (zoals in 2.0.x). Het was niet bedoeld voor algemeen gebruik. Derhalve zal http://www.phpbb.com geen template-sets beschikbaar stellen met ingesloten PHP en standaard zullen templates PHP uitgeschakeld hebben staan (de beheerder zal uitdrukkelijk PHP moeten activeren voor een template). Dit gebeurt in het beheerderspaneel (tabblad algemeen, onder instellingen beveiliging). Het is dus altijd een bewuste keuze van de beheerder om dit toe te staan.

Voorwaarden/Beheer-structuren

De belangrijkste toevoeging aan 3.0.x zijn voorwaarden of beheer-structuren: "als iets is, dan doe dit, anders doe dat". Het systeem lijkt erg op Smarty. Dit kan in eerste instantie verwarrend zijn, maar het geeft veel mogelijkheden en een grote flexibiliteit met een beetje verbeeldingskracht. In hun meest eenvoudige vorm ziet dit er als volgt uit:

<!-- IF expr -->
markup
<!-- ENDIF -->

"expr" kan vele vormen aannemen; bijvoorbeeld:

<!-- IF loop.S_ROW_COUNT is even -->
markup
<!-- ENDIF -->

Dit zal de documentbeschrijving tot uitvoer doen komen, als de S_ROW_COUNT variabele in de huidige iteratie van de lus een even waarde heeft (dus: "expr" is "TRUE"). Je kunt verschillende vergelijkingsmethoden gebruiken (zowel standaard als equivalente tekstuele versies binnen vierkante haken), inclusief:

 == [eq]
 != [neq, ne]
 <> (hetzelfde als !=)
 !== (niet equivalent in waarde en type)
 ===  (equivalent in waarde en type)
 > [gt]
 < [lt]
 >= [gte]
 <= [lte]
 && [and]
 || [or]
 % [mod]
 ! [not]
 +
 -
 *
 /
 << (bitsgewijze shift left)
 >> (bitsgewijze shift right)
 | (bitsgewijze or)
 ^ (bitsgewijze xor)
 & (bitsgewijze and)
 ~ (bitsgewijze not)
 is (kan worden gebruikt om vergelijkingsoperaties samen te voegen)

De basis ronde haken kunnen ook worden gebruikt voor de oude vertrouwde BODMAS regels. Verder worden er enkele basis vergelijkingstypen gedefinieerd:

  • even
  • odd
  • div

Buiten het eenvoudige gebruik van "IF", kun je ook een reeks vergelijkingen maken, gebruikmakend van het volgende:

<!-- IF expr1 -->
markup
<!-- ELSEIF expr2 -->
markup
.
.
.
<!-- ELSEIF exprN -->
markup
<!-- ELSE -->
markup
<!-- ENDIF -->

Elke instructie zal stuk voor stuk worden getest en de relevante uitvoer zal worden gegenereerd, als er een "match" is gevonden. Het is niet noodzakelijk om altijd ELSEIF te gebruiken; ELSE kan alleen worden gebruikt om een "match" te krijgen voor "everything else".

Wat kun je hiermee nu eigenlijk doen? Neem als voorbeeld de kleur van rijen in viewforum. In 2.0.x werden rij-kleuren vóór-gedefinieerd binnen de broncode als row color1, row color2 of row class1, row class2. In 3.0.x is dit opgeschoven naar de template. Het kan eerst een beetje vreemd lijken, maar denk even aan "control flows" van boven naar beneden en dan is het niet moeilijk meer:

<table>
<!-- IF loop.S_ROW_COUNT is even -->
<tr class="row1">
<!-- ELSE -->
<tr class="row2">
<!-- ENDIF -->
<td>HELLO!</td>
</tr>
</table>

Dit zorgt ervoor, dat de rij-cel tot uitvoer komt middels "class row1", als de rij-telling even is, en anders "class row2". 2.0.x deed dit, maar hier ben je niet beperkt tot het gebruik van "class row1" of "row2" ... je kunt elke gedefinieerde "class" gebruiken, je eigen "inline style", enz. Je bent zelfs niet beperkt tot twee rij-kleuren... zoals in:

<table>
<!-- IF loop.S_ROW_COUNT > 10 -->
<tr bgcolor="#FF0000">
<!-- ELSEIF loop.S_ROW_COUNT > 5 -->
<tr bgcolor="#00FF00">
<!-- ELSEIF loop.S_ROW_COUNT > 2 -->
<tr bgcolor="#0000FF">
<!-- ELSE -->
<tr bgcolor="#FF00FF">
<!-- ENDIF -->
<td>hello!</td>
</tr>
</table>

Dit geeft een uitvoer van de rij-cel voor de eerste twee rijen in paars, blauw voor de rijen 2 tot 5, groen voor de rijen 5 tot 10 en rood voor de rest. Je kunt dus bijvoorbeeld een mooi hellingseffect produceren.

Wat kun je nog meer doen? Nou, je zou "IF" kunnen gebruiken om gewone controles uit te voeren op bijvoorbeeld de loginstatus van een gebruiker:

<!-- IF S_USER_LOGGED_IN -->
markup
<!-- ENDIF -->

Dit vervangt de bestaande methode in 2.0.x, gebruikmakend van een "zero length array" en "BEGIN/END".

Oorspronkelijke maker psoTFX was voorheen development teamleader (nu Naderman). Bron: dit topic op area51


Meer info: Template Tutorial (Engels)