Nefunkční odesílací tlačítko formuláře v panelu DebugBaru

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

Bohužel jsem špatně nadepsal vlákno a nelze jej zde přejmenovat. Ruším jej tedy a zde uvádím kopii již pod správným titulkem (jedná se o problém pouze v panelu DebugBaru):
__________________________________________________________________

Zdravím. Nedaří se mi zprovoznit formulář z nové verze Nette (Dev201104 z 28. 4. 2011), aby fungoval samostatně – mimo presenter Edit: v panelu DebugBaru, jinde funguje. Pro starší verzi se to řešilo třeba tady (právě do debugpanelu to také potřebuji a zkouším, ale rád bych, aby formulář fungoval i v jiných aplikacích zcela mimo Nette) i v dalších vláknech. Bohužel vše, co jsem tam našel, zatím nepomohlo. Chápu-li dobře zdrojový kód nového Nette, je pro samostatně použití patrně nyní určena třída Nette\Forms\Form a Nette\Application\UI\Form ji rozšiřuje (i když i tak trochu zužuje) pro použití v presenteru. Nějak tam ale tak úplně nevidím, jak dojde k zavolání callbacků při stisku odesílacího tlačítka. Vzpomínám-li si dobře, u starších verzí k tomu docházelo přes monitory a zavolání fireEvents(), tady to vypadá podobně. Ale pokud si pamatuji, po stisku jakéhokoli tlačítka se prováděl vždy kód v bootstrap.php, což se mi teď prostě neděje. Jako kdyby prohlížeč neposílal serveru informaci o stisku tlačítka. Kromě toho tlačítka v debugPanelu vypadají „nějak divně“ díky dědění stylů od třídy #nette-debug. To by snad ale na odeslání požadavku nemělo mít vliv, ne? Jen tak na okraj – požadavek by měl být vidět ve FireBugu, ne? Nemám tam nic. Bohužel v používání FireBugu jsem opravdu úplný začátečník. Není teď už nějak na úrovni html/css/js znemožněno zasílání požadavků z tlačítek v debugPanelu? Zítra zkusím ještě stejný formulář vytvořit zcela mimo Nette.

Podle výše zmiňovaného vlákna jsem se v zoufalství pokusil formulář svázat i s presenterem pomocí \Nette\Environment::getApplication()->presenter (přijde mi to však jako divné řešení si jeden presenter vybrat, co když zrovna nebude aktuální?), přesto ani takto nejsou volány callbacky ani při aktivaci použitého presenteru.

Tušíte někdo, co s tím?

__________________________________________________________________

Doplnění: Tlačítko je ve výsledném kódu vygenerováno takto:

<input type="submit" value="F3 view" id="frmGrid-view" name="view">

se styly (dle FireBugu):

#nette-debug * {
    background: none repeat scroll 0 0 transparent;
    border: medium none;
    color: inherit;
    font: inherit;
    list-style: inherit;
    margin: 0;
    padding: 0;
    text-align: inherit;
}
www?XD...-xdebug #4 (řádek 1)

...

Zděděno oddiv#nette-debug-panel-Nette-Diagnostics-Grid.
#nette-debug .nette-mode-float {
    opacity: 0.9;
}

...

Vše ostatní je škrtlé.

Javascript nevím, který sem případně nakopírovat.
Edit: odstranil jsem všechen javascript kromě vytváření DebugBaru a chování stále stejné.
__________________________________________________________________

I když ve FireBugu odstraním tlačítku všechny styly, nevypadá tlačítko tak úplně normálně, ač už o hodně lépe než předtím. Přesto žádný požadavek nezasílá. Ač se velmi špatně debuguje komprimovaný javascript, začínám mít podezření, že mi události od myši „užírá“ vmezeřený debugovací javascript Nette a prohlížeč tak nereaguje na stisk odesílacího tlačítka formuláře.
__________________________________________________________________

22
Nette guru
Registrovaný: 18. 1. 2010
Příspěvky: 445

Re: Neumím zprovznit formulář z NetteDev20110428 samostatně

v každé distribuci máš examples a tam to funguje bez presenteru, tak se na to podívej.
__________________________________________________________________

