PHP, mint sablonnyelv

PHP, mint sablonnyelv

A weblaboron blogmarkként megjelent írás nagyrészt egyezik az álláspontommal a sablonkezelő rendszerek, sablonnyelvek terén, ezért ebbe nem is akarok nagyobb mélységekbe belemenni. Az utóbbi időben volt alkalmam huzamosabb ideig használni a Smarty-t és tényleg egy jó kis nyelvnek bizonyult arra, hogy az ember sablonokat gyártson, és azok a sablonok átláthatóak is legyenek (amennyire legalábbis egy másik nyelv+HTML átlátható maradhat). Viszont ha csak a deadlime.project alatt dübörgő WordPress-t vesszük, abban viszont a PHP veszi át ezt a szerepet is.

Vannak esetek, amikor egy külön sablonnyelv célravezetőbb lehet, a sablont írók lekorlátozása, az átláthatóság vagy egyéb okok folytán. De milyen eszközök állnak a rendelkezésünkre, ha a PHP-t szeretnénk használni erre a feladatra? A dolgot rendkívül egyszerűen is elintézhetjük, és írhatunk ehhez hasonló sablonokat is:

<?php
echo "<h1>".$data['title']."</h1>
      <p>".$data['text']."</p>";
?>

Azon kívül, hogy az így kapott sablonok baromi rondák és átláthatatlanok (főleg ha már elágazásokkal és ciklusokkal is tele vannak tűzdelve), böngészőben sem tudjuk rögtön megnézni őket. Nézzük tehát az első módosítást, amit eszközölhetünk a kódon:

<h1><?php echo $data['title']; ?></h1>
<p><?php echo $data['text']; ?></p>

Így már böngészőben is meg tudjuk nézni a készülő sablont, viszont nem lett sokkal szebb és átláthatóbb. Ha engedélyezve vana php.ini-ben a short_open_tag direktíva, akkor van lehetőségünk használni a következő formát:

<h1><?=$data['title'] ?></h1>
<p><?=$data['text'] ?></p>

Amennyiben erre nincs lehetőségünk, érdemes bevezetni egy függvényt, ami az adott indexű tagot elküldi a kimenetre. Legyen egy ilyen data($key, $return=false) függvény, ami $return=true esetén nem a kimenetre küldi az adatot hanem visszaadja. Ez esetben így módosul a kód:

<h1><?php data('title'); ?></h1>
<p><?php data('text'); ?></p>

A következő dolog a vezérlési szerkezetek. Az ember hamar bele tud bonyolódni a sablon végén gyülekező <?php } ?> stringekbe, hogy az akkor most melyik if vagy éppen while végét jelzi. Ilyen esetekben egész jól használhatók a PHP alternatív vezérlési szerkezetei, melyek annyiban térnek el a jól megszokott szintaxistól, hogy a soruk végén nem nyitó kapcsos zárójel van, hanem kettőspont és nem záró kapcsos zárójellel végződnek hanem a nevüknek megfelelő endif;, endwhile;, endfor;, endforeach;, vagy endswitch; szavakkal. Nézzünk példát is:

<? while ($post = data('post_object', true)->get_next_post()): ?>
<div class="post" id="post-<?=$post['id'] ?>">
    <? if ($post['id'] === 1): ?>
        <h1><?=$post['title'] ?></h1>
    <? else: ?>
        <h2><?=$post['title'] ?></h2>
    <? endif; ?>
    <div class="post-text"><?=$post['text'] ?></div>
</div>
<? endwhile; ?>

Persze a while-ban használt szerkezet csak PHP 5-ben működőképes, legalábbis az általam legutóbb használt PHP 4-es verzió még nem szerette, ha egy függvény által visszaadott objektumra ilyen módon hivatkozok. Nézzük meg, hogy egy hasonló dolgora használt kód hogyan nézne ki Smarty-ban:

{section name="post" loop=$posts}
<div class="post" id="post-{$posts[post].id}">
    {if $posts[post].id == 1}
        <h1>{$posts[post].title}</h1>
    {else}
        <h2>{$posts[post].title}</h2>
    {/if}
    <div class="post-text">{$posts[post].text}</div>
</div>
{/section}

Tény, hogy ez azért egy sokkal átláthatóbb sablonkód (és ha még azt is számításba vesszük, hogy a PHP-nél a legjobb esetet vettem figyelembe, mivel az olvashatóságot még ronthatná a teljes <?php nyitótag és a <?= helyett az echo-s változat), viszont arról sem szabad megfeledkezni, hogy ez is csak egy alternatíva, mondjuk egy olyan alternatíva, amikor a sablonkódot csak mi, vagy csak olyan emberek írják, akik értenek a PHP-hez. Nézzünk még a végére egy kis WordPress template kódot is, ami hasonló célt szolgál mint a fenti két kód:

<div class="post" id="post-<? the_ID(); ?>">
    <? if ($post->ID === 1): ?>
        <h1><? the_title(); ?></h1>
    <? else: ?>
        <h2><? the_title(); ?></h2>
    <? endif; ?>
    <div class="post-text"><? the_content('Tovább...'); ?></div>
</div>

Mint az látszik, olyan projektekben is használható a PHP alapú sablonnyelv-rendszer, mint a WordPress, amit nem hiszem, hogy csak (PHP) programozók használnának és nem hiszem, hogy csak ők írnának rá sablonokat, vagy piszkálnának bele a már meglévő sablonjaikba. Vagy egy másik jó példa a Drupal lehetne, ami szintén egy elég menő tartalomkezelő rendszer (bár ott, amennyire tudom több féle megoldás is létezik a template írására). Lényeg, hogy egyik módszert sem akarom lehordani, csak néha érdemes elgondolkozni, hogy az éppen aktuális munka készítése során mikor szükséges külön eszközt használni arra, amit a PHP-vel is könnyen megoldhatunk.

Hozzáfűznél valamit?

Dobj egy emailt a blog kukac deadlime pont hu címre.

Feliratkoznál?

Az RSS feed-et ajánljuk, ha kedveled a régi jó dolgokat.