login  Naam:   Wachtwoord: 
Registreer je!
 Nota's op tutorial:

Tutorials > PHP > TemplateEngine: TemplatePower
Pagina:

Reacties op de tutorial TemplateEngine: TemplatePower


Offline  Thomas
Gepost op: 26 januari 2005 - 16:50
Moderator

Enkele aantekeningen bij TemplatePower:

* de prepare() methode
Voordat je de prepare()-methode aanroept heb je de gelegenheid om .tpl-bestanden toe te voegen met behulp van de assignInclude()-methode.
Nadat je de prepare-methode hebt aangeroepen kun je alleen maar gebruik maken van deze geinclude templates (dus invulling geven aan de template-variabelen en dynamische blokken).
De aanroep van de prepare()-methode vormt dus de scheiding tussen declaratie en gebruik/invulling van de templates.

* het werken met blocks - je pagina bloksgewijs opbouwen
Een handige eigenschap van een dynamisch block is, dat wanneer je het block niet aanmaakt met de newBlock()-methode, deze ook niet getoond wordt. Je kan dus de blokken 'conditioneel' maken - wanneer in PHP niet aan een bepaalde conditie is voldaan toon je een block niet. Je kunt dus 'bloks-gewijs' programmeren.

Stel dat je een beveiligd deel hebt aangemaakt in je website, en om dit onderdeel te bekijken moet je ingelogd zijn - bepaalde sessievariabelen moeten een bepaalde waarde hebben om een onderdeel te bekijken.

Je zou dus je template in twee blokken kunnen opdelen - een blok wat wordt getoond wanneer iemand wel ingelogd is, en een blok wat getoond wordt wanneer je niet ingelogd bent:

  1. <!-- START BLOCK : UNAUTHORIZED -->
  2. Hey, jij hoort hier niet !!!
  3. <!-- END BLOCK : UNAUTHORIZED -->
  4.  
  5. <!-- START BLOCK : AUTHORIZED -->
  6. Super-secret stuff die je kan doen als je wel ingelogd bent...
  7. <!-- END BLOCK : AUTHORIZED -->


Het script behorend bij deze template wordt dan:

  1. <?php
  2. // aanname: $tpl is het aangemaakte TemplatePower object
  3.  
  4. if(isset($_SESSION['ingelogd']) && $_SESSION['userlevel'] == 999) {
  5. // gebruiker is ingelogd - toon super secret stuff
  6. $tpl->newBlock("AUTHORIZED");
  7. // en wat je verder wilde doen in het beveiligde deel komt hier te staan
  8. // ...
  9. } else {
  10. // indringer! Geef deze persoon een koude douche
  11. $tpl->newBlock("UNAUTHORIZED");
  12. }
  13. ?>


* index.php gebruiken als kapstok voor je website
Ook in combinatie met TemplatePower zou je één pagina kunnen gebruiken die als 'index-pagina' dient (constructies als index.php?pagina=nieuws, index.php?pagina=forum et cetera).
Het merendeel van je site is meestal hetzelfde (header, navigatiemenu, footer) - het enige wat verschilt is de content... en deze laat je afhangen van $_GET['pagina'], het enige wat je extra hoeft te doen bij TemplatePower is aangeven welke template je wilt gebruiken (met behulp van assignInclude() - en welk PHP-bestand er bij deze template hoort uiteraard). Zo is in 1 bestand ook nog eens de hele 'navigatie' van je site vastgelegd, wat de overzichtelijkheid van je site (in ieder geval code-wise) ten goede komt.

* de methode gotoBlock() en de "scope" van template-variabelen
Template-variabelen zijn, tenzij ze gedeclareerd zijn met de methode assignGlobal(), alleen geldig in het block waarin ze ge-assigned worden. Hierbij heeft het 'buitenste' block (waar je dus standaard in werkt) de speciale naam "_ROOT". Wanneer je dus bezig bent met dynamische blocks, zijn template-variabelen die buiten dit block gedeclareerd zijn niet geldig/bekend (tenzij ze staan gedeclareerd met assignGlobal()). Wanneer je klaar bent met het werken met dynamische blokken, en je moet na afloop nog andere template-variabelen assignen, is het een goede gewoonte om weer terug te keren naar het 'root'-blok, ten einde vreemde foutmeldingen (of helemaal geen output waar je die wel zou verwachten ) te voorkomen. Je zou dit probleem ook kunnen voorkomen door alle assigns die niet in een zelf-gedefinieerd block voorkomen te verplaatsen naar voor het gebruik van dynamische blokken, maar daardoor kan je code warrig worden, dus dit kun je beter niet doen.

Stel dat je bijvoorbeeld een rijtje gegevens uit je database hebt getrokken (zodra je met gegevens uit je database bezig bent, ben je vrijwel altijd ook meteen bezig met dynamische blokken), en je bent klaar met het afdrukken ervan... keer dan terug naar de ROOT. Dat scheelt je een hoop gedonder .

Voorbeeld:

de template met een dynamisch blok:

  1. <table border="1">
  2. <tr>
  3. <td>id</td>
  4. <td>naam</td>
  5. </tr>
  6. <!-- BEGIN BLOCK : GEGEVENS -->
  7. <tr>
  8. <td>{USER_ID}</td>
  9. <td>{USER_NAME}</td>
  10. </tr>
  11. <!-- END BLOCK : GEGEVENS -->
  12. </table>


