PDA

Pogčedajte punu verziju : Smarty plugin: module


cvele
07. 11. 2008., 10:07
Evo jednog mog smarty plugina koji ce verovatno nekome koristiti:

Some time ago I wrote this useful smarty plugin wich will enable you to call method of any php class from smarty html template.

http://www.hazaah.com/programming/smarty-plugin-module/

bluesman
07. 11. 2008., 10:41
Znaš da sam ja hteo pišem tako nesto pre neki dan. :)

Nego, ne znam kako ovo uopste radi:
return call_user_func($params['class'].'::'.$params['method'], $params);

Zar ne treba:
return call_user_func(array($params['class'],$params['method']), $params);

Ako je klasa, callback funkcija mora da se zove kao array, zar ne ? I zasto prosledjujes funkciji sve parametre ponovo (ukljucujuci i ime klase i funkcije)? Ili sam jos pospan ili je ovo tvoje nesto zesce custom ili imam problem da razumem kod. :)

BTW, (za)ostao ti je ovaj global $conf, ne koristi se u funkciji :)
BTW2, ako se vec koristi smarty, zar nije bolje zvati $smarty->trigger_error nego amo trigger_error. Generalno isto je, nego samo zbog konzistentnosti.

cvele
07. 11. 2008., 10:54
trigger_error, slazem se. Isto kao i conf :) imam custom error handler, koji u futeru ispisuje sve sto mi treba tako da nisam mnogo vodio racuna o smarty debug-u.

Moj primer radi samo za staticke metode, sto je vise nego dovoljno dobro iz moje perspektive.

Inace poziv koji si napisao je alternativa za

mixed call_user_method ( string $method_name , object &$obj [, mixed $parameter [, mixed $... ]] )

I koliko je meni poznato njemu nije moguce proslediti string za ime klase vec mora da bude inicijalizovan objekat :)

bluesman
07. 11. 2008., 10:56
Evo sad si me "naterao" da konsultujem php manual.... Može ovo tvoje call_user_func ("a::b") ali samo od php 5.3.2. Znam da to nije moglo tako ranije :)

cvele
07. 11. 2008., 10:57
Zaboravih, thanks... prepravio sam trigere i conf.

Takodje sam zaboravio da ti odgovorim za prosledjivanje parametara. Fora je sto nicemu ne skodi da prosledim 2 dodatna parametra funkcije :) a mrzelo me da pisem dva puta unset ;)

Ne vidim sta bih dobio njima, niti sta gubim tako sto ostavljam jos dva clana areja

bluesman
07. 11. 2008., 11:11
Pa problem moze da nastane ako imas klasu X funkciju Y koja prima 2 parametra $a i $b
X::Y ($a, $b);

i ti zoves {module claass="X" method="Y" a="nesto" b="nesto"}

a ti prosledis kao X::Y( [svi parametri] ), onda ce $a da bude "X" a $b "Y" jer se parametri ne prosledjuju asocijativno vec po redu.


Samo dva predloga:

1. isset proverava da li je setovano, u tvom slucaju je problem ako je setovano a prazan string, predlazem da umesti if (!isset()) stoji if (empty())

2. mogao bi da dodas i opciono assign:

$ret = call_user_func(...
if (!empty($params['assign']))
{
return $smarty->assign($params['assign'], $ret);
}
return $ret;

cvele
07. 11. 2008., 11:42
Pogresno si skapirao filozoviju metoda koji se poziva.
On sam prima array, pa sa clanovima array-a radi nesto, ne prima 2 varijable kao u tvom slucaju nego jednu varijablu koja je asicijativni arej.

bluesman
07. 11. 2008., 12:15
Pa zato kažem, sigurno je nešto custom :) Ja sam gađao neko opštije rešenje.

ivanhoe
07. 11. 2008., 12:52
za obicne (ne staticke) pozive sta fali upotrebi register_object()?

cvele
07. 11. 2008., 13:21
hmm nisam cuo do sada za register_object ?

bluesman
07. 11. 2008., 13:31
Da, postoji register_object ali se time stvar nepotrebno komplikuje, ja za to koristim obican assign, pa recimo imam:

$neka_klasa = new Klasa()
$smarty->assing_by_ref ('neka_klasa', $neka_klasa);

a onda iz smarty zovem jednostavno

{$neka_klasa->neka_funkcija()}

Medjutim, to nikada i nije bio problem, problem su bas staticki pozivi o tome se i priča ovde, to ne mozes iz smarty da izvedes bez puno žongliranja.

cvele
07. 11. 2008., 13:36
aaaa smarty metod register_object :D ja mislio php fja :)