Generování javascriptu à la GWT
- knyttl
- Člen | 196
Co mě poslední dobou začíná odvádět od dalšího používání PHP a Nette jsou dvě věci – absence statického typování a pak nutnost psát zvlášť navíc Javascript, či JQuery.
Statické typování a vůbec typový systém se asi vyřešit nedá, ale to generování Javascriptu by v budoucnu mohlo. Idea je taková, aby člověk mohl v Presenteru rovnou psát handlery na události (click, hover), tak aby nemusel psát navíc signály a hlídat, jestli se mezi nimi předává vše v pořádku. Nette by pak vygenerovalo Javascript/Jquery popř. Dart script, který by byl na konci přiložen ke kodu.
Např. něco ve stylu
<?php
public function renderDefault() {
...
$this->template->query('#save_button')->live('click', function ($element) use ($container) {
$element->hide();
$container->model->articles->save($element->...);
});
...
}
?>
Obrovskou výhodou by byla udržitelnost a člověk by neustále nemusel řešit, zda se v signálech korektně předávají všechny parametry.
Samozřejmě, je to komplikované, obnáší to trochu vědy o překladu, a spoustu dalších obtíží. Vidím to ale jednu z kůl vlastností, která by v Nette v budoucnu být mohla. Do budoucna by to mohla být stránka Nette, kterou by neměl žádný jiný PHP Framework. Java nástroje to některé mají (viz zmíněný GWT, nicméně žádný není v podstatě úplným Frameworkem a člověk musí komplexně spojovat dohromady více nástrojů. Něco takového by umožnilo používat Nette na skutečně obrovské projekty – už třeba jen z důvodu, že by tyto konstrukce šli lépe testovat, než kdyby byly psány navíc v Javascriptu. Určitě by šlo i rozpoznávat, zda dané „query“ na šablonu jsou vůbec splnitelné.
Co si o tom myslítě?
- Mikulas Dite
- Člen | 756
Asi ti teď neřeknu konkrétně, na příkladu, ale řešit se to dá
ještě lépe. Můžeš využít atributů data-
, do kterých si
uložíš všechno dynamické pro javascript a ten to potom zpracuje. Třeba pro
parametry signálů je to ideální. Navíc je pak script jenom jeden a zvládá
to přechroustat všechno.
- Filip Procházka
- Moderator | 4668
<flame>
To vypadá hrozně. Slátanina. Podporovat tohle
nebudu a doufám, že se Davidovi to nebude chtít dávat ani do
FW. </flame>
Ale jako plugin, proč ne. Mělo by to jít napsat relativně snadno. Konkrétně u signálů by to nemusel být vůbec problém.
Ale jak říká Mikuláš, řešil bych to přes data-
attributy
a udělal si handlery zvlášť, v tom hnusném javascriptu :)
- knyttl
- Člen | 196
No, to přes ta data- je pěkné pouze ve směru z PHP do JS. V druhém směru už to vůbec pěkné není.
Já třeba řeším to, že přes signály v POSTu předávám nějaké parametry. Potom musím pořád složitě hlídat, jestli jsem je předal všechny a jestli se nesnažím číst nějaký, který by v nich nebyl (třeba jeden signál používám pro více operací). Takhle by to bylo jednoznačné.
Možná to je „slátanina“, ale kdyby GWT nebyl čistě JS framework, tak na něj asi ihned přejdu. Když jsme v tom psali http://wam.inrialpes.fr/websolver/, tak to byla radost, kde se vše psalo v jednom kódu. A vše, co se dělo mezi klientem a serverem bylo ukryté a člověk se s tím nenervoval.
- knyttl
- Člen | 196
Pro větší aplikace je prostě JavaScript hodně těžko udržitelný. Pokud Nette pomáhá postavit PHP aplikaci, tak pro Javascript takového není nic – JQuery jen usnadňuje stavbu aplikace, ale samotnou aplikaci nestaví.
Pokud by se tedy nelíbil vývoj Nette ve směru GWT, určitě by stálo za zvážení, zda nepodpořit stavbu aplikace i z hlediska JS v nějakém jiném směru – v tuto chvíli už v tomto směru Nette nabízí minimálně formuláře a snippety – určitě by bylo fajn, kdyby šlo dělat i další věci.
- Filip Procházka
- Moderator | 4668
David to pravděpodobně už četl a kdyby se mu to líbilo, tak by se snad vyjádřil. Pokud o to máš hodně zájem, můžeš založit repozitář na githubu a rozjet vývoj pluginu. Já konkrétně bych asi nepřispíval, ale můžu ti do toho kecat, kdybys chtěl ;)
- Honza Kuchař
- Člen | 1662
Není to spatny nápad, nicméně do Nette se to vůbec nehodí. Nette ma proste presenter a šablonu oddělenou. JavaScript tam tedy nepatří. Patrí do šablony. Jak bys chtěl potom zajistit fungování bez JS?
- knyttl
- Člen | 196
Já se právě na to nechci dívat jako na Javascript. Já bych spíš chtěl definovat funkcionalitu a vůbec nevědět o tom, co se děje v pozadí.
Jako příklad vezmu formuláře, kde jen definuju, jak se mají validovat a už se nestarám o to, že si to Nette samo validuje jak v prohlížeči, tak potom i v PHP. O Javascriptu ani zmínka.
Stručně, líbilo by se mi, aby se daly rovnou chytat handlery na elementy a něco s nimi dělat, aniž bych o javascriptu měl nějaké potuchy.
- Mikulas Dite
- Člen | 756
Já vidím problém v tom, že abys tohle mohl psát v presenteru, tak potřebuješ znát template. Tzn. se z (M)VC stává (M)C a je to celé zamotané do sebe.
Je tady určitá možnost, že by Nette napojovalo ajax nad formuláře, ale těžko dynamicky vybere některé linky a některé nechá. Nemluvě o jakékoliv vyšší funkcionalitě (třeba klikni a změní se tab).
(Původně Nette mělo mít takovýhle ajax, ale pravděpodobně právě kvůli tomu, jak těžko se to dá napsat z toho sešlo.)
- knyttl
- Člen | 196
A co takhle JavaScript à la DWR v Javě? (http://directwebremoting.org/dwr/index.html)
S DWR lze registrovat Javovské funkce tak, aby je bylo možné volat přímo z javascriptu. DWR se stará o bezpečnost (hlídá Session) a korektní předání parametrů. Pořád se vám to nelíbí z pohledu MVC?
Editoval knyttl (16. 1. 2012 19:24)