Běžné funkce šablon, extends template nebo helpery?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mcmatak
Člen | 504
+
0
-

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

Honza Marek
Člen | 1664
+
0
-

Co třeba {include inc/analytics.phtml}?

mcmatak
Člen | 504
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

  1. existuje redakční systém, existuje cca 50implementací toho systému
  2. 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
  3. a já teď mám úkol: mezi těch 10 chci přidat další odkaz, prostě je nějaké nové linkuj!
    1. všechny tyhle odkazy jsou součástí nějakého view nazvaného Article.default.phtml
    2. tvoje navrhované řešení je udělat si Links.phtml a tu includovat v každém webu do Article.default.phtml
    3. udělám si helper, který odkazuje na nějakou statickou třídu a metodu, třeba TemplateAdds::displayLinks
    4. rozšířím si Template na MySuperTemplate a ten bude mít fukci displayLinks
  4. ja budu teď v jednotlivých přístupech řešit problém?
    1. budu postupně editovat 50webů a přidávat link = nelíbí se mi to
    2. upravím jeden Links.phtml což je fajn, ale budu muset ten soubor rozkopírovat do 50webů = nelíbí se mito
    3. upravím statickou třídu, kterou uložím do společného úložiště pro všechny weby, tedy do adresáře knihoven
    4. 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)

jasir
Člen | 746
+
0
-

Pro tento případ je nejpříhodnější napsat si nový Control (komponentu) ArticleLinks. ;-)

Ondřej Brejla
Člen | 746
+
0
-

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
+
0
-

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
+
0
-

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)

mcmatak
Člen | 504
+
0
-

no spíš teď půjdu založit nové téma na routování, abych mohl experimentovat, nějak se mi nedaří naroutovat to co potřebuji