Custom template tags pentru Xamin Handlebars

tutoriale
tips
xamin-handlebars

(Ionuț Staicu) #1

Problema cu care m-am confruntat azi a fost că am avut nevoie de randarea template-urilor handlebars în clar (neparsate).

Adică template-ul ăsta:

<input type="text" name="{{ group }}[{{ id }}]" value="{{ value }}" />

Voiam să fie afișat fix așa, fără a fi parsat.

Până acum am mai avut nevoie o singură dată și am preferat să „compilez” template-ul în obiecte JS. Acum e un pic diferit, iar template-urile JS nu se pretează. Prin urmare, facem așa:

Xamin

Xamin are una dintre cele mai bune implementări handlebars pentru PHP, prin urmare o folosesc pe asta. Și pentru ca lucrurile să fie un pic mai ușor de „digerat”, am făcut și un wrapper pentru clasa asta (este pentru WP, dar se pot scoate filtrele și poate fi folosit oriunde):

Se folosește simplu:

echo Tpl::get('tplName', []); // va parsa și va afișa views/tplName.hbs

Boon, acum, cum schimbăm tag-urile?

Tokenizer

După ce am săpat prin sursă, am găsit partea asta ca fiind singurul loc unde sunt definite tag-urile:

Prin urmare, facem câteva lucruri: extindem Tokenizer și trimitem o instanță la Tpl:

class HandlebarsCustomTokenizer extends \Handlebars\Tokenizer
{
	protected function reset()
	{
		parent::reset();
		$this->otag = '<%';
		$this->ctag = '%>';
	}
}

Acum nu ne rămâne decqt să trimitem instanța:

echo Tpl::get('tplName', [], [], new HandlebarsCustomTokenizer);

Și cam atât :slight_smile:


(Ionuț Botizan) #2

Poate n-am înțeles eu ce vrei să faci, dar, de vreme ce nu vrei să parsezi template-ul, mie-mi pare că era de-ajuns:

echo file_get_contents('views/tplName.hbs');

:thinking:


(Ionuț Staicu) #3

Haha, dacă pui problema în felul ăsta, da :smiley:

Dar aveam nevoie să trimit și câteva date dinamice spre template (cu <% %>)


(Ionuț Botizan) #4

Ah, cred că înțeleg… Ai vrut un template care să conțină variabile dar în care să afișezi și un exemplu de cod… Dacă-i așa, cred c-ai fi putut face escape la acoladele care trebuiau să rămână nemodificate.

<input type="text" name="\{{ group }}[\{{ id }}]" value="\{{ value }}" />

…sau poate tot n-am înțeles eu cum trebuie! :smiley:


(Ionuț Staicu) #5

Am un template pe care vreau să-l folosesc și din js și din php, folosind aceleași tag-uri: {{ var }}. Adițional, atunci când trimit template-urile spre a fi folosit în JS, aș vrea să pot seta chestii.

<input type="text" name="{{ group }}[{{ id }}]" value="{{ value }}" data-foo="<% bar %>" />

Doar că… chiar dacă „pe hârtie” arăta bine, mi-am dat seama că template-urile interpretate corect vor avea partea <% bar %> prezentă ca atare.

Oi reveni cu rezolvarea când voi avea nevoie de implementarea asta mixtă :smiley:


(Ionuț Botizan) #6

Ahaaa! Acum înțeleg! :smiley: