[ WEXY @ 11.09.2004. 12:31 ] @
Vidim da je o ovome bilo reči u jednoj od TOP tema, međutim moj problem se malo razlikuje i unapred se izvinjavam ako ovo predstavlja ponavljanje iste teme.

Početnik sam sa Smarty-jem, sinoć sam ga skinuo sa neta i instalirao, igrao se tu i tamo, skontao par stvari i rešio da krenem dalje. Pre izvesnog vremena sam počeo da pravim neki jednostavan blogger i to je sve išlo lepo međutim nedostajali su šabloni i postalo je previše komplikovano mešati html i php u istom fajlu. Nađoh Smarty i sreći nikad kraja :)

Problem je sledeći, imam index.tpl koji je podeljen na 4 dela (header, content, sidebar, footer). U index.tpl se nalazi dizajn za sve osim content-a. Content bi trebao da bude odgovarajuća stranica u zavisnosti od upita korisnika i da ima svoj zaseban template (post.tpl, modify.tpl, delete.tpl, etc..).

Možda ja grešim, ali u index.tpl ne mogu da napišem na mestima gde mi trebaju header, footer i sidebar {include....} pošto su neke stvari i u tim šablonima generisane od php skripte index.php.

Source code od index.php (uprošćen):

Code:

<?php
    ...
    ...
    assign('naslov', 'NEKI NASLOV');    // Ovo ide u header deo (index.tpl)
    assign('Link1', 'Index');                // Ovo ide u sidebar deo (index.tpl)
    ...
    ...
    // E ovde treba da dodje nesto sto bi ukljucilo i content.tpl (odgovarajući)
    // recimo include('content.php'); koji koristi content.tpl mada sumnjam da bi
    // ovako radilo
    ...
    ...
    assign('credits', 'Pera mika laza');  // Ovo ide u footer deo (index.tpl)
    $smarty->display('index.tpl');
?>


Kako se ovo rešava?
Hvala unapred na odgovoru.
[ WEXY @ 11.09.2004. 14:47 ] @
Čitanje Smarty manual-a se isplati. FETCH metoda radi upravo ono što mi treba. Sad ću napisati kako sam to primenio, može nekome da zatreba iako nisam siguran da je ovo baš adekvatan način i da se to tako radi.

Fajlovi:
index.php, glavna skripta, radi uglavnom ceo posao
index.tpl, globalni kostur za sve stranice sadrži header, footer, sidebar
content.tpl, kostur za content deo index.tpl-a

Stari kod:

Code:

<?php
    ...
    ...
    assign('naslov', 'NEKI NASLOV');    // Ovo ide u header deo (index.tpl)
    assign('Link1', 'Index');                // Ovo ide u sidebar deo (index.tpl)
    ...
    ...
    // E ovde treba da dodje nesto sto bi ukljucilo i content.tpl (odgovarajući)
    // recimo include('content.php'); koji koristi content.tpl mada sumnjam da bi
    // ovako radilo
    ...
    ...
    assign('credits', 'Pera mika laza');  // Ovo ide u footer deo (index.tpl)
    $smarty->display('index.tpl');
?>


Rešenje, novi kod:

Code:

<?php
    ...
    ...
    assign('naslov', 'NEKI NASLOV');    // Ovo ide u header deo (index.tpl)
    assign('Link1', 'Index');                // Ovo ide u sidebar deo (index.tpl)
    ...
    ...
        assign('naslov_contenta', 'Vesti');
        assign('text_contenta', $vesti);
 
        $content = $smarty->fetch('content.tpl');
        assign('content', $content);

        // fetch radi nešto slično kao display, samo sto ne ispisuje stranicu već
        // to stavlja u promenljivu u ovom slucaju $content, posle preko assign
        // tu istu promeljivu sa HTML kodom dodelimo polju {$content} u index.tpl
    ...
    ...
    assign('credits', 'Pera mika laza');  // Ovo ide u footer deo (index.tpl)
    $smarty->display('index.tpl');
?>


Sa ovim jedini problem, koji i nije veliki, je taj što se u content.tpl prosleđuju i sve dodeljeno sa assign, al pošto tamo nema odgovarajućih polja to neće ni biti prikazano. Jedino treba da se pazi da se ne dupliraju polja u index.tpl i u ostalim template fajlovima koje se ugeždavaju u index.tpl.

Verovatno postoji bolji način kojim bi se ovo eliminisalo, tako da ako neko zna neka postuje.
[ NetworkAdmin @ 12.09.2004. 09:23 ] @
Da fetch ti moze mnogo pomoci da posaljes u smarty "string" koji ti treba a logiku rjesis programabilno u php sto je mislim dosta dobro.

Nekada umjesto da fetchujes mozes poslati varijablu u template sa imenom fajla koji zelis da se include-uje. Ako ne razumijes reci da ti dam primjer.
[ bluesman @ 12.09.2004. 22:07 ] @
Ne znam zasto tako radis osim ako ti bas to treba. Kao i u PHP mozes da includeujes...

ako imas header.tpl, footer.tpl i index.tpl
ti mozes u index.tpl da napises

{include file="header.tpl"}

... tvoj sadrzaj ...

{include file="footer.tpl"}

onda u tvom index.php imas samo
$smarty->display('index.tpl') i bas te briga ste je u index.tpl...

Posto su ta dva dela uglavnom fiskni, bolje je da ih napravis kao poseban tpl pa ih include-ujes, nego da stalno sa $smarty->assign (...) saljes templete-u vrednosti, brze je ovako i jede manje resursa.

Fetch se uglavnom koristi kada hoces da nesto "pametno" (nesto drugo sto nije display) radis sa sablonom, recimo ako ima neke sablone koji se salju na mail, mozes da ih napravis kao sto pravis i sve ostale, prosledis mu varijable... a onda ga fetch-ujes pa to sto si "pokupio" posaljes na mail sa mail() funkcijom...
[ WEXY @ 13.09.2004. 18:23 ] @
Mislim da se nismo baš razumeli do kraja, imam index.tpl koji sadrži sve sem content dela koji bi trebao da ima svoj zaseban template (post.tpl, edit.tpl, delete.tpl, etc...). Iz tog razloga moram sa fetch da dobijem HTML od tog template-a koji ubacujem u index.tpl i da ga prosledim posle kao promenljivu sa assign u index.tpl.

To sad nije ni bitno, problem sam rešio, hvala na pomoći u svakom slučaju.
[ bluesman @ 14.09.2004. 00:37 ] @
To je to, samo na drugi nacin, a assign celog template da bih ga prikazao ima "ruzne" posledice.

mozes
index.php:

$smarty->assign ('do_what', 'edit');


index.tpl:

{include file="header.tpl"}

{if $do_what == 'edit'}
{include file='edit.tpl'}
{if $do_what == 'delete'}
{include file='delete.tpl'}
{else}
{include file='default.tpl'}
{/if}

{include file="footer.tpl"}
[ Dr NIK @ 07.10.2004. 22:12 ] @
Kako si to resio, reci odma!!!!!!
[ noviKorisnik @ 23.11.2004. 21:17 ] @
Citat:
bluesman:
Code:
{include file="header.tpl"}

{if $do_what == 'edit'}
     {include file='edit.tpl'}
{if $do_what == 'delete'}
     {include file='delete.tpl'}
{else}
     {include file='default.tpl'}
{/if}

{include file="footer.tpl"}

Radi li ovo posao?
Code:
{include file="header.tpl"}
{assign var="do_what" value=$do_what|default:"default"}
{include file="$do_what.tpl"}

{include file="footer.tpl"}