DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   CMS w/ Smarty, problem... (http://www.devprotalk.com/showthread.php?t=2735)

krcko 10. 04. 2007. 03:42

CMS w/ Smarty, problem...
 
pozdrav ljudi,

napravio sam veliku gresku, uzeo sam za maturski da radim sajt moje skole i to u obliku cms-a (da bi njima, jelte bilo lakse da menjaju sadrzaj). sad kada sam video koliko tu stvarno ima posla vidim da sam se opako zeznuo, al sta mogu, moram da uradim do kraja...

na samom pocetku sam naisao na problem, evo sta me muci:

imam tabelu TBL_PAGES gde mi se nalaze sve stranice, izmedju ostalih polja, u toj tabeli se nalaze i polja 'template' i 'content'.
'template' sadrzi naziv smarty sablona, a u 'content' se nalazi sadrzaj stranice koji moze (i uglavnom ce to biti slucaj) da sadrzi smarty kod. e sad, meni nije problem da taj sadrzaj provucem kroz smarty i jednostavno uradim assign('content', $result) i to trenutno radim, ovako:
Kôd:

$this->_compile_source('content' . $page['id'], $page['content'], $compiled);

ob_start();
$this->_eval('?>' . $compiled);
$result = ob_get_contents();
ob_end_clean();

$this->assign('content', $result);

ali problem sa ovim (kod sam preuzeo iz {eval} funkcije) je sto se $page['content'] kompajlira svaki put (iako se vrednost 'content' polja nije promenila)...

da li postoji mogucnost (i kako?) da se kompajlirani $page['content'] ubaci u kompajliranu verziju sablona stranice?

e sad, ja mislim da bi tu bilo problema, jer ce vecina stranica koristiti jedan isti template a sve ce imati razlicit sadrzaj, ne znam da li moze nekako da se za svaki $smarty->display() napravi poseban kompajlirani fajl (iako ce biti vise poziva sa istim templateom, al razlicitim sadrzajem)


sta mi je ciniti?

krcko 10. 04. 2007. 04:10

evo sad sam malo procesljao smarty manual i upoznao se sa resource-ima :)

resio sam problem na sledeci nacin:
- prilikom kreiranja novog Page objekta (koji mi extenduje Smarty) registrujem novi resource 'content:'
- kada treba da prikazem stranu procitam njen 'content' i stavim ga u promenljivu ($this->content)
- pozovem display('content:' . $page['id'])
- a iz content_source funckije kao source vratim $this->content

problem mi je ovaj timestamp... sta da radim sa njim?
da li da dodam 'lastchanged' polje u tabelu ili mi to nije potrebno? (mislim da ovaj timestamp ima veze sa kesiranjem, a mozda i sa kompajliranjem, nisam bash siguran a mrzi me da nocas kopam po smartijevom kodu...)

Mr.Paja 10. 04. 2007. 10:44

Glupo pitanje, zar ti nije lakše da uzmeš neki postojeći open source CMS, mislim ukoliko ti nije zadatak da baš ti kreiras CMS. Pregled CMS-ova sa on-line demo-ima možeš naći ovde

p.s. Naravno ovo je predlog ako ti treba brzo rešenje, za tvoje dobro je da prođeš step-by-step kreiranje CMS-a, mnogo više ćeš naučiti ....

ivanhoe 10. 04. 2007. 12:35

smarty ima ugradjeno keshiranje outputa, to ti resava problem za strane koje imaju manje vise statican sadrzaj

bluesman 10. 04. 2007. 13:32

Citat:

Originalno napisao krcko
evo sad sam malo procesljao smarty manual i upoznao se sa resource-ima :)

resio sam problem na sledeci nacin:
- prilikom kreiranja novog Page objekta (koji mi extenduje Smarty) registrujem novi resource 'content:'
- kada treba da prikazem stranu procitam njen 'content' i stavim ga u promenljivu ($this->content)
- pozovem display('content:' . $page['id'])
- a iz content_source funckije kao source vratim $this->content

problem mi je ovaj timestamp... sta da radim sa njim?
da li da dodam 'lastchanged' polje u tabelu ili mi to nije potrebno? (mislim da ovaj timestamp ima veze sa kesiranjem, a mozda i sa kompajliranjem, nisam bash siguran a mrzi me da nocas kopam po smartijevom kodu...)