bijbehorende PHP-code:
  1. <?php
  2. // aanname: er is een connectie met de database
  3. // aanname: $tpl bevat het TemplatePower object
  4. $res = mysql_query("SELECT id, name FROM users ORDER BY name ASC LIMIT 0, 10") or die(mysql_error());
  5.  
  6. while($row = mysql_fetch_assoc($res)) {
  7. // maak voor elk resultaat een nieuw block aan
  8. $tpl->newBlock("GEGEVENS");
  9. $tpl->assign(array(
  10. "USER_ID" => $row['id'],
  11. "USER_NAME" => $row['name']
  12. ));
  13. }
  14. // terug naar de root !
  15. $tpl->gotoBlock("_ROOT");
  16. ?>

Offline  Wim
Gepost op: 09 maart 2005 - 13:43
Crew algemeen

assignGlobal
Dit moet je op dezelfde manier gebruiken als assign();. Enkel veranderd deze ELKE variabele over het HELE document. Incl. de var's in de layout, die niet in een 'block' zitten!



getVarValue
Hiermee kan je de waarde van een variabele opvragen. Kan handig zijn als je soms assignGlobal gebruikt....



gotoBlock
Deze maakt het mogelijk om assign() nadien nog eens te gebruiken. Stel je hebt 2 blocks: block1 en block2 (als voorbeeld). Je gebruikt in het begin van je pagina block1. Op het einde block2. Maar, wanneer block2 is uitgevoerd, zal assign() niet meer werken voor block1. Je kan ook globalassign() gebruiken, maar dit kan dan weer in verwarring komen met andere. Daarom kan het handig zijn om gotoBlock() te gebruiken. Voorbeeldje:
  1. <?php
  2. include_once( "./class.TemplatePower.inc.php" );
  3.  
  4. $tpl = new TemplatePower( "./newBlock.tpl" );
  5. $tpl->prepare();
  6.  
  7. $tpl->newBlock("block1");
  8. $tpl->assign("var1", "waard");
  9.  
  10. $tpl->newblock("block2");
  11. $tpl->assign(
  12. "var1" => "waarde",
  13. "var2" => "waarde"
  14. )
  15. );
  16.  
  17. $tpl->gotoBlock("block1");
  18. $tpl->assign("var2", "waarde"); // zo kan je deze waarde toch nog aanpassen :)
  19.  
  20. $tpl->printToScreen();
  21. ?>




showUnAssigned
Hiermee kan je config'en om de niet-gedefineerde var's te laten zien of niet.


Nu heb ik mijn zegje ook weer eens gedaan se 

[B]EDIT:
http://template...hp?lang=nl

Alles van hun website, en in het nederlands ;)

Offline  Thomas
Gepost op: 05 mei 2005 - 18:41
Moderator

Die blokken werken toch nog niet helemaal zoals het hoort, volgens mij.

Als je het volgende script hebt:

  1. <?php
  2. require("class.templatepower.inc.php");
  3.  
  4. $tpl = new TemplatePower("<een_van_de_twee_onderstaande_templates>");
  5.  
  6. $tpl->prepare();
  7.  
  8. $tpl->newBlock("test1");
  9. $tpl->assign("test1_works", "1 works <br />");
  10.  
  11. $tpl->newBlock("test2");
  12. $tpl->assign("test2_works", "2 works <br />");
  13.  
  14. $tpl->newBlock("test3");
  15. $tpl->assign("test3_works", "3 works <br />");
  16.  
  17. $tpl->printToScreen();
  18. ?>


En als main template een van de twee onderstaande templates:

template #1:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>html template</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  6. </head>
  7.  
  8. <body>
  9. <!-- START BLOCK : test1 -->
  10. {test1_works}
  11. <!-- START BLOCK : test2 -->
  12. {test2_works}
  13. <!-- START BLOCK : test3 -->
  14. {test3_works}
  15. <!-- END BLOCK : test3 -->
  16. <!-- END BLOCK : test2 -->
  17. <!-- END BLOCK : test1 -->
  18. </body>
  19. </html>


template #2:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>html template</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  6. </head>
  7.  
  8. <body>
  9. <!-- START BLOCK : test1 -->
  10. {test1_works}
  11. <!-- START BLOCK : test2 -->
  12. {test2_works}
  13. <!-- END BLOCK : test2 -->
  14.  
  15. <!-- START BLOCK : test3 -->
  16. {test3_works}
  17. <!-- END BLOCK : test3 -->
  18. <!-- END BLOCK : test1 -->
  19. </body>
  20. </html>


En ze geven (vreemdgenoeg?) allebei dezelfde output - terwijl de "nesting van blokken" toch echt verschillend is... Eigenlijk zou je bij template #2 verwachten dat deze niet correct zou werken zonder in het script op regel 13 $tpl->gotoBlock("test1"); te zetten, maar dat gaat dus wel goed ...

Offline  gothmog
Gepost op: 10 januari 2007 - 16:43
Lid

"class.TemplatePower.inc.php" waar kan ik die vinden?
Als ik de PERL versie download van de site die er staat, kan ik niet zo'n soortgelijk bestand zien.

Offline  ranco
Gepost op: 01 juli 2007 - 19:01
PHP gevorderde

Omdat je ook geen perl versie moet downloaden, maar de normale versie waarin de phpbestanden staan

Offline  marten
Gepost op: 06 september 2007 - 14:25
Beheerder

Als iemand meer weet te vertellen over de serialized templates van template power zou ik dat graag willen weten 

Pagina:

Enkel aanvullende informatie is welkom. Geen prijzende of afkeurende reacties.
 
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.128s