[smarty] twee grote blokken html

Pagina: 1
Acties:

  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 04-11 14:21
Stel ik heb een bla.php en een bla.tpl, en de bla.php ziet er als volgt uit:

code:
1
2
3
4
5
6
if (a=b){
    <veel html code 1>
}
else {
    <veel html code 2>
}


Moet ik dan een aparte template includen voor de if en een andere voor de else?
Want ik neem aan dat je dezelfde if/else constructie niet in de bla.tpl gaat doen?

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Dat soort beslissingen laat ik lekker over aan Smarty, die mag bepalen welke template er weer gegeven moet worden. Ik zou die if() dus niet in bla.php doen maar in bla.tpl.

Sole survivor of the Chicxulub asteroid impact.


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Waar zou je de if/else niet in de template doen?
Het gaat toch alleen maar om de presentatie van html-code?

Kijk imho moet je niet 100 if / elseif / elseif / else constructies in je templates gaan bouwen.

Maar bijv een login-boxje bij een niet ingelogde gebruiker en een welkomsttekst bij een wel ingelogde gebruiker vind ik altijd prima in een template te stoppen...

Vraag jezelf gewoon af of het een essentieel verschil is, kan jij het bij de else een nieuwe pagina noemen dan moet je imho een nieuwe template aanmaken, is het een herbruikbaar onderdeel van een pagina wat later op meerdere pagina's handig is dan moet je imho een nieuwe template aanmaken.
Is het gewoon een 5-regelige if / else dan zou ik het gewoon in de standaard template stoppen.

En je kan er ook gewoon voor kiezen om een headertemplate, een footertemplate en 2 body-templates te maken...

  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 04-11 14:21
OK, ik dacht dat er totaal geen programming logica (dus if/elses e.d.) meer in de template mochten voorkomen, maar als het bedoeld is als presentatie logica, dan "mag" het dus. Mooi, kunnen we weer een stapje verder in de wondere wereld die smarty heet ;)

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21:46
CAFC1905 schreef op vrijdag 20 juni 2008 @ 08:12:
OK, ik dacht dat er totaal geen programming logica (dus if/elses e.d.) meer in de template mochten voorkomen, maar als het bedoeld is als presentatie logica, dan "mag" het dus. Mooi, kunnen we weer een stapje verder in de wondere wereld die smarty heet ;)
Ikzelf zou gewoon twee aparte template bestanden halen, en die aanroepen vanuit je script. Zulke dingen hoort in de code geregeld te worden en niet in de templates, althans dat vind ik. :)

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


Verwijderd

Eens met Gomez. Voor kleine onderdelen van je template zou ik idd een if/else constructie in de template toepassen. Die mogelijkheid zit niet voor niets in smarty ;-)
Wel zou ik dan het stukje in de if/else in een andere template plakken, waar mogelijk. Zo'n login box zou je heel goed in een template (bijv. module_login.tpl, of hoe je 't ook wilt noemen) kunnen plakken. Dan in je template iets in deze richting:
code:
1
2
3
4
5
{if $loggedIn eq 'true'}
  {include file="module_login.tpl}
{else}
  <!-- loguit linkje -->
{/if}

Script fouten voorbehouden ;-)

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

CAFC1905 schreef op vrijdag 20 juni 2008 @ 08:12:
OK, ik dacht dat er totaal geen programming logica (dus if/elses e.d.) meer in de template mochten voorkomen, maar als het bedoeld is als presentatie logica, dan "mag" het dus. Mooi, kunnen we weer een stapje verder in de wondere wereld die smarty heet ;)
Presentatie logica mag best in een template worden gebruikt. Business logica (zoals het uitlezen van een cookie) hoort weer wel in je code thuis.

XSL(T) templates hebben ook gewoon een <xsl:if> en <xsl:choose> (switch) als onderdeel van het 'template' systeem.

Als de tekst delen wel heel erg lang worden kun je besluiten de 'if' alsnog naar de code te trekken waarbij je dan bepaald welke template je gebruikt..

If it isn't broken, fix it until it is..


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 00:06
Niemand_Anders schreef op vrijdag 20 juni 2008 @ 10:04:
Als de tekst delen wel heel erg lang worden kun je besluiten de 'if' alsnog naar de code te trekken waarbij je dan bepaald welke template je gebruikt..
Eensch, als je twee daadwerkelijk verschillende pagina's hebt hoor je je business logic te laten bepalen welke weergegeven wordt, niet je presentation logic :)

