[PHP] Vragen over simpel template systeem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Binnen mijn website heb ik pagina's met 1, 2 of 3 kolommen, waarvan de inhoud ten gevolge van bijvoorbeeld user input veranderd. Om een en ander beheersbaar te houden, zit ik nu te broeden op een heel eenvoudig template systeempje.

Mijn idee is om een functie te schrijven die 1, 2 of 3 kolommen print en deze vult met de goede info. Deze info wordt in 3 array's doorgegeven aan de functie. Een voorbeeld van een pagina met 2 kolommen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$number_of_cols = 2;

$main[0] = '<h2>Titel van de pagina</h2>';
$main[1] = 'Dit is een ontzettend lang artikel';

$leftcol[0] = '[img]"logo.gif">';
$leftcol[1][/img]<li>Home<li>Over ons<li>...'; // bv. navigatie
$leftcol[2] = get_shoutbox();

function print_page($number_of_cols, $main, $leftcol, $rightcol)
{
  switch($num_of_cols)
  {
    case 1: // alleen "main" gedeelte, dus geen zijkolommen
      $output = '<table><tr><td>';
      foreach ($main as $key => $value)
        $output.= '<p>'.$value.'</p>';
      $output.= '</td></tr></table>';
      break;

    case 2: // linker kolom en main
      $output = '<table><tr><td>';
      foreach ($leftcol as $key => $value)
        $output.= '<p>'.$value.'</p>';
      $output.= '</td><td>';
      foreach ($main as $key => $value)
        $output.= '<p>'.$value.'</p>';
      $output.= '</td></tr></table>';
      break;

    // en eenzelfde manier voor 3 kolommen
  }
}

Ik dacht, op deze manier kan ik heel gemakkelijk elementen toevoegen aan de kolommen, of weglaten. Ook kan ik snel een pagina van 2 naar 3 kolommen laten gaan, of juist terug. Wat vind je hiervan?

[ Voor 51% gewijzigd door Reveller op 20-11-2004 15:05 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Errr, tsja, het zal wel doen wat het hoort te doen, maar dit is niet zozeer een template systeem als wel een korte manier van coden. Template systemen dienen ertoe om de code en de layout van je site zoveel mogelijk gescheiden te houden. Hier bak je de layout er hard in. Dat is dus hetzelfde als je doel voorbij streven. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Neman
  • Registratie: September 2000
  • Laatst online: 20-09 19:50

Neman

Een uit de lucht gegrepen naam

Een echt templatesysteem is het inderdaad niet, maar goed, je moet ergens beginnen. In ieder geval zou ik de boel in een klasse gooien, dan krijg je zoiets:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?
class Blaat
{
    function Blaat()
    {
        $main = array();
        $left = array();
        $right = array();
    }

    function addMainRow($row)
    {
        $main[] = $row;
    }

    function addLeftRow($row)
    {
        // ...
    }

    function addRightRow($row)
    {
        // ...
    }

    function show()
    {
        // ...
    }
    
    var $main;
    var $left;
    var $right;
}
?>

Dat is een beetje het skelet, de rest mag je zelf verzinnen :).

[ Voor 4% gewijzigd door Neman op 20-11-2004 15:22 ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@NMe84 - je hebt gelijk dat dit geen echt template systeem is. Misschien moet ik wat duidelijker zijn; dat is ook niet echt de bedoeling. Ik wil het construeren van de output beperken tot in 1 enkele functie. En inderdaad staat er een hoop html in die functie in plaats dat ik die uit fysieke template bestanden trek. Het gaat me meer om het centraliseren, niet om een volldig correcte scheiding tussen PHP en HTML te maken; zo groot is mijn behoefte niet. Of mis ik hier iets? Heeft een echte template engine veel voordelen boven deze oplossing? Ik het gebruiken van een uitgebreide(re) template engine geen overkill als je er geen extensief gebruik van maakt? In mijn beleving is een template engine langzamer dan mijn oplossing, omdat een template engine een heleboel fysieke template bestanden van de harde schrijf moet plukken, openen en behandelen....

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Een "echte" template engine hoeft niet langzamer te zijn (PHP is zelf namelijk ook een template engine ;)). Maar in de zin die jij bedoelt is het inderdaad langzamer. Je kan echter beter met feitelijke templates werken wanneer je van plan bent meerdere layouts mogelijk te maken voor je site, of als je iemand die geen verstand heeft van PHP je design laat doen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@NMe84 - dus als ik het goed begrijp zeg jij eigenlijk:

