Běžné funkce šablon, extends template nebo helpery?
- mcmatak
- Člen | 504
Zdravím,
rozhodl jsem se vyzkoušet nette, takže v podstatě mám načteno začínáme s …, chtěl bych se zeptat jak by jste řešili běžnou situaci, kdy je potřeba vkládat nějaký obvyklý text do šablon?
Konkrétně třeba kód google analytics, toplist atd. atd.
Dosud jsem to měl řešeno rozšířením objektu šablon – Template (mimo nette), jak to vidíte v nette, co je podle Vás správný postup? Helpery? V každém případě jsou to věci, které jsou součástí každého webu, takže bych byl rád, aby se nesli s každým novým projektem, bez nutnosti jakkoli vytvořenou základní kostru nového webu upravovat s dalším projektem.
díky za tip
- mcmatak
- Člen | 504
to ani snad ne, myslel jsem to obecně, podobně jako rozšíření šablon o funkci co mi vrací už konkrétně vytvořený select se všemi parametry co potřebuji, nebo proste funkce co vytvoří opakovaně se zobrazující blok, nechci přece každý select includovat,
prostě předtavte si funkci která tvoří hlavičku nějakého html bloku, ta funkce počítá jestli je to sudý nebo lichý blok, pamatuje si a zjišťuje jestli naposledy byl otevřený (display:block, display:none) atd. atd.
není ani tak podstatné co dělá, ale chci aby to fungovalo nějak ->displayFiltrRow(„id“); další řádek dám displayFiltrRow(„nazev“) atd. a nechci se starat o to co se děje uvnitř, prostě ta funkce si sama spočítá jaké podbarvení má mít řádek, kolikátý je v pořadí, jestli lichý nebo sudý a snadno je můžu prohodit mezi sebou aniž bych musel manuálně měnit class, pořadí řádku atd. atd. takže otázka zní, klasicky dosud jsem rozšířoval objekt Template, ať se jednalo o jakýkoli šablonovací systém, jak se na to dívá nette?
- jasir
- Člen | 746
mcmatak napsal(a):
to ani snad ne, myslel jsem to obecně, podobně jako rozšíření šablon o funkci co mi vrací už konkrétně vytvořený select se všemi parametry co potřebuji, nebo proste funkce co vytvoří opakovaně se zobrazující blok, nechci přece každý select includovat,
prostě předtavte si funkci která tvoří hlavičku nějakého html bloku, ta funkce počítá jestli je to sudý nebo lichý blok, pamatuje si a zjišťuje jestli naposledy byl otevřený (display:block, display:none) atd. atd.
není ani tak podstatné co dělá, ale chci aby to fungovalo nějak ->displayFiltrRow(„id“); další řádek dám displayFiltrRow(„nazev“) atd. a nechci se starat o to co se děje uvnitř, prostě ta funkce si sama spočítá jaké podbarvení má mít řádek, kolikátý je v pořadí, jestli lichý nebo sudý a snadno je můžu prohodit mezi sebou aniž bych musel manuálně měnit class, pořadí řádku atd. atd. takže otázka zní, klasicky dosud jsem rozšířoval objekt Template, ať se jednalo o jakýkoli šablonovací systém, jak se na to dívá nette?
Pro to, co jsi zmiňoval v 1. příspěvku je asi opravdu nejlepší to co navrhuje Honza.
Jinak – každá template si může registrovat filtry a helpery. Jedním z filtrů (a defaultně registrovaným v nejnovější revizi Nette) je CurlyBracketsFilter. V něm si zase můžeš registrovat vlastní makra.
Můžeš tedy například registrovat helper ‚displayFiltrRow()‘ a ten
pak v šabloně volat – buď pomocí
$template->displayFiltrRow($id)
nebo alternativně pomocí
CurlyBracketsFilter {$id |displayFiltrRow}
. Ale určitě si
přečti dokumentaci. Zde k CurlyBracketsFilter, třeba
foreach
a ifCurrent
tě asi budou zajímat. Ostatní
si dohledej sám.
- mcmatak
- Člen | 504
ok díky, filtry jsou mi jasné, ifCurrent je určené snad jen pro zjišťování odkazu jeslti se nemýlím
každopádně asi ty helpery je to co hledám, i když nevím jestli si přesně rozumíme, výhodou extendování Template jsem měl právě k dispozici všechny vlastnosti šablon a parametry, což helper nemá ne?
chci říct dejme tomu je 10webů a v administraci chci použít toho co popisuji, zobrazení html nějakého řádku filtru, a teď dojde k tomu, že chci filtry pojmout jinak a změnit funkčnost toho řádku, tím že mu třeba jinak pojmenuji „id“ javascript se začne chovat jinak, nebo chci nějakému bloku uvnitř toho html přidat právě nějaké „id“, tohle samozřejmě nechci dělat v XXX šablonách na XXX webech, protože všechny weby si načítají stejné knihovny, tak je mi pohodlné změnit jen funkci v třídě Template, dejme tomu , že helper by tohle dokázal řešit, jen prostě změním knihovnu na kterou helper odkazuje, jenomže uvnitř helperu asi nemám přístup k objektům se kterými pracuje šablona že?
- jasir
- Člen | 746
mcmatak napsal(a):
ok díky, filtry jsou mi jasné, ifCurrent je určené snad jen pro zjišťování odkazu jeslti se nemýlím
Nemýlíš, spletl jsem se. Myslel jsem isOdd
,
isEven
každopádně asi ty helpery je to co hledám, i když nevím jestli si přesně rozumíme, výhodou extendování Template jsem měl právě k dispozici všechny vlastnosti šablon a parametry, což helper nemá ne?
chci říct dejme tomu je 10webů a v administraci chci použít toho co popisuji, zobrazení html nějakého řádku filtru, a teď dojde k tomu, že chci filtry pojmout jinak a změnit funkčnost toho řádku, tím že mu třeba jinak pojmenuji „id“ javascript se začne chovat jinak, nebo chci nějakému bloku uvnitř toho html přidat právě nějaké „id“, tohle samozřejmě nechci dělat v XXX šablonách na XXX webech, protože všechny weby si načítají stejné knihovny, tak je mi pohodlné změnit jen funkci v třídě Template, dejme tomu , že helper by tohle dokázal řešit, jen prostě změním knihovnu na kterou helper odkazuje, jenomže uvnitř helperu asi nemám přístup k objektům se kterými pracuje šablona že?
Takhle – tak úplně ti nerozumím, ale – extendovat si
Template
na MySuperTemplate
by neměl být žádný
problém. Stačí pak ve svém BaseControl/BasePresenter přepsat metodu
createTemplate(), která vrátí tvou vlastní instanci
MySuperTemplate
. Helper metody pak mohou být v této
MySuperTemplate
a budou mít přístup ke všemu, co je
v originální Template
.
Editoval jasir (17. 7. 2009 14:16)
- mcmatak
- Člen | 504
jasně extendovad, to je jak to řeším teď, abych to úplně zjednodušil a uzavřeli jsme téma, tak uvedu příklad:
neřeš prosím jak je to triviální nebo, že zrovna tohle není nutné řešit kladivem na komára, ale uvádím to pro jednoduchost, tak např.
Příklad č.1
- existuje redakční systém, existuje cca 50implementací toho systému
- každý ten redakční systém si v detailu článku zobrazuje nějaké ty odkazy jako jagni to, linkuj atd. atd. je jich třeba 10, prostě berme za samozřejmé, že každý web to zobrazovat chce
- a já teď mám úkol: mezi těch 10 chci přidat další odkaz, prostě je
nějaké nové linkuj!
- všechny tyhle odkazy jsou součástí nějakého view nazvaného Article.default.phtml
- tvoje navrhované řešení je udělat si Links.phtml a tu includovat v každém webu do Article.default.phtml
- udělám si helper, který odkazuje na nějakou statickou třídu a metodu, třeba TemplateAdds::displayLinks
- rozšířím si Template na MySuperTemplate a ten bude mít fukci displayLinks
- ja budu teď v jednotlivých přístupech řešit problém?
- budu postupně editovat 50webů a přidávat link = nelíbí se mi to
- upravím jeden Links.phtml což je fajn, ale budu muset ten soubor rozkopírovat do 50webů = nelíbí se mito
- upravím statickou třídu, kterou uložím do společného úložiště pro všechny weby, tedy do adresáře knihoven
- opět tahle knihovna je součástí společného prostoru, jedna úprava jedno kopírování
Pokračujeme v příkladu
Další úkol bude: linků je příliš moc, rozhodl jsem se, že web si
může vybrat jestli linky zobrazovat jako obrázky nebo jestli je zobrazovat
jako SELECT
a) řešení jako před tím = nelíbí se mi
b) zase rozkopírovávám = nelíbí se mi
c) ok, fajn jen tato třída potřebuje získat nějaký parametr z presenteru,
tedy šáhnout si na nějaký parametr šablony např.
$this->template->showLinksAs=„SELECT“
d) mám přístup k $this->template->showLinksAs takže v pohodě
co si o tom myslíte? /myslíš?
díky
→ aha jak se zdá editoval si dříve než sem dopsal tenhle příspěvek
Editoval mcmatak (17. 7. 2009 14:28)
- Ondřej Brejla
- Člen | 746
Nevím jestli je to přesně to, co chceš…ale co si „např. na ty
linky“ udělat Control
?…v šabloně ho budeš jen renderovat,
bude mít svůj model a ten si bude pro linky sahat třeba do databáze…pokud
se rozhodnu, že chci linky získávat jinak, upravím pouze model…
Ale možná máš na mysli něco jiného.
Edit: jasir je rychlý pisálek…než jsem to odelal, tak to napsal ;)
Editoval Warden (17. 7. 2009 14:35)
- mcmatak
- Člen | 504
ok tak já si nejdříve nastuduji komponenty :) řekl sem si že nejlepší způsob jak se naučit s frameworkem a jak zjistit jestli je vhodný tak si v tom vyzkoušet napsat nějaký projekt a řešit v něm ty problémy co se řeší roky neustále dokola, takže teď jdu nastudovat komponenty a pak se k tomu vrátím, zatím díky :)
- jasir
- Člen | 746
mcmatak napsal(a):
ok tak já si nejdříve nastuduji komponenty :) řekl sem si že nejlepší způsob jak se naučit s frameworkem a jak zjistit jestli je vhodný tak si v tom vyzkoušet napsat nějaký projekt a řešit v něm ty problémy co se řeší roky neustále dokola, takže teď jdu nastudovat komponenty a pak se k tomu vrátím, zatím díky :)
Ano, jeden ze základních pilířů Nette je právě strom a systém komponent… Z počátku jsem měl také tendence vymýšlet nová makra apodobně v Template, ale cesta k řešení 90% úkolů vede přes komponenty. Uvidíš, zamiluješ si to. Je to velmi návykové.
Editoval jasir (17. 7. 2009 15:01)