Děkuji. Bohužel můj problém to neřeší. Toto vlákno jsem špatně nadepsal a teď už to nejde změnit. Jde o to, že mě nejde zprovoznit formulář tak, aby fungoval i zcela mimo Nette, i v panelu DebugBaru. Jakmile jej mám v panelu, stisk odesílacího tlačítka nic nedělá zřejmě již na straně prohlížeče. Na vložení formuláře do panelu jsem žádný příklad nenašel, jen výše zmíněné vlákno. Je možné, že v nové dev verzi se panely DebugBaru chovají jinak než na podzim 2010? Ač nejsem zrovna mistr javascriptu, asi bych si kód nějak přelouskal, bohužel v komprimované podobě je to nad mé síly.

Editoval Martin (7. 5. 2011 16:44)

Mikulas Dite
Člen | 756
+
0
-

Tohle jsem řešil v https://github.com/…serPanel.php

Komponenta se připojí v konstruktoru a potom se s tím panelem pracuje jako s tradičním Controlem.

Martin
Člen | 171
+
0
-

Ahoj, dík za info. Určitě jsi řešil to samé? Já zatím nemám problém s nepřeposláním požadavku komponentě. Zatím řeším to, že požadavek se po stisku tlačítka v prohlížeči vůbec nedostane na server. Respektive už jsem malinko pokročil – použil jsem Tvůj přihlašovací formulář ze staršího příkladu (ten s nefunkčním přeposíláváním) na http://pastebin.com/zJB88zx8 a jeho tlačítko požadavek v mé aplikaci na server odesílá i s nejnovější verzí Nette (musel jsem to předělat na nové třídy a namespace). Takže chyba musí být přímo někde v mém formuláři a jeho stylech (mám u něj vykreslování přes grid a ne přes tabulkový layout, jaký bývá v conventionalRendereru). Že by to ale mohlo mít vliv na požadavek z prohlížeče, se mi nechce věřit. Postupně ten Tvůj formulář předělávám na ten můj a až dojde k neodesílání, napíšu sem, čím to bylo.

Editoval Martin (7. 5. 2011 18:19)

Martin
Člen | 171
+
0
-

Tak už je to jasné. Kdybych si pořádně přečetl už včera, co vlastně CopyPastuju na fórum, mohl jsem si ušetřit den bádání:
Použiji-li pro vypsání $form, vyprodukuje se html kód:

<input id="frmGrid-view" class="button" type="submit" value="F3 view" name="view">

zatímco při manuálním renderování pomocí $form['view']->control je výsledek přeházený a hlavně ochuzený o class="button":

<input type="submit" value="F3 view" id="frmGrid-view" name="view">

Proč to ovšem neodesílá požadavek, je, že $form->render('begin') a $form->render('end') vracejí prázdné řetězce (html kód posílají přímo na výstup), takže prohlížeč při manuálním vykreslování bez hlavičky formuláře neví, jak by měl požadavek poslat. No, jsem asi pitomec, ptám se tady na něco úplně jiného a nakonec přijdu na tohle. Samozřejmě pro použití v panelu DebugBaru se musí $form->render('begin') a $form->render('end') obalit pro manuální vykreslování takto:

ob_start();
		$form->render('begin');
$beginForm = ob_get_clean();
ob_start();
		$form->render('end');
$endForm = ob_get_clean();

a do řetězce vraceného v callbacku getPanel() pak přidávat $beginForm a $endForm. No, zase jsem se tu ukázal jako NetteNeználek, ale třeba to někomu pomůže, kdyby narazil na stejný problém.

Předpokládám, že funkce render() posílá pouze na výstup a vykreslený řetězec nevrací z výkonnostních důvodů. Jinak bych si dokázal představit dost situací, kdy by se vracený řetězec použil místo ob_ funkcí.

Editoval Martin (7. 5. 2011 19:49)

Martin
Člen | 171
+
0
-