• als je je site bij 1 layout laat en
• als je zelf alles programmeert

is PHP zelf gebruiken als template engine net zo goed als een aparte template engine maken?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
Door je pagina op te bouwen door middel van php functies wordt het layout van de pagina minder flexibel, het layout ligt immers van in de functies. Wil je de opmaak van de pagina veranderen, dan moet je je php functies gaan wijzigen.

"echte" template engines werken anders. Deze geven je de vrijheid om door middel van een verzameling gegevens, en een template (smarty achtige template of gewoon een php template) je pagina's op te bouwen. Als je dan de layout van een pagina wilt wijzigen, hoef je alleen de template aan te passen en kan je de data en logica lagen van de website in de meeste gevallen gewoon laten zoals die is.

Wat beter is (smarty achtige template of gewoon php als template engine) ligt denk ik meer aan je persoonlijke voorkeur, en daar zijn ook al redelijk wat topics over voorbij gekomen :).

Wanneer je toch je layout mogelijkheden in de code in je php code wilt vastleggen zou ik zoiets doen. (slechts een ruwe schets) Maar ik denk dat dit soort oplossingen je in je layout mogelijkheden behoorlijk beperkt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?
// de page klasse
class page
{
   var $columns;

   // eventuele andere variables
   // var $title;
   // var $header;
   // var $footer;

   // constructor
   function pageLayout()
   {
      $this->columns = array();
   }

   // geef pagina weer
   function addColumn($name, $width, $height, $content = "")
   {
      $this->columns[$name] = new pageColumn($width, $height, $content);
   }

   // geef pagina weer
   function show()
   {
      // geef header weer

      foreach ($columns as $column)
      {
         $column->show();
      }

      // geef footer weer
   }
}

// een kolom klasse
class pageColumn
{
   var $width;
   var $height;
   var $content;

   function pageColumn($width, $height, $content)
   {
      $this->width = $width;
      $this->height = $height;
      $this->content = $content;
   }

   function addContent($content)
   {
      $this->content .= $content;
   }
    
   function show()
   {
      // geef kolom weer
   }
}
?>


Overigens kan je ipv tables voor je layout veel beter layers (divs) gebruiken, en tables alleen toepassen wanneer je echt een tabel wilt tonen (gebruikers overzichten met kolomen en rijen en dergelijke).

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Reveller schreef op zaterdag 20 november 2004 @ 16:17:
@NMe84 - dus als ik het goed begrijp zeg jij eigenlijk:

als je je site bij 1 layout laat en
• als je zelf alles programmeert

is PHP zelf gebruiken als template engine net zo goed als een aparte template engine maken?
Dat eerste klopt niet helemaal. Als je makkelijk van layout wil veranderen, dan kun je PHP ook als template engine gebruiken. Dan heb je bijvoorbeeld zoiets:
PHP:
1
2
3
4
5
6
7
8
9
<html>
<head>
  <title><?=$title ?></title>
</head>
<body>
  <?=$menu ?>
  <?=$content ?>
</body>
</html>


Als je die file gewoon onderaan je pagina include, en je hebt daarvoor die variabelen gedeclareerd en gevuld, dan krijg je netjes uit wat je hebben wil. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Ikzelf gebruik XSLT als template-'engine'. Het is enorm veelzijdig en ik kan er hele moeilijke dingen mee maken die je met andere template-engines nauwelijks of moeilijk kunt maken (denk aan recursieve dingen, voor trees enzo). Het is daarnaast ook sneller, omdat het XSLT-gedeelte niet in PHP wordt gedaan, maar in een in C geschreven module voor PHP (de meeste template-engines zijn in PHP geschreven). Ik ben er erg blij mee en zou nooit meer terugwillen :) Als je PHP5 en XSLT tot je beschikking hebt, kan ik je wel een voorbeeld-class zoeken waarmee eea misschien duidelijker wordt :)
Pagina: 1