[ _CaRtMan_ @ 23.08.2008. 13:06 ] @
| Zdravo. Zanima me kako funkcionise to? Kako napraviti vlastiti template engine. Recimo da mi u html fajlu:
{nesto} zamjeni sa $nesto varijablom.
Pa uradim $nesto = load_file("login_box.html");
a vamo stavim {nesto} i napravim load_file(); funkciju koja ce raditi kao include i sl. Kako napraviti sopstveni template engine?
Zatim i prikaz podataka iz tabele i sl.
Pozz |
[ Man-Wolf @ 23.08.2008. 15:19 ] @
Treba da znas Regular Expression-e. Pomocu njih, uzimas sve sto se nalazi izmedju { }, obradjujes i vracas rezultate :-))
http://www.regular-expressions.info/ - Tutorial
[ _CaRtMan_ @ 23.08.2008. 15:33 ] @
Hehe, skontao sam u medjuvremenu da bi se to moglo rjesiti sa Regular Expressions. Ali ne znam ja to. Zapravo nije mi jasna razlika izmedju funkcija.
ereg_replace
ereg
eregi_replace
eregi
preg_replace_callback
preg_replace
preg_match
preg_grep
preg_match_all
preg_mat i preg_match_all !? To me buni i tako to... sta koristiti i sl. :S
[ Skaarj @ 23.08.2008. 16:09 ] @
ereg_* zaboravi. to je mnogo sporije od preg_ a uz to i depricated tako da ga u php6 nece ni biti.
Dakle ostaje ti preg_*. U pitanju su perl kompatibilni regularni izrazi.
E sad koja funkcija sta i kako radi moraces da saznas u php manualu.
[ _CaRtMan_ @ 23.08.2008. 17:09 ] @
Aha cool. A mogu li kako staviti string tj. postoji li neka funkcija gdje cu u string staviti source nekog fajla? php ili html, svejedno je.. dakle ono CTRL+U kad pritisnem u Firefoxu :) pa bih po tom stringu trazio ?
[ Miroslav Ćurčić @ 23.08.2008. 17:23 ] @
Može i jednostavnije sa: str_replace...
[ _CaRtMan_ @ 23.08.2008. 17:24 ] @
sta sa str_replace ?
[ Skaarj @ 24.08.2008. 09:57 ] @
Generalno str_replace je najbrzi nacin da {$pera} zamenis sa nekom vrednoscu u nekom fajlu. Regularni izrazi se koriste ukoliko ti trebaju neki kompleksni konstrukti.
Sto se tice funkcije koja bi ucitala neki fajl u string to moze sa file_get_contents().
[ _CaRtMan_ @ 24.08.2008. 12:40 ] @
Napravio sam ovako:
Code:
<?php
function load_module_file($source){
$file = file_get_contents($source);
return $file;
}
function zamjena($search, $replace, $source){
$search = "\${".$search."}\$";
$replace = load_module_file($replace);
echo preg_replace($search, $replace, load_module_file($source));
}
zamjena("login_box", "do.html", "home.html");
zamjena("nesto", "nest.html", "home.html");
?>
Al mi ucita vise puta home.html i sl. Mozete li mi pomoci kako bih napravio funkciju zamjena recmo tako da se zove koja ce pretrazivati po fajlu koji ucitam jednom. Dakle trazi {login_box} i zamjeni s necim i sl.
??
[ agvozden @ 24.08.2008. 14:14 ] @
pa, ne valja to tako.
dva puta ucitavas home.html tako da ti biva pregazeno ono sto si vec uradio...
Ukoliko nisi siguran najbolje je da uzmes smarty, ili na smarty-way napraviti sintaksu...
tipa:
$tpl = new Template();
$tpl->assign("login_box", $login_box);
$tpl->assign("nesto", $nesto);
$tpl->fetch("template.html);
// ili $tpl->display("template.html);
[ _CaRtMan_ @ 24.08.2008. 17:00 ] @
Ma da najbolje je da koristim smarty, prilagodim ga sebi.
Ugl hocu ovako nesto:
require 'libs/Smarty.class.php';
class Content extends Smarty{
// pa da mogu ovako:
$this->display("index.html");
}
Ugl izbaci
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C:\xampp\htdocs\cms\index.php on line 7
kako bih mogao ovako?
[ Nemanja Avramović @ 24.08.2008. 17:38 ] @
U klasi moraš da definišeš funkciju, ne možeš tek tako zvati $this->display...
[ _CaRtMan_ @ 24.08.2008. 20:51 ] @
Da da skontao sam hvala.
u settings.class.php imam ovu funkciju:
function getvar($var){
$get = addslashes($_GET["$var"]);
return $get;
}
dalje
index.php
<?php
// Poziva klasu za template
require 'libs/Smarty.class.php';
// Poziva klasu za postavke neke
require 'libs/Settings.class.php';
$S = new Settings;
switch('$S->getvar("param")'){
case '$S->getvar("param")':
$S->assign("inc", include("modules/plugin/".$S->getvar("param")));
break;
}
$S->display("index.html");
?>
i ovdaj dio mi dobro ne zamjeni u odgovarajuci DIV, dok ako uradim
$S->assign("inc", "nesto");
ispise nesto u dobrom DIV-u.
Na koji nacin bih ovo mogao rjesiti?
ovako na vrhu uspise ono sto ima u home.php , a u odgovarajucem divu broj JEDAN (1).
[ Zmaj @ 25.08.2008. 12:57 ] @
Citat: _CaRtMan_:
switch('$S->getvar("param")'){
case '$S->getvar("param")':
$S->assign("inc", include("modules/plugin/".$S->getvar("param")));
break;
}
Za pocetak nauci razliku izmedju jednostrukih i dvostrukih navodnika, zatim nauci kako se koristi switch/case/default konstrukcija, zatim nauci kako radi include... Kad sve to procitas i naucis onda kreni da pravis template engine, a dok pravi procitaj uptstvo za smarty, pa probaj da ga koristis, mozda potrazis i neki brzi od smartija, ili kao i sami tvorci smartija dodjes do zakljucka da je smarty nepotreban i spor i da je najbrze koristiti cist php koji je lepo organizvan...
nadam se da sam ti pomogao...
ps mislim da je ako glupo pitati ljude cemu sluzi koja komanda a ne sesti i procitati sam... bilo bi lepo od tebe da si napravio malo istrazivanje pre nego sto si postavio pitanje... nemoj biti lenj
[ _CaRtMan_ @ 25.08.2008. 17:31 ] @
Glupo je ono sto sam napisao moglo je samo ako postoji varijabla param da ide include. dakle
?param=home.php ucita home.php .
Sad ne znam da li postoji u Smarty kako da upisem u neki div {$inc} a da mi umjesto toga includa onaj file koji pise u param varijabli. Ne znam kako bih to izveo.
Pokusao sam onako sa assign, ali ne uspijevam.
[ dakipro @ 25.08.2008. 20:12 ] @
Da si probao sa {require } uspeo bi. A uspeo bi i sa {$inc} da si procitao manual lepo i upotrebio mastu koristeci $smarty->fetch().
Ako imas probleme sto se tice smarty templejt endzina, postoji i podforum koji je specificno tome namenjen pa je daleko bolje tamo da postavis konkretno pitanje 
[ _CaRtMan_ @ 25.08.2008. 20:52 ] @
Ne mogu da nadjem {require} na smarty.net manualu. A sto se tice smarty->fetch(); to vraca output template-a , a meni treba output php file-a , ne znam da li to predstavlja problem ?
home.inc.php :
Code:
<?php
class Content extends Settings {
var $title;
var $keywords;
var $desc;
function template()
{
// Title, keywords i description
$this->title = "Početna stranica";
$this->keywords = "Cms, content management system";
$this->desc = "Početna stranica CMS Portala";
$this->display("login_box.html");
}
}
$content = new Content;
$content->template();
?>
Code:
<?php
// Poziva klasu za template
require 'libs/Smarty.class.php';
// Poziva klasu za postavke neke
require 'libs/Settings.class.php';
$S = new Settings;
// Učitava
$S->assign("inc", $S->fetch("../plugin/home.inc.php")); // ovdje sam isao jedan back :S
$S->display("index.html");
?>
A glupo mi da sad otvaram temu tamo.
[ dakipro @ 26.08.2008. 08:17 ] @
Pod require sam mislio na include, lapsus. Usput, nema nesto previse smarty funckija da ne bi mogo da ih procitas sve.
Dalje, metode neke klase se obicno pozivaju van samog fajla klase, u cemu je poenta inkludovati home.inc.php koji ima klasu, kad ti tu klasu uvek isto pozivas i na isti nacin u tom fajlu. Lepo napravi funckiju koja ce da ti vrati sadrzaj, a ne da inkludujes fajl koji "vraca" sadrzaj.
Znaci umesto
$S->assign("inc", $S->fetch("../plugin/home.inc.php")); // ovdje sam isao jedan back :S
stavi
$S->assign("inc", $content->template());
I glupo je nastaviti temu ovde a ne otvoriti novu tamo gde joj je mesto 
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|