[PHP] Vragen over eigen te maken template parsertje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb al een hoop GoT posts nagelopen op (voorkeuren voor) Template Engines, maar kom er niet echt uit welke oplossing voor mij geschikt is.

Korte uitleg: ik ben bezig met een eigen weblog script. Ik wil deze app. themeble maken, zodat ik vlot de layout kan aanpassen. Ik heb een template parser nodig die:

1. {tags} kan verwisselen voor php-gegenereerde content;
2. {tags} kan vervangen door andere template files.

1. is geen probleem - ik heb een eigen parsertje geschreven, gebaseerd op str_replace
2. is het probleem; ik zal het hieronder uitleggen.

Ik een MySQL datbase heb ik twee template files opgeslagen:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
<table border="1">
  <tr>
    <td colspan="2">{header}</td>
  </tr>
  <tr>
    <td>{navlinks}</td>
    <td>{newsposts}</td>
  </tr>
  <tr>
    <td colspan="2">{footer}</td>
  </tr>
</table>

HTML:
1
2
3
4
5
6
7
8
9
<table border="0">
  <tr>
    <td>{date}</td>
    <td>{newstitle}</td>
  </tr>
  <tr>
    <td colspan="2">{newstext}</td>
  </tr>
</table>

De bedoeling is als volgt:

1. ik haal voor alle newsposts de date, newstitle en newstext op uit de database.
2. voor elke newspost wordt deze informatie ingevuld voor de {date}, {newstitle} en {newstext} tags
Met andere woorden: dit template bestandje moet voor elke newspost geloopt worden
3. de totale output hiervan moet toegewezen worden aan de {newsposts} tag uit de bovenste template

Met andere woorden: op de plaats van {newsposts} krijg ik dus bv. de volgende uitput, die gevormd is mbv het tweede template bestandje:

HTML:
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
<table border="1">
  <tr>
    <td colspan="2">{header}</td>
  </tr>
  <tr>
    <td>{navlinks}</td>
    <td>
      <!-- BEGIN: NEWSPOSTS -->
      <table border="0">
        <tr>
          <td>12 maart 2004</td>
          <td>Mooie dingen</td>
        </tr>
        <tr>
          <td colspan="2">Er zijn weer een hoop mooie...</td>
        </tr>
      </table>
      <table border="0">
        <tr>
          <td>11 maart 2004</td>
          <td>Minder mooie dingen</td>
        </tr>
        <tr>
          <td colspan="2">Het was vandaag een stuk minder mooi...</td>
        </tr>
      </table>
      <!-- END: NEWSPOSTS -->
    </td>
  </tr>
  <tr>
    <td colspan="2">{footer}</td>
  </tr>
</table>


De meeste template engines die ik tegenkom zijn gebaseerd op hardcoded .tpl bestanden ipv bestanden uit een database, maar daar kom ik wel uit. Waar ik meer mee zit is dat de meeste template engines een groot aantal functies hebben die ik helemaal niet nodig heb.

Mijn vragen aan jullie:
1. Kent iemand een tutorial voor een template parsertje zoals ik dat nodig heb?
2. Heeft iemand misschien wat aanwijzingen hoe ik zo'n tweede template kan loopen en daarna in de eerste kan passen? Op welke termen moet ik daarvoor Googlen?
3. Is het misschien dom wat ik probeer en heb jij wellicht andere ideeen waarmee ik hetzelfde kan bereiken maar makkelijker uitvoerbaar zijn?

"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!

Verwijderd

Ik zet dan zelf altijd het type van de te vervangen tag erbij, bijvoorbeeld {str:title} of {int:id} of {tpl:newsitem}.

Ik tokenize eerst de template, dat wil zeggen dat ik het laat verdelen in brokken die een bepaalde betekenis hebben. Brokken die geen tag zijn gaan direct naar de output, terwijl brokken die een tag zijn door een switch statement worden gehaald die aan de hand van het type bepaalde benodigde acties uitvoeren. Bijvoorbeeld het expliciet typecasten of escapen van strings.

In het geval van een template/database systeem, kun je er ook voor kiezen om meteen weer een query uit te voeren, en die te gebruiken voor een template die andere templates importeert.

Ik heb eens een systeem gemaakt waarin er eventueel een query in een template bestand stond. In die query kon je dan ook weer variabelen veranderen met het template systeem zelf, dus iets als "SELECT * FROM melp WHERE spef = {sqlstr:name}".

Maar er zijn echt zoveel manieren om een template parser te maken...

De laatste tijd vertrouw ik weer gewoon op de template parser eigenschappen van PHP zelf, trouwens.

[ Voor 6% gewijzigd door Verwijderd op 10-04-2004 22:46 ]