přesměrování formuláře z http na https, callback
- pernip01
- Člen | 21
Zdravím vás,
zkouším ovládnout Nette a zkouším jím řešit věci, které jsem dělal
„po staru“ . Vím, že některé věci níže uvedené zde již byly
uvedeny, ale nevim jaký je nejlepší možný postup dnes (z důvodu
vylepšování Nettte).
Situace, kterou se s pomocí Nette vyřešit je:
Mám login formulář, který je zobrazen na všech presenterech . Pro
logování potřebuji odeslat pod protokolem HTTPS formulář na jiný
presenter, který provede ověření uživatele a případné zalogovoání.
V případě, že se jedná o uživatele s vyšším oprávněním
potřebuji, aby bylo vyžadována komunikace pod https a pro uživatele
s nižším oprávněním ponechat komunikaci pouze pod http.
Prozatím jsem do basepresenteru napsal funkci pro formulář:
protected function createComponentLoginForm()
{
$form = new Form();
$form->setAction('Login/prvdlgn');
$form->setMethod('POST');
$form->addText('usrnm', 'Jméno:', 10, 10 )
->addRule(Form::FILLED, 'Je nutné zadat uživatelské jméno.') ;
$form->addPassword('syetrt', 'Heslo:', 10, 10 )
->addRule(Form::FILLED, 'Je nutné zadat heslo.');
$form->addSubmit('crgts', 'Přihlásit');
return $form;
}
a přes @default.latte jsem jej jej vykreslil.
{form loginForm}
<table >
<tr >
<th><font class="logincapt">Přihlášení</font></th>
<td>{input usrnm class=> logintxt }</td>
<td>{input syetrt class=> logintxt }</td>
<td>{input crgts class=> loginbtn}</td>
</tr>
</table>
{/form}
Problém č.1: Jde odeslání dat z http pod https udělat elegantněji než přes novou položku v routeru viz převzaté řešení?:
$container->router[] = new Route('login/prvdlgn', array('presenter' => 'Login','action' => 'prvdlgn') , Route::SECURED);//
Problém č.2 : Jde vůbec zajistit, aby se v případě, kdy formulář
odesílá data do jiného presenteru a pod jiným protokolem, dala použít
automatická validace a odchycení události/signálu „onSuccess“ spolu
s příslušným callback em ? něco jako:
$form->onSuccess[] = callback($Login, ‚newTasklistFormSubmitted‘);
Podle mne by to mělo jít, jen nevím jak, pokud ne, pak by to člověk mohl dělat postaru (rúčo).
Problém č.3 : Jestliže mi Login presenter provede kontrolu uživatele a zjistí, že neexistuje, jak předat získané chybové hlášení do formuláře basepresenteru, abych toto chybové hlášení mohl v @default.latte vypsat? (vypsání není v příkladu uvedeno, ale vypsat chyby umím).
Problém č.4: Všiml jsem si, že javascriptová kontrola na straně uživatele funguje kupř v CHROME , ale nefunguje v IE 9. Vcelku osobně javasciptovou kontrolu moc neuznávám, protože se oni opřít nedá, ale zajímalo by mne, jak to odstranit. Vysvětlovat uživateli, že v jednom prohlížeči to funguje a v druhém ne, je v dnešní době pasé.
Problém č. 5 : V případě, že se jedná o uživatele s vyšším oprávněním potřebuji, aby bylo vyžadována komunikace pod https a pro uživatele s nižším oprávněním ponechat komunikaci pouze pod http. Toto nevím, jak toho dosáhnou a poprosil bych o radu.
Děkuji za odpovědi .
Editoval pernip01 (19. 3. 2012 0:39)
- Jan Endel
- Člen | 1016
- žel, nic elegantnějšího mě nenapadá, jak formulář donutit posílat HTTPS, než jak jsi nastínil ty.
- viz níže
- Takovýto problém se většinou řeší tak, že celý formulář
i s příslušnou metodou po odesílání se dá do předka všech presenterů
kterých se to týká/vlastní třídy/samostatné komponenty. Takže není
zapotřebí dělat čachry a volat to tedy ne nad jiným ale nad stávajícím
presenterem. Chyby pak vypíšeš snadno přes
addError('foo isn't filled');
. - Ukaž jak ji provádíš, teď jsem ji testoval ve svojí aplikaci a v IE9 se mi normálně zobrazí.
- Toho rozumnou cestou nedosáhneš, protože ty odešleš data a teprve potom můžeš zjistit, jestli jde o uživatele s nízkým nebo vysokým oprávněním, osobně bych to vše tahal přes HTTPS (pokud jsem tě pochopil správně).
- pernip01
- Člen | 21
Díky za odpověď,
k 2.: To si myslím, že dělám tim, že jsem vytvořil
protected function createComponentLoginForm()
.
.
v basepresenteru.
jenže takto mi pak nereaguje validace a tudíž ani ten callback
příklad:
$form->onSuccess[] = callback($Login, ‚newTasklistFormSubmitted‘);
nebo je ještě něco nad basepresenterem co se dá použít?