Mikulas Dite: Ohledně dalšího zpracování signálu: Pokud to dobře chápu, připojíš formulář k aktuálnímu presenteru. Tím, že se připojení děje zavoláním z BasePresenteru, i při zpracování signálu kterýmkoli poděděným presenterem bude panelová komponenta připojena správně. Ale když používám moduly, musel bych ještě nadřadit jakýsi universální nadpresenter všech basepresenterů a připojení provést v něm. Sice to tak ve všech aplikacích aktuálně mám, ale pokud bude někdo stavět aplikaci opravdu modulárně, třeba s využitím něčích zapouzdřených modulů, nepůjde tento přístup použít. Nemýlím se, že v takovém případě by při akci některého nedědícího presenteru k připojení panelové komponenty nedošlo? Pokud to tak je, napadá Tě nějaké univerzálnější řešení? Mám na mysli něco jako vytvoření v bootstrapu a nějak zajištěné pozdější připojení do aktuálního presenteru, ať je to kterýkoli? Je pro to v Nette nějaká předpřipravená feature? Asi by to muselo být nějaké čtení z jakéhosi statického seznamu komponent připravených k připojení, to není zrovna úhledné řešení. Ale většinou zde objevím, že ač třeba dosud nevyužito, je v Nette pro jakýkoli smysluplný požadavek nějaké hezké místečko přichystáno.

Pro to univerzální řešení mám jednoduchý důvod. To, co se pokouším vyrobit v panelu DebugBaru, by mělo časem přerůst v jakési primitivní IDE, umožňující z jakéhokoli počítače a prohlížeče bez instalace čehokoli jiného jednoduchou online správu souborů a projektů, editaci PHP kódu, debugging, možná i wisywig správu šablon, stylů, „zasunovač addonů“ a pár podobných drobností. Myslím, že nejsem sám, kdo by ocenil možnost pokračovat ve vývoji třeba z mobilního telefonu cestou v autobuse, trávím denně několik hodin v dopravních prostředcích. Taková komponentička ovšem bude muset mít vytvoření zcela nezávislé na návrhu aplikace a aktivaci jednoduchým voláním na základě autorizace nejvyššího stupně. Nechci ovšem „vymýšlet kolo“, určitě se najde plno použitelných věcí, které již byly úspěšně řešeny.

Ukázka

Editoval Martin (13. 5. 2011 1:09)

Martin
Člen | 171
+
0
-

Tak po prostudování asi tak půlky Nette – ono to vážně jinak nepůjde. Sice bych mohl „vyzobnout“ request v bootstrapu či lépe v App:OnRequest(), ale to by bylo ošklivé ohýbání a problematicky by se to pak vykreslovalo. No nic, stejně to budu používat jen ve svých Nette aplikacích, tak se vždy holt použije ten SuperPresenter nad všemi moduly. Drobná žádost zde .

Editoval Martin (9. 5. 2011 10:19)

Martin
Člen | 171
+
0
-

Hmmm… a po prostudování druhé půlky – ono to možná půjde, ale zatím nevím jak. Zřejmě i v shutdown (!!!) fázi (kde se volají callbacky DebugBaru) lze připojit komponentu, zrestaurovat request (zahozený v onRequest) a zpracovat signál. Ale zatím nejsem schopen stvořit funkční kód. Přesto by mě nepřekvapilo, že Nette opět obsahuje něco, co se hodí i na věci, s nimiž předem dost dobře nikdo nemohl počítat.

Kdyby snad někoho zajímalo, co z toho má být, pokud z toho vůbec něco bude, tak nástin je tady a podrobnější tady

V každém případě pokud se do Application přidá callback onPresenter() či onPresenterCreated(), registrace panelů funguje bez problémů, snad se to podaří protlačit do distribuce.

Editoval Martin (12. 5. 2011 9:24)

Martin
Člen | 171
+
0
-

Tak asi nový posun zde. Tiše, promluvil David

Martin
Člen | 171
+
0
-

Kdyby někoho zajímalo, jak pokročil vývoj webového IDE, tak zatím částečně funguje Commander (klikem na ikonku továrny v debugbaru). K vyzkoušení je zatím jen přepínání panelů tabulátorem (aktivace nutná klikem myší) a spouštění editoru stiskem F3 po najetí na soubor (ne adresář), editor je nutno rozkliknout z DebugBaru (zatím pilotní návrh, vše bude časem jinak).

Editoval Martin (17. 5. 2011 11:18)

Martin
Člen | 171
+
0
-

Drobný pokrok ve vývoji viz PS a zde