Že by nejrevolučnější část Nette 2.0?
- David Grudl
- Nette Core | 8227
Zatím jen ve stručnosti: příklad dvou aplikací, které nepoužívají
Nette\Application\UI
a jsou doslova „jednosouborové“: Micro-blog a Micro-tweet (viz Github).
Nette tak lze používat jako micro-framework i jako plnohodnotný framework zároveň. Bez nutnosti se učit něco nového. Micro-framework přitom disponuje vším, co dělá Nette nettem, tj. pořádné ladící nástroje, nadupaný šablonovací systém, zabezpečení, silný routovací jazyk, podporu HTML5, SEO. Například i zmíněný Micro-blog udržuje kanonický tvar URL – zkuste si přejít o stránku vpřed a vzad.
Přitom se skládá vlastně jen ze souboru index.php a ze šablon. Ty
obsahují routovací
pravidla v makře {url ...}
vytahují si data z modelu.
V tomto případě je model natolik jednoduchý, že si vystačí
s Nette\Database.
- Lopo
- Člen | 277
mozno by nebolo odveci nalinkovat tie 2 nove example aj priamo na https://examples.nette.org/
- grey
- Člen | 94
Lopo wrote:
mozno by nebolo odveci nalinkovat tie 2 nove example aj priamo na https://examples.nette.org/
A možná by ty současné mohly fungovat ;)
- nanuqcz
- Člen | 822
Po delší době plné pro mě nepodstatných změn zase jedna nová funkce, u které sedím s otevřenou pusou. Super! :-)
Jinak, bude ten TemplateRouter
v rozšířeních , nebo přímo ve
frameworku?
- ViliamKopecky
- Nette hipster | 230
Na páté straně je prázdno. Ale jinak moc pěkná fičůrka.
Editoval enoice (2. 6. 2011 14:31)
- bojovyletoun
- Člen | 667
Jo je to fakt pěkný, takhle jsem si představoval tu úpravu __Micro__
presenteru. Jsou normálně dostupné parametetry, ty co neuvedu mám doostupné
skrz $presenter->request->params (i v šabloně). (Pro úplnou
dokonalost bych si dokázal představit $params a $context jako parametr
šablony i routovacího callbacku (context je v šabloně už teď.,
v presenteru je dostupný skrz use.)
MicroPresenter:
L92: +$template->params= $this->request->getParams();
L58: +$params['params'] = $params;
L59: +$params['context'] = $this->context;
Jo a ohledně templaterouteru(akademická): skvělá věc:, občas ale to má
kolizi s parserem (modifikátory), že např {url x|y}
vtovří
x
. Jelikož jsou modifikátory zakořeněné už v parseru, jde to
nějak ošetřit uzavřením do uvozovek (a následným použitím tokenizéru)
a nebo rovnou psát ˙{url}cokoli{/url}
edit: formátováni
Editoval bojovyletoun (3. 6. 2011 0:38)
- bojovyletoun
- Člen | 667
zejdnodušená metoda createTemplate ..
Ps: Api ukazuje minifik. verzi: https://api.nette.org/…ce-.php.html#539, ale jiné třídy jsou ok
- ptacek.pavel
- Člen | 27
@Felix inspirace žárovkou je více než zjevná, nicméně je víc mikro, než jsme implementovali my :-)
edit: smazáno
Editoval ptacek.pavel (19. 6. 2011 12:56)
- Filip Procházka
- Moderator | 4668
@**ptacek.pavel**: Určitě nejsem sám, kdo by ocenil vlastní vlákno na takovou věc. Měl jsem pár připomínek, ale na mail ti je psát nebudu a sem se to nehodí :) Příště zakládej vlákna ;)
- nanuqcz
- Člen | 822
Je nějaká možnost používat v micro-frameworku vykreslitelné komponenty?
Např:
$container->router[] = new Route('clanky/', function($presenter){
$template = $presenter->createTemplate();
... //nastavení cesty k šabloně, naplnění dat šablony
$presenter['visualPaginator'] = new VisualPaginator(); //toto předpokládám nepůjde
$template->render();
});
Díky
Editoval xxxObiWan (14. 8. 2011 23:04)
- nanuqcz
- Člen | 822
Na API jsem se právě díval a připadalo mi, že to moc věcí asi umět nebude :-)
Je nějaká možnost, jak Nette přimět, aby místo MicroPresenteru
předával mojí funkci instanci mé třídy
MyMicroPresenter
?
Protože tady ani nebude možnost využívat snippety a
invalidateControl
atd. :-( Je to škoda, že tak skvěle
vypadající věc, jako Nette micro-framework, není dotažená do konce (rád
pošlu pull-request až něco dopíšu :-))
- Filip Procházka
- Moderator | 4668
Něco mi říká, že jsi nepochopil jeho účel. Má být jednoduchý. Kam do věty „Má být jednoduchý.“ chceš prosimtě nacpat slovo „snippet“?
MicroPresenter
je v NetteModule
, takže když si ho
zkopíruješ a upravíš jak potřebuješ, stačí si ho nastavit do routeru.
Funguje to úplně stejně jako s normálním presenterem.
- Tharos
- Člen | 1030
Projdi si ty ukázky v examples, řídí
to standardně třída Route
. Není problém jí klasickým
způsobem přimět, aby routovala na Tvůj vlastní
MyMicroPresenter
. Nicméně trochu se tím zastírá to „mikro“
:), protože pak to bude spíš už klasické, sic minimalistické,
použití Nette.
Edit: Tak mě HosipLan předběhl :), ale tak alespoň pro potvrzení tu ponechávám i svůj post.
Editoval Tharos (15. 8. 2011 10:04)
- nanuqcz
- Člen | 822
Není problém jí klasickým způsobem přimět, aby routovala na Tvůj vlastní
MyMicroPresenter
.
Jak, když string ‚Nette:Micro‘ je tam natvrdo? :-)
127: self::PRESENTER_KEY => 'Nette:Micro',
Pomůže asi to, co říká HosipLan, do složky
presenters/NetteModule
nahrát MicroPresenter.php
a
Nette by ho mělo načíst přednostně.
Něco mi říká, že jsi nepochopil jeho účel. Má být jednoduchý. Kam do věty „Má být jednoduchý.“ chceš prosimtě nacpat slovo „snippet“?
Zdá se mi, že teď přede mnou obhajuješ Nette. V žádném případě jsem to nemyslel tak, že je Nette nedodělané, ani nijak jinak špatně ;-) Ale možnost používání snippetů a controlů přece používání micro-frameworku nijak nezesložití. Bude se používat pořád stejně jednoduše, jen s ním půjde udělat více věcí :-)
- Tharos
- Člen | 1030
xxxObiWan napsal(a):
Jak, když string ‚Nette:Micro‘ je tam natvrdo? :-)
No třeba tak, že při vytváření instance Route
nebudeš
předávat metadata jako closure či callback, ale jako pole. :) Pak si můžeš
namapovat jakýkoliv presenter (a ten nemusí vůbec být potomkem třídy
Presenter
, stačí, aby implementoval rozhraní
IPresenter
).
- Filip Procházka
- Moderator | 4668
Pak ale ztrácí význam MicroPresenter
.
Neobhajuji Nette (teda vlastně jo), ale zkus se nad tím zamyslet. Ta třída má ve jméně „Micro“.
Můžeš si udělat vlastní MicroRouter
, který bude umět
žrát closury a bude používat výchozí presenter (snippety,
komponenty, …)
- Patrik Votoček
- Člen | 2221
MicroPresenter slouží v Nette jenom a pouze ke spouštění callbacků. Pokud s ním potřebuješ pracovat jakkoli jinak používej ho jako klasický presenter tj. používej klasická metadata u routy (string / pole) a né callback).
Btw kolem snippetů a komponent je poměrně hodně režie a to se slovem Micro už moc společného nemá.
- Tharos
- Člen | 1030
Jinak dodám, že celé Nette vůbec není problém použít tak, abys měl namísto obsáhlého bootstrapu jen pár řádků v index.php a na serveru jenom nette.min.php, index.php, jeden presenter.php, temp a třeba tři šablony někde v templates. Pak se to bude na pohled velmi podobat těm micro-ukázkám a budeš moci využít plné síly Nette.
Teď už je ale jen otázka, jaký to má smysl. :) A proč nepoužít Nette „klasickým“ způsobem.
Editoval Tharos (15. 8. 2011 10:54)
- nanuqcz
- Člen | 822
Smysl je u tohohle čistě subjektivní ;-) U malých webů ve stylu ‚5 článků/kontaktní formulář/možná jedna fotogalerie‘ se mi nechce vytvářet presenter(y) a při psaní kódu se přepínat mezi soubory v editoru atd. Kódu je v takové „aplikaci“ tak málo, že je přehledný i pokud je jen v jednom souboru.
U microsites se mi prostě líbí minimalističnost ve stylu Limonade, ale přitom nechci přijít o sílu Nette, na kterou jsem si tak zvykl :-)
HosipLanovi a Tharosovi děkuji za pomoc tady i na jabberu, konečné řešení nakonec vypadá takto:
$container->router[] = new Route('clanky/', array(
'presenter' => 'MyMicro',
'callback' => function($presenter){
...
},
));
Editoval xxxObiWan (15. 8. 2011 11:16)
- nanuqcz
- Člen | 822
Tharos napsal(a):
Jinak dodám, že celé Nette vůbec není problém použít tak, abys měl namísto obsáhlého bootstrapu jen pár řádků v index.php a na serveru jenom nette.min.php, index.php, jeden presenter.php, temp a třeba tři šablony někde v templates. Pak se to bude na pohled velmi podobat těm micro-ukázkám a budeš moci využít plné síly Nette.
Tak bohužel to není vůbec tak jednoduché, jak říkáš. Chtěl jsem, aby
mi v „jednosouborové verzi“ fungovaly snippety a vykreslitelné
komponenty. Řekl jsem si, že využiju třídy
Nette\Application\UI\Presenter
, kde už všechno tohle funguje.
Myslel jsem si „To bude jednoduché, podědím Application\UI\Presenter,
změním pár řádků a bude to“. Jenže:
- Některé metody, které jsem k tomuto účelu potřeboval změnit, jsou private, takže banán – dědit nemůžu
- Řekl jsem si tedy: „Tak ten Nette Presenter zapouzdřím“.
Jenže Nette Presenter je
abstract
, takže ani zapouzdření není možné - Je tedy nějaká jiná cesta, než psát funkčnost pro snippety a vykreslitelné komponenty do MyMicroPresenteru celé odznova, nebo copypastovat stovky řádků z Nette Presenteru?
Díky
- Tharos
- Člen | 1030
Je to skutečně tak jednoduché, jak jsem psal, ale bohužel jsi asi nepochopil, jak jsem to myslel…
Aby znovu nedošlo k nedorozumění, zde máš ukázku. A máš tam i ten AJAX. :)
Šlo by to klidně ještě i více zredukovat (co se počtu souborů týče), ale tohle považuji za takové smysluplné minimum. Těm micro-examples to myslím obstojně konkuruje.
Editoval Tharos (21. 8. 2011 21:10)
- nanuqcz
- Člen | 822
@Tharos: Díky, ale to se mi nelíbí. Kromě změněného umístění šablon je to klasické MVC Nette. Když budu chtít přidat další URL/pohled, budu muset buď vytvořit nový presenter, nebo novou action do DefaultPresenteru + editovat routy v bootstrapu → prostě Nette klasika. K micro-frameworku se to moc neblíží.
Hledám způsob, jak rozšířit MicroPresenter, aby šly použít snippety a vykreslitelné komponenty.
- Jan Tvrdík
- Nette guru | 2595
MicroPresenter rozšíříš dost těžko, vzhledem k tomu, že naprostá většina kódu Presenteru se stará právě o to, aby snippety a vykreslitelné komponenty fungovali. Řešením tedy není rozšířit MicroPresenter, ale rozšířit Presenter o schopnosti MicroPresenteru.
- nanuqcz
- Člen | 822
@Jan Tvrdík: Teď jsem půl hodiny koukal do kódu a asi máš pravdu, zkusím to nějak sepsat a výsledek dám sem, pokud bude funkční ;-)
EDIT: Tak zatím to vypadá, že funguje tohle. Snad se mi do toho už podaří dopasovat y snippety a komponenty
use Nette\Application,
Nette\Application\Responses,
Nette\Http;
class MiniPresenter extends \Nette\Application\UI\Presenter
{
public function run(Application\Request $request)
{
// Call user callback
$params = $request->getParams();
$params['presenter'] = $this;
callback($params['callback'])->invokeNamedArgs($params);
// Response
return parent::run($request);
}
public function canonicalize()
{
return; // fix exception: Object of class Closure could not be converted to string
}
}
EDIT2: Tak AJAX s tím funguje perfektně, ani nebylo potřeba do MiniPresenteru nic doplňovat :-)
Editoval xxxObiWan (22. 8. 2011 15:12)
- PJK
- Člen | 70
To vypadá dobře, používám Silex (https://github.com/fabpot/Silex), teď to konečně budu moci všechno krásně sjednotit :)