Drie verschillende scenario's:

1. Miniem verschil in weergave, login box bijvoorbeeld
Lekker in Smarty gooien, logica scheiden is goed maar DRY eveneens ;)

2. Twee verschillende pagina's met andere content en/of layout
Elke pagina z'n eigen template geven, je content is tenslotte daadwerkelijk verschillend. Bovendien wil je niet drie, vier if/else lussen hebben als je meerdere opties gaat krijgen.

3. Twee pagina's met dezelfde generieke layout maar andere tekst
Tekst dynamisch inladen vanuit je CMS, assignen aan een generieke tekst-weergave template. Geen dubbele layout code en toch je business logic uit je template gehouden :)

Waar je de scheiding legt is ietwat subjectief in mijn opinie. Ik hou als vuistregel altijd aan dat er geen HTML code op wat voor manier dan ook in m'n PHP files staat. Als er een exception afgevangen en weergegeven wordt bijvoorbeeld zet ik alleen de daadwerkelijke tekst ervan in m'n code (in het meest simpele geval, op meertalige sites enkel een error ID als error.usernameTooShort) en zet ik in de template een {if $error} blok met HTML om de error op te maken neer.

Maar om het loginbox voorbeeld erbij te pakken, hoe ga je aangeven of er een loginbox of een username weergegeven moet worden? Nette optie is in je business logic een check te doen en een variabele te assignen (dus, {if $showLoginBox}) maar ik moet toegeven ook wel eens iets als {if $userName} te gebruiken. Hoe stricter je werkt des te meer semi-overbodige code je produceert. Erg goed voor duidelijkheid maar naar als je een deadline hebt :+

[ Voor 29% gewijzigd door FragFrog op 20-06-2008 12:28 ]

[ Site ] [ twitch ] [ jijbuis ]


  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 04-11 14:21
Bedankt voor de antwoorden, erg nuttig voor mijn denkproces :P
Maar als ik dan nu een php pagina heb met een formulier en die redirect naar zichzelf voor het verwerken van de data:

code:
1
2
3
4
5
6
7
8
if (isset($_POST['submit'])){
  <php code om formulier in database op te slaan>
  <html code voor bevestiging dat alles is opgeslagen>
}
else {
  <html code voor formulier>
  <php code om listboxen in formulier te vullen>
}


Hoe maak ik dit smart(y)?
Ik zal in de template file ook de if/else moeten hebben, anders worden beide blokken html tegelijk getoond, maar dezelfde if/else heb ik ook nodig in de php file om op het juiste moment het formulier in de database op te slaan. Dan doe ik toch alles dubbel?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-11 08:25

Janoz

Moderator Devschuur®

!litemod

Ten eerste is dit geen presentatie logica meer, maar business logica. Daarnaast zou ik 'het tonen van bevestiging' dus niet in deze pagina doen, maar middels een forward header. Dat scheelt een heleboel problemen bij bijvoorbeeld reloaden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 00:06
Simpel:

PHP:
1
2
3
4
5
6
if (isset($_POST['submit'])) {
  [controleer gegevens, sla ze op]
  $smarty -> display([bedankt template])
}
else 
  $smart -> display([formulier template]);


Dit is duidelijk het 2e scenario wat ik geef: je hebt twee compleet verschillende pagina's, dan moet je ook twee verschillende templates gebruiken. Zie ook mijn opmerking daarbij: wat nu als een gebruiker het formulier niet goed invult? Ga je dan een derde {if}/{else} in je template zetten? Of wat als je meerdere types bezoekers hebt? Als je op deze manier bezig gaat eindig je met een vele honderden regels lange template met een dozijn if/else lussen wat een ramp wordt om te onderhouden :)

Overigens, wat Janoz al zegt, je kan sowieso beter een forward redirect gebruiken in het laatste geval ;)

[ Voor 39% gewijzigd door FragFrog op 20-06-2008 14:29 ]

[ Site ] [ twitch ] [ jijbuis ]


  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 04-11 14:21
Thanks, hier kan ik wat mee :)
Pagina: 1