Nette – pohled začátečníka (splní má očekávání?)
- Ondřej Mirtes
- Člen | 1536
Ahoj,
už asi tři roky dělám webové prezentace na zakázku. Nic velkého, obvykle
firemní stránky s ne moc vysokou návštěvností. Mám i svůj vlastní RS
s dost základní funkčností, ale pro ty potřeby to stačí. Doslechl jsem
se o Nette a zvažuji přechod na něj. Potřeboval bych se ale zeptat lidí,
co s ním dělají, jestli splní má očekávání. Tak kdyžtak díky za
reakce :)
Důvody, proč chci přejít:
Reprezentativnější kód
Moje prezentace fungují, ale jejich zdroják se stydím někomu ukázat a něco v něm upravovat (po delší době, když si přesně nepamatuju, jak jsem to psal), je peklo. Objektů se v něm dotýkám jen letmo v pár případech. Od Nette očekávám praktické oddělení PHP a HTML (do Presenterů a HTML šablony, která bude mít jen nejzákladnější PHP syntaxi – data pro ni budou připravena už z Presenteru) a lepší přehlednost fungování díky objektům.
Znovupoužitelnost kódu
To je to hlavní. Weby, jak dělám teď, mě už nebaví. Prakticky
jakýkoli klientův požadavek umím vyřešit, ale když za mnou přijde
další klient, že ho chce taky, můžu sice původní kód znovupoužít, ale
za cenu toho, že v něm půlku názvů přepíšu (sloupce v tabulkách se
jmenují jinak, názvy proměnných jsou vázány na první prezentaci, takže
pro lepší „přehlednost“ jsem je jeden čas přepisoval také atd.),
takže nejde už o programování, ale docela věrnou simulaci cvičené opice.
A ještě se musím modlit, abych někde na nějakou hodnotu nezapomněl a ve
specifických případech to přestalo fungovat.
Od Nette očekávám, že nademnou bude „bdít“ (jinak řečeno, bude pro
mě motivace), abych psal určité úseky kódu (možná 100%) jako komponenty
s výhledem na budoucnost („to se mi bude třeba za rok na nějakým webu
hodit“). A když si pak při tvorbě webu „vzpomenu“ – pro tenhle
případ můžu použít komponentu, kterou jsem v předminulé zakázce
dělal, tak jen zkopíruju její zdroják a upravím s ní související HTML
šablonu. A když požadavky budou takové, že budu muset zasáhnout do kódu
komponenty, tak tak, abych ji v dalším aplikování mohl použít jak
s původní funkčností, tak tou rozšířenou.
Absolutní kontrola nad tvarem adres
Ať už jsou moje dosavadní zdrojáky jakékoli, tak kontrolu nad tvarem URL jednotlivých částí webu mám stoprocentní. Interně to funguje tak, že se skripty volají ve tvaru index.php/parametr/parametr, např. index.php/blog/nazev-rubriky/nazev-clanku a pokud o webhostingu vím, že umožňuje mod_rewrite, vytvořím .htaccess a uživatel nevidí tu „index.php/“ část. Funguje mi všude „složková struktura“, tzn. pokud uživatel odebere jednu část cesty, nezavede ho to na 404ku, ale na nějakou logickou část – v tomhle případě výpis rubriky, titulní stránka blogu, titulní stránka webu. Bojím se, že jak je v Nette to routování, že se bude snažit být chytřejší než já a neumožní mi takový rozsah hraní si s adresami jako doposud. Např. mi funguje, že /blog/rubrika/2 mě zavede na druhou stránku výpisu článků rubriky, pokud druhá stránka neexistuje, hodí mě to na /blog/rubrika (ne /1). Pokud jako poslední parametr není integer, ale string, snaží se to v databázi najít článek. Pokud existuje, zobrazí ho to, pokud ne, mohu se rozhodnout zda zobrazit 404ku nebo přesměrovat čtenáře na adresu /blog/rubrika a vypsat její obsah. A miliony dalších vylomenin, které zde nebudu vypisovat :) Umožní mi to routing? Neomezí mě nějak? (Omlouvám se, zatím jsem nezkoumal příslušnou dokumentaci.)
Zabezpečení
Toto je snad jasné, když aplikaci píšu od zelené louky a nemám to vyřešené na nějaké nejnižší úrovni, nemůžu zajistit stoprocentní zabezpečení, nějaký únik nechtěných znaků do MySQL dotazů atd. Těšim se, že mi Nette a případně dibi tyto věci vyřeší a já už nebudu muset myslet na to, že mi uživatel upraví/smaže články z DB či se mi do komentářů dostanou nechtěné znaky.
Neřešení 1000× řešeného
Těším se na používání věcí, které Nette samo implementuje – práci s obrázky, FTP připojení, autentizaci uživatelů. Věřím totiž, že narozdíl od mou napsaných funkcí to používá ověřené a spolehlivé postupy, které jen čekají na využití mnou :)
Tak, to je snad vše. Jsem zvědavý, jestli jsem svými požadavky vystihl to, jak v praxi probíhá tvorba webových aplikací na profesionální úrovni. Pokud jinak, rád se nechám poučit :)
Jsem zvědavý, jestli mé nároky na framework nejsou příliš velké a jestli mi neřeknete, zda nechci rovnou modré z nebe :o)
Chci jen zvednout úroveň svých prezentací (a ulehčovat si práci) a doufám, že Nette je to, co mi pomůže :) Jak rád říkám, zatím jsem si při tvorbě webů vystačil s if, while a foreach. Bojím se, zda dokážu Nette a jeho schopnosti využít k těm věcem, které jsem popsal výše, zda nebudu dále psát ten špatný kód a jen to budu mít zbytečně obalené mocným frameworkem, který nevyužiji. Dle toho textu to může vypadat, že jsem řádné programátorské prase :) Ano, jsem, ale aplikace fungují, validní striktní XHTML generují a server neshazují, tak jsem se nestaral o to, jak ten kód vypadá uvnitř. A teď jsem začal :)
Poslední otázka na závěr – jak dlouho mi zaučení se s Nette může zabrat ? (je mi jasné, že s tím bude odlišná práce od mých obvyklých návyků)
Doufám, že tohle téma nepřeskočíte kvůli délce jeho úvodního příspěvku a poradíte, zda od Nette správně očekávám to, co jsem popsal :) Díky!
- romansklenar
- Člen | 655
Ou :( měl jsem napsanou odpověď na tvůj příspěvek, ale spadl mi při odesílání prohlížeč :( a nechce se mi to psát celé znovu :( takže jen v rychlosti:
LastHunter napsal(a):
Od Nette očekávám praktické oddělení PHP a HTML (do Presenterů a HTML šablony, která bude mít jen nejzákladnější PHP syntaxi – data pro ni budou připravena už z Presenteru) a lepší přehlednost fungování díky objektům.
Ano toto je základní myšlenkou MVC/MVP frameworků. Nette tě k těmto praktikám více méně navádí.
Znovupoužitelnost kódu
To je to hlavní. Weby, jak dělám teď, mě už nebaví. Prakticky jakýkoli klientův požadavek umím vyřešit, ale když za mnou přijde další klient, že ho chce taky, můžu sice původní kód znovupoužít, ale za cenu toho, že v něm půlku názvů přepíšu (sloupce v tabulkách se jmenují jinak, názvy proměnných jsou vázány na první prezentaci, takže pro lepší „přehlednost“ jsem je jeden čas přepisoval také atd.), takže nejde už o programování, ale docela věrnou simulaci cvičené opice. A ještě se musím modlit, abych někde na nějakou hodnotu nezapomněl a ve specifických případech to přestalo fungovat.
Mluvíš mi z duše :-) někdy bych si raději prosřelil koleno, než dělal tyhle nudné věci, když musím nedělat v Nette. To je taky důvod proč se mi nechce zpět „do dob opičích“.
Od Nette očekávám, že nademnou bude „bdít“ (jinak řečeno, bude pro mě motivace), abych psal určité úseky kódu (možná 100%) jako komponenty s výhledem na budoucnost („to se mi bude třeba za rok na nějakým webu hodit“). A když si pak při tvorbě webu „vzpomenu“ – pro tenhle případ můžu použít komponentu, kterou jsem v předminulé zakázce dělal, tak jen zkopíruju její zdroják a upravím s ní související HTML šablonu. A když požadavky budou takové, že budu muset zasáhnout do kódu komponenty, tak tak, abych ji v dalším aplikování mohl použít jak s původní funkčností, tak tou rozšířenou.
Viz komponenta DataGrid z Quick Startu – jednoduchým selectem jí předáš v parametru data z tabulky, nad kterýma má operovat a máš znovu-použitelný výpis tabulky se stránkování a řazením, modifikáci pár řádků i ajaxovou.
Absolutní kontrola nad tvarem adres
Ať už jsou moje dosavadní zdrojáky jakékoli, tak kontrolu nad tvarem URL jednotlivých částí webu mám stoprocentní.
…
Umožní mi to routing? Neomezí mě nějak? (Omlouvám se, zatím jsem nezkoumal příslušnou dokumentaci.)
Je třeba pochopit jeho myšlenku, když ho umíš ovládat (nebo si napsat svůj) meze se nekladou.
Zabezpečení
Toto je snad jasné, když aplikaci píšu od zelené louky a nemám to vyřešené na nějaké nejnižší úrovni, nemůžu zajistit stoprocentní zabezpečení, nějaký únik nechtěných znaků do MySQL dotazů atd. Těšim se, že mi Nette a případně dibi tyto věci vyřeší a já už nebudu muset myslet na to, že mi uživatel upraví/smaže články z DB či se mi do komentářů dostanou nechtěné znaky.
Dá se říct že samozřejmost.
Neřešení 1000× řešeného
Těším se na používání věcí, které Nette samo implementuje – práci s obrázky, FTP připojení, autentizaci uživatelů. Věřím totiž, že narozdíl od mou napsaných funkcí to používá ověřené a spolehlivé postupy, které jen čekají na využití mnou :)
Není nic lehčího než zkusit, za 15min hraní si s třídou víš na čem
jsi ;-)
ale pozor: je to návykové, fakt se ti nebude zpět do tvého RS který
popisuješ ;-)
Jsem zvědavý, jestli mé nároky na framework nejsou příliš velké a jestli mi neřeknete, zda nechci rovnou modré z nebe :o)
Nároky jsou vysoké, ale Nette je spňuje a David Grudl nám to modré z nebe snesl ;-)
jak dlouho mi zaučení se s Nette může zabrat ? (je mi jasné, že s tím bude odlišná práce od mých obvyklých návyků)
Podle návyků a znalostí – základem je OOP, pokud již člověk pracoval s jiným MVC frameworkem dostane se do toho rychle.
Editoval romansklenar (8. 1. 2009 2:57)
- kravčo
- Člen | 721
LastHunter napsal(a):
Absolutní kontrola nad tvarem adres
Ať už jsou moje dosavadní zdrojáky jakékoli, tak kontrolu nad tvarem URL jednotlivých částí webu mám stoprocentní. Interně to funguje tak, že se skripty volají ve tvaru index.php/parametr/parametr, např. index.php/blog/nazev-rubriky/nazev-clanku a pokud o webhostingu vím, že umožňuje mod_rewrite, vytvořím .htaccess a uživatel nevidí tu „index.php/“ část. Funguje mi všude „složková struktura“, tzn. pokud uživatel odebere jednu část cesty, nezavede ho to na 404ku, ale na nějakou logickou část – v tomhle případě výpis rubriky, titulní stránka blogu, titulní stránka webu. Bojím se, že jak je v Nette to routování, že se bude snažit být chytřejší než já a neumožní mi takový rozsah hraní si s adresami jako doposud. Např. mi funguje, že /blog/rubrika/2 mě zavede na druhou stránku výpisu článků rubriky, pokud druhá stránka neexistuje, hodí mě to na /blog/rubrika (ne /1). Pokud jako poslední parametr není integer, ale string, snaží se to v databázi najít článek. Pokud existuje, zobrazí ho to, pokud ne, mohu se rozhodnout zda zobrazit 404ku nebo přesměrovat čtenáře na adresu /blog/rubrika a vypsat její obsah. A miliony dalších vylomenin, které zde nebudu vypisovat :) Umožní mi to routing? Neomezí mě nějak? (Omlouvám se, zatím jsem nezkoumal příslušnou dokumentaci.)
Nette je otvorený framework. Nie podľa licencie, či zverejnenia zdrojových kódov. Väčšinu riešení, ktoré ponúka nemá natvrdo zadrôtované do svojho jadra, ale ponúka k nim jednoduchý a jasný interface. To znamená, že štandardné a vo väčsine prípadov použiteľné riešenie frameworku nie je problém rozšíriť, prípadne úplne nahradiť implementovaním príslušného interfacu.
Tak je tomu i pri (dvojsmernom) routovaní, interface IRouter (ktorý je v Nette implementovaný hneď trikrát) požaduje dve metódy: match() a constructUrl(). Predpokladám, že štandardné riešenie je dostatočne silné a bude stačiť tvojim potrebám, no v prípade, že nie, nič ti nebráni napísať si vlastný router, ktorý zvládne všetko to, čo potrebuješ.
- Jod
- Člen | 701
Reprezentativnější kód
Aj keď ťa framework tak trochu núti kódiť podľa nejakých pravidiel, stále je to na programátorovi, aby dva krát myslel a raz písal a nesprasil kód =)
Znovupoužitelnost kódu
V nette jednoznačne ano :) Ale zase je to na programátorovi ako to spraví.
Absolutní kontrola nad tvarem adres
V nette znamená absolutná, naozaj absolutná :) Výhoda je, že linky sa môžu riešiť až pri dokončovaní aplikácie.
Zabezpečení
Dibi s Nette je super kombinácia. Dibi je chránená proti útokom, formuláre sú tiež zabezpečené, plus dobrá autentifikácia a pod.
Neřešení 1000× řešeného
Nette dobre spolupracuje so Zendom, takže ak chýba nejaká funkcionalita (Mail,PDF a pod) dá sa doplniť zo ZF (Zend_Mail, Zend_Pdf). Vela ľudí to tu tak používa, vrátane mňa.
Ako dlho trvá naštudovanie nette? Ja som po týždni občasného čítania dokumentácie začal robiť prvú aplikáciu v nette.
Aké sú ďalšie výhody? Česká dokumentácia a super CZ/SR komunita :). Určite ti každý ochotne poradí a ak nie každý ja určite ;)
Editoval Jod (8. 1. 2009 9:31)
- LuKo
- Člen | 116
Pokud je programátor vepřík, obávám se, že zůstane vepříkem i v Nette. Kdysi jsem musel z funkcionálního programování skočit bez přípravy do vod Symfony a objektů. Nedopadlo to dobře, ani tak mocný FW mě nezachránil od prasečin. Nette je ještě volnější. Spíš to chce pochopit podstatu fungování takového FW. Možná to byl právě David, kdo pronesl, že správný programátor si již zkusil napsat svůj vlastní FW. Pak se člověk mnohem lépe vžívá do myšlenek tvůrce FW a tak snadno nepodlehne vepříkování. Myslím si, že v tomto případě nestačí se jen naučit syntax a jména metod a spoléhat se, že vše ostatní udělá Nette. Géniové (kterým bez předchozí zkušenosti s jiným FW stačí pár dní k profi ovládnutí Nette) však možná budou mít jiný názor ;-)
- romansklenar
- Člen | 655
LuKo napsal(a):
Možná to byl právě David, kdo pronesl, že správný programátor si již zkusil napsat svůj vlastní FW.
Znělo to nějak takhle: „Každý, kdo se tvorbou webů v PHP žíví si zkoušel napsat nějaké knihovny nebo framework, které by mu práci částečně automatizovali, a kdo říká že ne, ten ho píše ještě teď“ a myslím že to prones Jiří Knesl na webexpu :)
- David Grudl
- Nette Core | 8229
romansklenar napsal(a):
LuKo napsal(a):
Možná to byl právě David, kdo pronesl, že správný programátor si již zkusil napsat svůj vlastní FW.
Znělo to nějak takhle: „Každý, kdo se tvorbou webů v PHP žíví si zkoušel napsat nějaké knihovny nebo framework, které by mu práci částečně automatizovali, a kdo říká že ne, ten ho píše ještě teď“ a myslím že to prones Jiří Knesl na webexpu :)
Byl to Freud a řekl to přesně takto: „Dámy a pánové, každý z nás někdy onanoval a kdo tvrdí, že ne, ten to dělá dosud.“
Mimochodem je to pěkná blbost.
- Ondřej Mirtes
- Člen | 1536
Díky všem za odpovědi a rady. Začíná se mi Nette opravdu líbit :)
Včera jsem si prošel Quickstart a sám jsem si to samozřejmě zkoušel
všelijak upravovat. Ale bojím se, abych do toho zasahoval podle filozofie
Nette. Kam bych měl psát třeba vlastní metody, které využiji v každé
prezentaci? Napadlo mě do BasePresenteru, ale možná to bude lepší jako
komponenta.
Nette přichází se spoustou funkcí na řešení spousty věcí, ale chtěl
bych třeba funkce setTitle, addTitle a resetTitle na práci s <title>
tagem. Nebo cokoli jiného. Psát to do BasePresenteru nebo do vlastní
komponenty?
Také mám rád centralizaci nastavení chování aplikace. Ale to koukám
řeší Nette\Config. Geniální :)
Poslední otázka: Jelikož Nette přichází se spoustou vlastních metod,
tříd a proměnných, musel bych si je všechny pamatovat, abych je mohl při
psaní aplikovat. Lze nějakým způsobem donutit některé IDE, aby mi po
napsání názvu třídy nabízelo všechny metody a proměnné, ke kterým mohu
v dané třídě přistupovat (jak to umí třeba NetBeans s Javadocem) ? Nebo
se musím proklikávat API dokumentací na webu?
- romansklenar
- Člen | 655
LastHunter napsal(a):
Díky všem za odpovědi a rady. Začíná se mi Nette opravdu líbit :)
Poslední otázka: Jelikož Nette přichází se spoustou vlastních metod, tříd a proměnných, musel bych si je všechny pamatovat, abych je mohl při psaní aplikovat. Lze nějakým způsobem donutit některé IDE, aby mi po napsání názvu třídy nabízelo všechny metody a proměnné, ke kterým mohu v dané třídě přistupovat (jak to umí třeba NetBeans s Javadocem) ? Nebo se musím proklikávat API dokumentací na webu?
Samozřejmě dneštní IDEčka pro php podporují doplňování kódu, stačí si jen vybrat.
- Mas3r
- Člen | 116
LastHunter napsal(a):
Lze nějakým způsobem donutit některé IDE, aby mi po napsání názvu třídy nabízelo všechny metody a proměnné, ke kterým mohu v dané třídě přistupovat (jak to umí třeba NetBeans s Javadocem) ? Nebo se musím proklikávat API dokumentací na webu?
Netbeansy fungují parádně. Sám používám.
- gawan
- Člen | 110
Netbeans je úplne super. Používam development verziu v podstate bez problémov. Tá ponúka navyše voči 6.5 niektoré super vlastnosti. Odporúčam si pozrieť blog vývojárov netbeans for php. Skoro každý deň pridávajú nejakú killer feature, kam sa hrabe zend studio, pdt, … ;) S lepším editorom som zatiaľ nerobil.
- Ondřej Mirtes
- Člen | 1536
Tak jsem to v NetBeansech zprovoznil, doplňování sice celkem funguje (což se mi hodí třeba u dibi, se kterým chci také začít), ale není to dokonalé. Dalo mi to do nápovědy i všelijaké definice z examples složek, které jsem nepotřeboval. Ty jsem vymazal, takže už je nápověda příkazů čistší :) A jak jsem očekával, tak mi to nenabízí možné proměnné v .phtml šablonách. Nějaký tip jak ho donutit?
Na nějaký placený editor se zatím necítím, nevím, co by mi přinesl nového :)
Co ty moje funkce, které využiji všude? Do BasePresenteru nebo jako komponentu?
- sairon
- Člen | 32
Kontextovou nápovědu v šablonách nenabízí ani PhpEd. A pochybuji, že to bude třeba u Zend Studia jiné. A ty funkce, udělal bych to podle citu – pokud upravují nějakou věc v presenteru, například nastavují titulek, dal bych je do předka presenterů. Pokud to je nějaký komplexnější logický celek, pak udělat samostatnou komponentu/control. Nebo pokud se jedná o sadu funkcí např. na úpravu dat, zpracovat to jako samostatnou třídu.
- Wosonj
- Člen | 36
Vlastní metody setTitle() apod. používám teď taky a mám je v BasePresenter. Ovšem je to v TODO na hození někam jinam. Potíž je hlavně v situaci, kdy se stejné metody dostanou do vlastní třídy Presenter, což by si člověk řekl, že se asi nikdy nestane, ale třeba u metody flashMessage() se mi to už stalo a musel jsem kvůli tomu vlastní kód předělat.
Netbeans jsem teď vyzkoušel (tu betu) a oproti Eclipse PHP teda nic moc – Eclipse má suggest a navázání na dokumentaci daleko promakanější. Taky podstatně líp pracuje s dokumentačníma komentářema, todo listy atp.
- Ondřej Mirtes
- Člen | 1536
Díky za rady. Až na tu podporu šablon mi NetBeans vyhovují (možná proto, že jsem nepoznal zatím nic lepšího) :)
Mám dotaz – hraji si s komponentami a přemýšlím, jaké to bude
nasadit Nette na první webovou prezentaci :) A rád bych si vytvořil
komponentu či sadu metod v Presenteru na vygenerování menu – vstup
(třeba z configu) by byly názvy položek a výsledek vykreslování
<ul> struktura v HTML. Jelikož bych ale nechtěl nějak
„z továrny“ omezovat hloubku toho menu, potřeboval bych tam nějak
nasadit rekurzivní volání (položky by byly uložené jako stringy v poli a
pokud by prvek pole bylo pole, nasadila by se rekurzivně metoda. Jenže kde
tohle volat?
Pokud bych měl jen menu první úrovně, tak je mi to jasné – v Presenteru
naplním $this->template->pole a v šabloně zavolám:
<ul>
{foreach $pole as $item}
<li>{$item}</li>
{/foreach}
</ul>
Jenže pokud to chci udělat univerzálně pro libovolný počet úrovní, tak nevím, abych hned ze začátku něco „nevepříkoval“. Jako jedno řešení mě napadlo, že by v šabloně byla v tom základním foreachi v případě že is_array($item) rekurzivně volaná funkce z Presenteru. Jenže to bych naboural oboustranně MVP návrh – v Presenteru bych musel mít HTML kód a v šabloně volání PHP funkce :)
Nebo se to dělá úúplně jinak? :o)
- David Grudl
- Nette Core | 8229
Ten úvodní LastHunterův příspěvek, jako bych slyšel sebe před pár lety :-)
- David Grudl
- Nette Core | 8229
LastHunter napsal(a):
Kam bych měl psát třeba vlastní metody, které využiji v každé prezentaci?
Začni tím, že tam nedávej nic :-)
Vše, co má nějak ovlivňovat způsob vykreslování, vložím do oddělené třídy např. Helpers (viz třeba tohle) a v presenteru doplním createTemplate() o registraci filtrů. Například tak lze přidat filtr na dělání „title“.
Vše, co manipuluje s databází, se soubory atd, šoupnu do samostatných
tříd v adresáři models
.
Ideální je, aby se
- logika v šablonách omezila na iterace, if, else.
- logika v presenteru omezila na
- plnění šablon a registraci helperů a filtrů
- sestavení stromu komponent
- úkolování tříd z modelu
Poslední otázka: Jelikož Nette přichází se spoustou vlastních metod, tříd a proměnných, musel bych si je všechny pamatovat, abych je mohl při psaní aplikovat. Lze nějakým způsobem donutit některé IDE, aby mi po napsání názvu třídy nabízelo všechny metody a proměnné, ke kterým mohu v dané třídě přistupovat
IDE je nejlepší předhodit verzi Nette, která je v distribuci uložena v adresáři PHP-5.2. Tedy dokud nebudou IDE přepraveny na jmenné prostory.
Pokud bych měl jen menu první úrovně, tak je mi to jasné – v Presenteru naplním $this->template->pole a v šabloně zavolám:
<ul> {foreach $pole as $item} <li>{$item}</li> {/foreach} </ul>
Tohle lze vyřešit i čistě na úrovni šablony a to pomocí
{include '@menu.phtml', 'menu' => $pole}
, kde $pole
bude celý strom. A pak do souboru @menu.phtml
dáš:
<ul>
{foreach $menu as $item}
<li>{if is_array($item)} {include '@menu.phtml', 'menu' => $item} {else}{$item}{/if}</li>
{/foreach}
</ul>
(vyžaduje rev. 186)
- kravčo
- Člen | 721
Keď má mať menu neobmedzenú hĺbku, jedno z možných riešení je spraviť si komponent Menu, ktorý bude mať rekurzívnu štruktúru v sebe a bude sa vedieť rekurzívne vykresliť:
class Menu extends Control
{
protected $items;
function loadItems()
{
$this->items = array(
(object) array(
'text' => 'Novinky',
'dest' => 'News:',
'sub' => new Menu(...),
),
(object) array(
'text' => 'Kontakt',
'dest' => 'Contact:',
'sub' => new Menu(...),
),
);
}
function render()
{
$file = Environment::expand('%templatesDir%/components/Menu.phtml');
$this->template->setFile($file);
$this->template->items = $items;
$this->template->render();
}
}
A šablóna Menu.phtml
napríklad takto:
<ul>
{foreach $items as $item}
<li><a href="{link $item->dest}">{$item->text}</a>
{if isset($item->sub)}{!$item->sub->render()}{/if}
</li>
{/foreach}
</ul>
Samozrejme, to generovanie štruktúry sa očakáva z konfiguráku či odinakiaľ…
- PetrP
- Člen | 587
LastHunter napsal(a):
… Bojím se, zda dokážu Nette a jeho schopnosti využít k těm věcem, které jsem popsal výše, zda nebudu dále psát ten špatný kód a jen to budu mít zbytečně obalené mocným frameworkem, který nevyužiji. Dle toho textu to může vypadat, že jsem řádné programátorské prase :) Ano, jsem…
Dobrý framework s tebe neudělá dobrého programátora, myslím že dokonce může být i na škodu. Lepší je si na všechno pomalu přijít sám a až pak začít používat „pomůcky“.
David Grudl napsal(a):
IDE je nejlepší předhodit verzi Nette, která je v distribuci uložena v adresáři PHP-5.2. Tedy dokud nebudou IDE přepraveny na jmenné prostory.
Jaký nástroj používáš ty Davide? Myslím, že si se o tom někde už zmiňoval, ale nemůžu si vzpomenout.
- romansklenar
- Člen | 655
Jo PhpEd je hodně dobrý, ale kde válcuje konkurenci je napovídání kódu :) tam nemá konkurenci a celkem to i nechápu, většina IDEček se totiž omezuje jen na napovídání podle type hintingu při definici metod.
- David Grudl
- Nette Core | 8229
David Grudl napsal(a):
Tohle lze vyřešit i čistě na úrovni šablony a to pomocí
{include '@menu.phtml', 'menu' => $pole}
, kde$pole
bude celý strom. A pak do souboru@menu.phtml
dáš:<ul> {foreach $menu as $item} <li>{if is_array($item)} {include '@menu.phtml', 'menu' => $item} {else}{$item}{/if}</li> {/foreach} </ul>
Sám se doplním ;) Od rev. 189 se lze obejít i bez pomocného souboru: (ale jde o experimentální vlastnost)
{block #menu}
<ul>
{foreach $menu as $item}
<li>{if is_array($item)} {include #menu, 'menu' => $item} {else}{$item}{/if}</li>
{/foreach}
</ul>
{/block}
- Ondřej Mirtes
- Člen | 1536
David: Díky za rady co kam mám „strkat“ i dodělání elegantní rekurze :)
Na přechod na nějaký placený editor se fakt necítím, nemyslím si, že bych využil jeho featury, stačí mi jen obarvování a napovídání při psaní kódu :)
Musím si ještě pořádně nastudovat jednotlivé metody z životního cyklu presenteru a během zkouškového se vrhnu na jeden větší projekt, který tu mám připravený. Takže pak budou určitě následovat další otázky :)
Zatím dík!
- Ondřej Mirtes
- Člen | 1536
Ahoj,
začínám vývoj prvního mého webu postaveného na Nette pomalu rozjíždět
a řekl jsem si, když už to budu dělat „ponovu“, tak se vším všudy :)
(nette/dibi/texy).
Chci se zeptat – je stále aktuální ta syntaxe z článku http://latrine.dgx.cz/…nette-s-texy ? Kam mám texy.php
includovat?
Díky.
- _Martin_
- Generous Backer | 679
Ahoj, s použitím <texy>
zkušenosti nemám, sám
používám Texy jako helper:
- v presenteru:
protected function beforeRender()
{
// Texy...
$this->texy = new Texy();
// ...a jeho konfigurace
$this->texy->allowedTags = Texy::NONE;
$this->texy->allowedStyles = Texy::NONE;
$this->texy->setOutputMode(Texy::XHTML1_STRICT);
// atd...
// registrace helperu
$this->template->registerHelper('texy', array($this->texy, 'process'));
}
- v šabloně:
{block|texy}
**tučné**, *kurziva*
{/block}
nebo
{!$promenna|texy}
- Ondřej Mirtes
- Člen | 1536
Díky, využiju! :)
Teď mám ale problém. Mám odkazy normálně ve tvaru
<li><a href="{plink Default:}">Aktuality</a></li>
Ale výsledek je takovýto:
<li><a href=""\/"">Aktuality</a></li>
Pokud presenter neexistuje, tak to error hází až za ty uvozovky
<li id="galerie"><a href=""error: Cannot load presenter 'Gallery', class 'GalleryPresenter' was not found in 'D:\\Weby\\html\\AlanWake\\html\/..\/app\/presenters\/GalleryPresenter.php'."">Galerie</a></li>
Ovlivnilo mi to takto odkazy v celém @layout.phtml (jsem teprv ve fázi řezání). Nikde jsem nic neměnil, čím by to mohlo být?
Díky.
- Ondřej Mirtes
- Člen | 1536
Tak v routách to není :( Měl jsem v bootstrap.php omylem nějaké ty defaultní, ale zakomentoval jsem a problém trvá stále :(
Edit: Do uvozovek to háže i link na existující presenter…:
""\/""
Edit2: Je veřejně uvolněný ten polo-wysiwyg editor pro Texy, co je zde na fóru?
Editoval LastHunter (21. 1. 2009 11:50)
- Mas3r
- Člen | 116
Ten editor se jmenuje Texyla. Najdeš na texyla.jaknato.com
Editoval Mas3r (21. 1. 2009 12:23)
- sairon
- Člen | 32
Novější verze Texyly (stejná jako na SVN?) je dostupná tady: http://texyla.janmarek.net/
- tark
- Člen | 22
abstract class BasePresenter extends Presenter
{
public function beforeRender()
{
// texyElements filter
TemplateFilters::$texy = new Texy;
TemplateFilters::$texy->encoding = 'utf-8';
$this->template->registerFilter('TemplateFilters::texyElements');
// další filtr, třeba netteLinks...
$this->template->registerFilter('TemplateFilters::netteLinks');
}
A <texy> funguje. Dodám, že všechny presentery musí dědit buď BasePresenter, nebo nějaké jeho potomky…
Editoval tark (21. 1. 2009 19:56)
- David Grudl
- Nette Core | 8229
LastHunter napsal(a):
Teď mám ale problém. Mám odkazy normálně ve tvaru
<li><a href="{plink Default:}">Aktuality</a></li>
To je zvláštní… Jaké všechny filtry máš zaregistrované a v jakém pořadí?
- Ondřej Mirtes
- Člen | 1536
Jen CurlyBracketsFilter. Ještě včera bylo vše OK, určitě to bude o nějakém jednom zašitém řádku bůhví kde.
Kdyby se vám chtělo zkoumat zdroják, tak tady je: link (bez složky libs, kde je aktuální Nette a Dibi)
Říkám, zatím jsem jen ve fázi řezání/psaní HTML, takže všechno HTML je v @layout.phtml a je založený akorát BasePresenter a DefaultPresenter.
Editoval LastHunter (21. 1. 2009 23:04)
- Ondřej Mirtes
- Člen | 1536
Co jsem pokazil? :)
Takovéto podpory přímo od autora si velice vážím. Sám doufám, že se s Nette (a případně i Dibi a Texy) sžiju, moje weby získají konečně nějakou tvář. Je obdivuhodné, jaké zázemí pro webdesign dokázal „one-man team“ vytvořit :)
- Ondřej Mirtes
- Člen | 1536
Super, dík.
Mám otázku ohledně licence/licencí – dejme tomu, že udělám
zákazníkovi web založený na tripletu Nette/Dibi/Texy a dostanu za něj
zaplaceno. Jaké povinnosti mám v tu chvíli vůči tobě? Zaplacení poplatku
či jen uvolnění pod GNU/GPL? (v případě, že chci)
Co obnáší uvolnění kódu pod GNU/GPL v takové situaci? Přibalení textu
licence k projektu a povolení, ať si s tím zákazník dělá naprosto, co
chce? (např. použít můj kód a prodávat můj CMS dál?)
- David Grudl
- Nette Core | 8229
Nette a dibi mají velmi volnou licenci, vyplývající povinnosti jsou z textu srozumitelné. Texy je pod striktnější GPL. Otázkou je, zda-li vůbec lze šířit open source projekt používající Nette/Dibi/Texy (asi ne, nejspíš budu muset Nette & dibi vydat i pod GPL). V případě komerčního prodeje není s Netta & Dibi žádný problém (stačí ponechat copyrighty), u Texy je potřeba pořídit komerční licenci.