Timestamp je obicno timestamp polje koje oznacava kada je promenjen template. Na osnovu toga smarty provaljuje da li treba ponovo da ga kompajlira ili ne.

Kod "default" sistema sa fajlovima, ako je ukljuceno $smarty->compile_check on za svaki include-ova template proverava datum i vreme poslednje izmene fajla, ako je novije od kompajliranog template - on ga kompajlira ponovo.

Kada koristis DB redources, on ne moze da provali datum izmene fajla, zato ti je potreban timestamp. Sve sto ti treba da uradis je da kad god izmenis sadrzaj template (uradis UPDATE u bazi) - da promenis i taj timestamp na UNIX_TIMESTAMP() ili NOW(). To je ako si definisao polje kao unisgned int, ali ako si definisao polje kao TIMESTAMP (procitaj mysql manual) onda je to sve automatski.

Znaci da bi koristio database kao resource moras da napravis 4 funkcije:

PHP kôd:

function get_template ($tpl_name, &$tpl_source, &$tpl_timestamp)
{
    
$tpl_source "ovde citas iz baze sadrzaj recorda kome je tpl_name = $tpl_name, kako god hoces.... mozes i iz nekog custom CMS, joomla, whatever";

    return 
true;
}

function 
get_timestamp ($tpl_name, &$tpl_timestamp, &$smarty_obj)
{
    
$tpl_timestamp "ovde vracas samo timestamp recorda odozgo";

    return 
true;
}

function 
get_secure ($tpl_name, &$smarty_obj)
{
// all templates are secure
    
return true;
}

function 
get_trusted ($tpl_name, &$smarty_obj)
{
// this is actually not used in template
    
return true;


To generalno znaci da u tim funkcijama mozes da ubacis bilo koje funkcije bilo kog CMS-a koji ce da ti cita templates iz tvoje tabele u "izvornom" obliku

onda pozove:
PHP kôd:

$smarty->register_resource('db'
    array (
        
'get_template',
        
'get_timestamp',
        
'get_secure',
        
'get_trusted'
        
)
    ); 

i ucitas template sa

PHP kôd:

$smarty->display ('db:template_name'$cache_id); 

I smarty sam odradi compile, cache... sta god....

To isto znaci da istovremeno mozes da imas oba sistema, pa recimo cuvas header i footer u odvojenim fajlovima na disku:

PHP kôd:

$smarty->display ('header.tpl');
 
$smarty->display ('db:sadrzaj.tpl');
$smarty->display ('footer.tpl'); 

I generisace ti celu stranu kako treba, header i footer je procitao sa diska, a 'sadrzaj.tpl' iz baze.

krcko 10. 04. 2007. 17:55

@Mr.Paja:
pa mogao sam i da uzmem neki open source cms (cms made simple npr) jer me je profesor samo bledo pogledao kada sam rekao da cu da radim cms u php-u (stvarno je sramota ko sve predaje informatiku kod nas, ali to je za drugu temu...) i znam da niko zivi nece da gleda kod koji sam uradio (sem eventualno grupe djaka koje bih ja okupio da rade na odrzavanju sajta kad ja odem iz skole). ali (kao sto si rekao) za "moje dobro" je bolje da sam uradim cms (ne treba mi neki ultra-mega-giga cms sa tonom modula, vec najjednostavniji moguci)...

@ivanhoe:
znam za keshiranje ali sam hteo i da mi cuva kompajlirani kod (sto bi, po mom misljenju, trebalo da jos malo ubrza prikaz strane)

@bluesman:
hvala na odgovoru, mada sam to sam skontao danas kada sam pogledao malo bolje o cemu se radi (sinoc oko 4 am me bash mrzelo da kopam po smartiju :D), i logicno je da se timestamp za to koristi mada meni to nocas nije bilo tako logicno (bio sam pospan, rekoh vec :) ) tj mislio sam da to ima veze sa kesiranjem...


hvala svima na odgovorima


Vreme je GMT +2. Trenutno vreme je 17:01.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.