Avatar billede lakana Nybegynder
07. juli 2006 - 13:08 Der er 7 kommentarer og
2 løsninger

Template system

Hvis jeg har mine ændringer i et array, er dette så en perfekt måde, at udskrive sit site på:

function display($path = "", $vars = array())
{
    ob_start();
    include_once($path);
    $content = ob_get_contents();
    ob_end_clean();
 
    foreach($vars as $variable => $value)
    {
        $content = str_replace("\{{$variable}\}", $value, $content);
    }
 
    return $content;
}
Avatar billede Slettet bruger
07. juli 2006 - 13:17 #1
Der findes ikke noget, som er generelt perfekt. Det afhænger altid af situationen.

Jeg ville personligt ikke bruge {$navn} til at markere pladsholdere i en template.

Derudover vil denne metode ikke give mulighed for indholdsafhængige løkker i skabelonen.
Avatar billede lakana Nybegynder
07. juli 2006 - 13:22 #2
okay. hvordan ville du så skrive en sådan funktion?
Avatar billede Slettet bruger
07. juli 2006 - 13:51 #3
Som sagt: Der findes ikke noget, som er generelt perfekt. Det afhænger altid af situationen.

En del af det situationsafhængige er, hvilken grad af frihed og fleksibilitet, de, der skriver templates skal have, og dermed også hvor komplekse templates har lov til at blive.

Personligt ville jeg nok benytte et simpelt system, hvor selve mit script oprettede et array med indhold (lidt ligesom dit), men hvor arrayet så benyttes direkte fra skabelonen, som er skrevet i helt normalt php. Som det sidste i selve scriptet inkluderer jeg den relevante skabelon.

Jeg ville så på udvalgte steder have et uderarray i data-arrayet, som skabelonen skal kunne gennemløbe og fortolke. Et eksempel:

// fra selve scriptet
$data['onlinebrugere']=array();
$res=mysql_query($sql);
while($row=mysql_fetch_assoc($res))
{
  $data['onlinebrugere'][]=$row;
}

Bemærk at da der er tale om en liste af brugere, der netop nu er online, vil det give et variabelt antal poster. I skabelonen benyttes den som følger:

<?php
if(0==count($data['onlinebrugere'])){
  echo 'Der er ingen brugere online nu.';
} else {
  echo 'Brugere online:';
  echo '<ul>';
  foreach($data['onlinebrugere'] as $ob){
    echo '<li>' . $ob['navn'] . '</li>';
  }
  echo '</ul>';
}
?>

Der kunne lige så godt have været skiftet ud fra php-mode i stedet for at bruge echo.
Avatar billede horsmark Nybegynder
07. juli 2006 - 15:11 #4
...du kan selvfølgeligt også tænke over om du istedet burde indsætte placeholders for content (felter beregnet til indhold)

<html>
{replacement_global:meta}
{replacement_global:css}
{replacement_global:javascript}
<body>
<div>
{replacement_field:1}
</div>
<div>
{replacement_field:2}
</div>
</body>
</html>

og derefter have en indholdstabel med fieldindhold

blot en lille indspark...
Avatar billede horsmark Nybegynder
07. juli 2006 - 15:11 #5
{replacement_field:1} kan så replaces med en artikel, 2 billeder, et nyhedsplugin whatever
Avatar billede lakana Nybegynder
16. august 2006 - 10:57 #6
svar
Avatar billede horsmark Nybegynder
16. august 2006 - 11:02 #7
ved ikke om den var møntet på mig men ellers kan du blot afvise ;-)
Avatar billede Slettet bruger
16. august 2006 - 14:52 #8
Og hvis du mente mig, kommer der et her. Så skulle du have mulighed for at acceptere hvem af os, du nu mente skulle lægge svar.
Avatar billede horsmark Nybegynder
16. august 2006 - 18:08 #9
thx :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester