:)
Zdi se mi potratno da bi nekdo sel izumljat toplo vodo, v tem malem morju temlate jezikov, poleg tega pa je tukaj php ki opravi svoje delo vec kot odlicno. Ce pa zares zelis blizje spoznati ta svet ti vseeno priporocam da si ogledas Smarty ... kot sem ze prej napisal obstaja malo morje zadev za njega pa tudi sam lahko hitro napises kaksno zadevico.
Navedel ti bom primer pre plugina. To je dolocena skripta, ki se izvede preden se poslje template v obdelavo Smarty parserju. Primeri takih filtrov so ce zelis npr odstraniti odvecne komentarje iz kode, popraviti slovnicne napake z Dictionarijem ... Ta primer plugina v kodi najde inline Javascript in z uporabo
JsMin classa ven pomece odvecno saro-> komentarje, presledke, vrstice ...
plugin registriramo ob inicializaciji smarty-ja:
...
$smarty = new Smarty();
$smarty->load_filter('pre', 'jsMin');
Kot vidimo (glej spodaj) je celoten inline Javasript obdan z custom Smarty tagom {jsMin}{/jsMin}. V kodi opazimo tudi tag {t}{/t} ki je bil registriran kot block funkcija ki prevede del znotraj taga (wraper je lahko razlicen: cvs, xml, Gettext) ... mogoce o tem vec kdaj drugic :) Vsi smarty tagi znotraj javascripta so obdani z dodatnima oklepajima {} ker s tem dolocimo pozneje v funkciji JsMin, katere dele kode naj smarty ne parsa. Ja sam Smarty ne prebavlja embendanega Javascripta in CSS-ja in mu je potrebno povedat eksplicitno kako pa kaj.
Poglejmo sedaj funkcijo.
/**
* Mimize embanded JsScript
*
* @uses _jsMin
* @param string $tplSource
* @param object $smarty
* @return string
*/
function smarty_prefilter_jsMin($tplSource, &$smarty)
{
$regex = "/\{jsMin\}(.*?)\{\/jsMin\}/s";
return preg_replace_callback($regex, _jsMin, $tplSource);
}
/**
* Does the hard work
*
* @param array $m
* @return mixed
*/
function _jsMin($m) {
$jScript = $m[1];
//Jscript without {jsMin} is second
$jScript = preg_replace('/{{/', '{/literal}{', $jScript);
$jScript = preg_replace('/}}/', '}{literal}', $jScript);
//do not interprate display as is
/**
* javascript packer
*/
require_once 'jsmin.php';
$jScript = JSMin::minify($jScript);
$result = "{literal}<script type=\"text/javascript\">\n";
$result .= $jScript . "\n";
$result .= '</script>{/literal}' . "\n";
return $result;
}
Na kratko: Z regEx dobimo ven celotno vsebino ki je med {jsMin} tagom. Ce je znotraj se kaksen smarty tag insertamo literal in dobimo {/}literal{tag}{literal}, posljemo vsebino skozi Jsmin jo obogatimo z script tagom in vrnemo nazaj smartyju :)
Template izgleda priblizno takole:
[HTML]
{jsMin}
function employerRegister(formId) {
var valid = new Validation(formId, {onSubmit:false,immediate:true,stopOnFirst:true} );
Validation.addAllThese([
['required', '{{t}* Polje mora biti izpolnjeno.{/t}}', function(v) {
return !Validation.get('IsEmpty').test(v);
}],
['validate-number', '{{t}* V to polje vpišite samo številke.{/t}}', function(v) {
return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v));
}],
['validate-email', '{{t}* Vpišite veljaven elektronski naslov. Primer fred@domain.com .{/t}}', function (v) {
return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w-]{1,}(.){1,3}$/.test(v)
}]
}
}
{/jsMin}
[/HTML]
Smarty dobi:
[HTML]
{literal}<script type="text/javascript">
function employerRegister(formId){var valid=new Validation(formId,{onSubmit:false,immediate:true,stopOnFirst:true});Validation.addAllThese([['required','{/literal}{t}* Polje mora biti izpolnjeno.{/t}{literal}',function(v){return!Validation.get('IsEmpty').test(v);}],['validate-number','{/literal}{t}* V to polje vpišite samo številke.{/t}{literal}',function(v){return Validation.get('IsEmpty').test(v)||(!isNaN(v)&&!/^\s+$/.test(v));}],['validate-email','{/literal}{t}* Vpišite veljaven elektronski naslov. Primer fred@domain.com .{/t}{literal}',function(v){return Validation.get('IsEmpty').test(v)||/\w{1,}[@][\w-]{1,}(.){1,3}$/.test(v)}],['validate-password','{/literal}{t}* Vaše geslo mora biti daljše od 5 znakov in ne sme biti enako vašemu E-mail naslovu.{/t}{literal}',{minLength:5,notEqualToField:'employerEmail'}],['validate-password-confirm','{/literal}{t}* Ponovljeno geslo se ne ujema z vpisanim. Ponovno vnesite vaše geslo.{/t}{literal}',{equalToField:'employerPassword'}]]);var result=valid.validate();if(result==false){$('errorDiv').style.display='block';$('errorH1').innerHTML='{/literal}{t}Registracija novega delodajalca - napaka!{/t}{literal}';}else{alert('submit');}}
</script>{/literal}
[/HTML]
HTML source v browserju pa izgleda enako le da nima {literal} tagov.
Velika vecina razvijalcev uporablja template sisteme ne zaradi tega da v php-ju nastavijo spremenljivko assign->misko = "wow super je tole" ampak da si predvsem olajsajo zadeve s tem da si postopoma pripravijo razne plugine, helperje, filtre ki jim potem z pridom uporabljajo!
LP