Že by nejrevolučnější část Nette 2.0?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
0
-

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.

veena
Člen | 98
+
0
-

Supr! Teď ještě podobně jednoduše tu část blogu případně twitteru, kterou ty data můžeš příjemně naplnit (admin) :-)

Jan Tvrdík
Nette guru | 2595
+
0
-
Lopo
Člen | 277
+
0
-

mozno by nebolo odveci nalinkovat tie 2 nove example aj priamo na https://examples.nette.org/

grey
Člen | 94
+
0
-

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

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 TemplateRouterrozšířeních , nebo přímo ve frameworku?

ViliamKopecky
Nette hipster | 230
+
+1
-

Na páté straně je prázdno. Ale jinak moc pěkná fičůrka.

Editoval enoice (2. 6. 2011 14:31)

Felix
Nette Core | 1245
+
+1
-

Ten TemplateRouter.php je fakt skvelej ;-) By skoro mohl byt addon. Btw, neni to inspirovano zarovkou? Neco podobneho jsem tam videl. Ikdyz ono v latte lze definovat jakykoli tag.

bojovyletoun
Člen | 667
+
0
-

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)

nanuqcz
Člen | 822
+
0
-

No jo, teď mi došlo… kde se v šabloně vzala proměnná $presenter? Přeci jsme nikde žádný nevytvářeli.

bojovyletoun
Člen | 667
+
0
-

zejdnodušená metoda createTemplate ..

Ps: Api ukazuje minifik. verzi: https://api.nette.org/…ce-.php.html#539, ale jiné třídy jsou ok

David Grudl
Nette Core | 8227
+
0
-

A já si říkal, proč najednou začalo být Apigenu 128MB RAM málo… ;-)

ptacek.pavel
Člen | 27
+
0
-

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

@**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 ;)

ptacek.pavel
Člen | 27
+
0
-

@HosipLan: téma máš zde: https://forum.nette.org/…-v-sablonach :-)

nanuqcz
Člen | 822
+
0
-

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)

Filip Procházka
Moderator | 4668
+
0
-

Vskutku, MicroPresenter vůbec není komponenta, ani kontejner.

nanuqcz
Člen | 822
+
0
-

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

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

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

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

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

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

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

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

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

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

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

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

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

Ono se dost špatně rozšiřuje Nette Presenter, když většina metod i proměnných, které se v něm o snippety starají, jsou private. Jsem opravdu bezradný.

EDIT: A tím spíš, když polovině kódu Nette Presenteru nerozumím :D

Editoval xxxObiWan (22. 8. 2011 12:26)

Jan Tvrdík
Nette guru | 2595
+
0
-

Nestačí přepsat metodu run?

nanuqcz
Člen | 822
+
0
-

@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)

voda
Člen | 561
+
0
-

Pokud z před voláním parrent::run() odstraníš z $params callback, tak pak asi ani nemusíš přepisovat metodu canonicalize().

nanuqcz
Člen | 822
+
0
-

Super nápad :-) Zkusil jsem, ale bohužel $request je „frozen“, takže jeho hodnoty už nelze měnit.

voda
Člen | 561
+
0
-

To sice jo, ale $params je pole, takže se předává referencí, ne? Takže by ani nemělo být potřeba je zpátky nastavovat.

nanuqcz
Člen | 822
+
0
-

Myslel jsem, že referencí se automaticky předávají jen objekty. Každopádně ani unset($params['callback']) nefunguje.

voda
Člen | 561
+
0
-

V tom případě se omlouvám za mystifikaci, z těch referencí jsem v tom PHP vždy zblblej…

Poslední možností je $request naklonovat. Jinak místo přepsání canonicalize() bude asi lepší nastavit $autoCanonicalize na false.

PJK
Člen | 70
+
0
-

To vypadá dobře, používám Silex (https://github.com/fabpot/Silex), teď to konečně budu moci všechno krásně sjednotit :)