Nová reCAPTCHA pro formuláře

dubblen
Člen | 9
+
0
-

Trošku jsem zase pokročil.

ReCaptcha->validate() vrací FALSE.

$ch = curl_init();
Debugger::dump($ch);
curl_setopt_array($ch, array(
    CURLOPT_URL => self::VERIFICATION_URL . '?' . http_build_query(array(
	    'remoteip' => $remoteIP,
	    'secret' => $this->secretKey,
	    'response' => $post[self::RESPONSE_KEY],
    ), '', '&'),
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_SSL_VERIFYHOST => FALSE,
    CURLOPT_SSL_VERIFYPEER => FALSE,
));

$response = curl_exec($ch); // $response == FALSE

Editoval dubblen (22. 8. 2016 1:26)

dubblen
Člen | 9
+
0
-

Už jsem se dopátral k něčemu. Zjistil jsem, že CURL hází chybu č. 35, která znamená ⇒ „CURLE_SSL_CONNECT_ERROR“.

Znamená to, že musím mít SSL certifikát?

Po zakomentování returnu této větve se objevuje další error:

try {
	$json = Utils\Json::decode($response);
	return isset($json->success) && $json->success;

} catch (Utils\JsonException $e) {
	Debugger::dump($e); // tento dump
	return FALSE;
}

dump:

Nette\Utils\JsonException #bc21
message protected => "Syntax error" (12)
string private => ""
code protected => 0
file protected => "/Users/nathannemec/Sites/bezpecnost/vendor/nette/utils/src/Utils/Json.php" (73)
line protected => 58
trace private => array (15)
previous private => NULL
xdebug_message => "
Nette\Utils\JsonException: Syntax error in /Users/nathannemec/Sites/bezpecnost/vendor/nette/utils/src/Utils/Json.php on line 58

Call Stack:
    0.00 ... " (2591)

Editoval dubblen (22. 8. 2016 1:25)

uestla
Backer | 783
+
0
-

Ten další error je jen způsobený tím zakomentováním, to je v pohodě.

Myslel jsem, že ty 2 SSL optiony, co se v tom cURL callu nastavují, budou stačit. Mohl bys prosím přidat ještě CURLOPT_VERBOSE, jestli to na sebe neprozradí víc?

EDIT: resp. zkus ještě prosím zapnout CURLOPT_CERTINFO

Editoval uestla (22. 8. 2016 15:38)

Čamo
Člen | 745
+
0
-

EDIT: Pardón, pomýlil som si balíčky. Ja som použil balík minetro/reCAPTCHA

Zdravím,
snažím sa implementeovať túto captchu na projekt nad Nette ~2.2.8.
Podľa dokumentácie pre túto verziu treba použiť $ composer require minetro/recaptcha:~1.4.0
To som urobil. V neone mám:

extensions:
	recaptcha: Minetro\Forms\reCAPTCHA\ReCaptchaExtension

recaptcha:
	secretKey: ******
	siteKey: ******

čo asi nebude správne a vo formulári

	protected function createComponentContactForm()
	{
		$form = new Form();

		$form->addReCaptcha('recaptcha', NULL, "Čo si zač?");
		...

No a vypadne mi z toho error: ReCaptchaExtension.php – Call to undefined method Nette\PhpGenerator\ClassType::getMethod()
Podľa dokumentácie by to malo byť asi $initialize = $class->methods[‚initialize‘]; nie?

Je nejaký nádej že to rozchodím nad Nette ~2.2.8?

Editoval Čamo (3. 11. 2016 17:09)

Čamo
Člen | 745
+
0
-

Prepísal som to a chyba zmizla. Žiadny chyba nenastane, ale nič sa nevykreslí. Vo formulári to mám ako

	<label n:name="captcha" class="required">Captcha</label>
	<div n:name="captcha"></div>

Konzola nič a žiadny prvok sa nezobrazí.

EDIT: Chyba bola tentokrát u mňa. Už sa zobrazuje. Len doménu pre virtualhost mám teraz blbo…

Editoval Čamo (3. 11. 2016 12:51)

SontoEremo
Člen | 341
+
0
-

@uestla Zdravím…
Dneska som nahodil tvoj addon reCAPTCHA všetko prebehlo OK až na odosielanie kde po vyplnení formulára a zaškrtnutia my to vyhodí chybu ako keby reCAPTCHA nebola zaškrnutá Please prove you're not a robot.
Môže byť problém v tom, že to testujem na localhoste? aj keď som ho v google->recaptcha zaregistroval a vytvoril kľúče? Lebo už fakt neviem kde inde by som mal hľadať problém.

Ďakujem vopred za odpoveď a pomoc.

uestla
Backer | 783
+
0
-

@SontoEremo Ahoj.

Jakou verzi používáš? Validace je implementovaná možná trošku vágně, že vrací FALSE i při fatálních chybách.

Zkus si prosím postupně odkrokovat nebo ručně dumpovat, co se děje v této fázi":https://github.com/…eCaptcha.php#….

Ono totiž může dojít k chybě při CURL requestu nebo se ti vrátí nevalidní JSON a validátor „jen“ zahlásí, že přišla nevalidní hodnota…

SontoEremo
Člen | 341
+
0
-

uestla napsal(a):

@SontoEremo Ahoj.

Jakou verzi používáš? Validace je implementovaná možná trošku vágně, že vrací FALSE i při fatálních chybách.

Zkus si prosím postupně odkrokovat nebo ručně dumpovat, co se děje v této fázi":https://github.com/…eCaptcha.php#….

Ono totiž může dojít k chybě při CURL requestu nebo se ti vrátí nevalidní JSON a validátor „jen“ zahlásí, že přišla nevalidní hodnota…

Používam 4.0.0 no pozriem sa na to teda :)

uestla
Backer | 783
+
0
-

Právě jsem vydal verzi 6.0.0.

Hlavní BC break je rozdělení do vícero tříd, vznikly třídy:

  • ReCaptchaControl\DI\Extension
  • ReCaptchaControl\Control
  • ReCaptchaControl\Renderer
  • ReCaptchaControl\Validator

Hlavním důvodem byla lepší testovatelnost – čili zároveň přibyly i testy :-)

PS: Pokud používáte DI extenzi, tak se vás týká v podstatě jen přejmenování ReCaptchaControl\ReCaptchaExtension na ReCaptchaControl\DI\Extension, zbytek zůstal nezměněný.

Editoval uestla (24. 1. 2017 23:49)

thermaltaker
Člen | 10
+
0
-

Zdravím, mám form s classou ajax a v něm reCapthchu. Vše šlape, do doby než se formulář odešle, vyhodí chybu, díky které se celý formulář snippetem překreslí. Po překreslení se už ale nenačte reCaptcha. Prostě zmizne. Nevím jestli jsem narazil na chybu u mě nebo v rozšíření. Proto bych se chtěl zeptat, nesetkali jste se s tím už někdo?

uestla
Backer | 783
+
+2
-

Ahoj,

po každém AJAX requestu je potřeba recaptchu resetovat pomocí grecaptcha.reset();.

Pokud používáš nette.ajax.js, můžeš použít něco jako tohle.

Asi to přidám jako další ukázkový script mezi assety.

Editoval uestla (24. 3. 2017 1:09)

uestla
Backer | 783
+
+4
-

Ahoj,

pomalu připravuji novou verzi, tak jsem vám jen chtěl sepsat novinky:

Ať slouží!

Editoval uestla (25. 6. 2017 3:28)

d3tr1tus
Člen | 52
+
0
-

Ahoj,

mám dotaz. Mám projekt bez composeru takže jsem instaloval reCaptchu pouze stažením a přidáním do configu, ale Laděnka mi vyhazuje toto:

Found sections 'extensions', 'recaptcha' in configuration, but corresponding extensions are missing.

Můj config:

	extensions:
		recaptcha: ReCaptchaControl\DI\Extension

	recaptcha:
# required
		siteKey: 'xxx'
		secretKey: 'xxx'

# optional
		methodName: 'addReCaptcha'
		requester: ReCaptchaControl\Http\Requester\CurlRequester

Mohli by jste mi poradit?

Děkuji

uestla
Backer | 783
+
0
-

Ahoj,

to vypadá na nějakou starší verzi Nette, protože se ti nenačítá Nette\DI\Extensions\ExtensionsExtension. Jakou verzi Nette máš?

d3tr1tus
Člen | 52
+
0
-

uestla napsal(a):

Ahoj,

to vypadá na nějakou starší verzi Nette, protože se ti nenačítá Nette\DI\Extensions\ExtensionsExtension. Jakou verzi Nette máš?

Ano předělávám kamarádovi web a je celý vytvořený na starší verzi Nette 2.0.1

uestla
Backer | 783
+
0
-

@d3tr1tus Aha, v tom případě (pokud není reálné upgradovat Nette) bych zkusil nějakou starší verzi knihovny, kde jde extenzi zaregistrovat přes metodu.

Např. verze 4.0: https://github.com/…l/tree/4.0.0

A v bootstrap.php zaregistruj pomocí

ReCaptchaControl\ReCaptchaExtension::register($configurator);
d3tr1tus
Člen | 52
+
0
-

@uestla aha děkuji zkusím to.

BuMoRi
Člen | 102
+
0
-

Ahoj, koukám zatim jen na příklady použití a vidím, že v invisible verzi (nevím jestli i v normální) je nutné použít netteForms.js? Kvůli vlastní validaci tuto knihovnu nepoužívám. Jde to i bez ní?

uestla
Backer | 783
+
0
-

Ahoj,

jde to i bez ní. Hlavní myšlenka je, že by se grecaptcha.execute(...) měla vykonat až po úspěšné klientské validaci (ať už tvojí vlastní, nebo té v netteForms.js).

https://github.com/…isible.latte#…

BuMoRi
Člen | 102
+
0
-

Ahoj, asi blbej dotaz, ale jak se dá ta invisible otestovat? Jedině tak, že si vyrobím bota? :)

uestla
Backer | 783
+
0
-

Já to testoval zvýšením „ostražitosti“ v nastavení reCAPTCHy :-)

Ale je možné, že ani pak nebude kontrola vyskakovat…

BuMoRi
Člen | 102
+
0
-

Vyzkouším. Ale asi neni důvod si myslet že nefunguje :). Díky moc za script i rady!
Edit: po pár rychlých registracích zasebou mi vyskočily auta :)

Editoval BuMoRi (21. 11. 2017 13:54)

Darthy
Člen | 13
+
0
-

Ahoj,

úspěšně se mi povedlo na localhostu aplikovat tvůj ReCaptchaControl, tedy až na funkcionalitu. Formulář se mi totiž neodešle, ani když captchu vyplním nebo ne, navíc se mi ani nezobrazí hláška když ji nevyplním. Předpokládám, že problém bude, že formulář není vyhodnocený jako „success“ k odeslání… Nevím ovšem jak to napravit, případně jak to debugnout a najít příčinu chyby?

protected function createComponentSubscribe() {

        $form = new Form();
        $form->addText('labelTitle');
        $form->addText('labelEmail', "Email: ");
        $form->addEmail('email')->setRequired(true);
        $form->addText('lblLang', "Language: ");
        $form->addSelect('langSelect')->setItems(['en', 'cs']);
        $form->addReCaptcha('captcha','reCAPTCHA for you',"Please prove you're not a robot.");
        $form->addSubmit('btnSub', $this->translator->translate('ui.subscribe'));
        $form->onSuccess[] = [$this, 'subscribe'];

        return $form;
}

Jinak používám {input captcha}.

EDIT: Když ReCaptchu zakomentuju tak se formulář odesílá, takže hádám že je vždy vyhodnocena jako nesplněna…? Tím pádem se neobjeví ani hláška že jsem ji nevyplnil, když se formulář neodešle.

Editoval Darthy (26. 2. 2018 21:12)

uestla
Backer | 783
+
0
-

@Darthy To vypadá na problém s javascriptem – zobraz si konzoli, jestli v ní nejsou nějaké chyby.

Darthy
Člen | 13
+
0
-

@uestla Konzole je prázdná, žádnou chybu nehlásí. Script mám daný v @layout.latte v {block scripts} úplně jako poslední… Ale recaptcha běží, označí zelenou fajfkou že nejsem robot a když kliknu odeslat, tak se formulář neodešle, jen když je addReCaptcha() zakomentovaná (a makro v latte).

EDIT: Tak jsem se posunul, chyběl mi v config.neon řádek requester (simple requester funguje, CURL mi nešel), v dokumentaci máš napsáno, že to není vyžadováno, nicméně mně to bez toho nejede. Každopádně, pokud nezaškrtnu reCaptchu, tak mi nenapíše hlášku „Please prove you're not a robot.“, musím pro to mít někde makro?

Editoval Darthy (2. 3. 2018 15:29)

uestla
Backer | 783
+
0
-

CURL mi nešel

Jakým způsobem nešel? Z toho, co píšeš, ti nejde ani simple requester, nebo ten funguje? A jestli nefunguje, tak nefunguje stejným způsobem jako cURL?

Může to být nastavením prostředí (certifikáty, konfigurace PHP), apod.

v dokumentaci máš napsáno, že to není vyžadováno, nicméně mně to bez toho nejede

Vyžadováno to skutečně není, defaultní je CurlRequester. To, že ti cURL nefunguje, nesouvisí s (ne)vyžadovatelností explicitního nastavení konkrétního requesteru.


Všechny nativní requestery zachytávají výjimky/chyby a rovnou validátoru vrací false, proto je obtížnější zjišťovat příčinu.

Nicméně si můžeš v tom requesteru, který si nastavíš, dumpovat průběh dotazování se – např. u CurlRequesteru tady.

Darthy
Člen | 13
+
0
-

Neměl jsem v config.neon řádek requester, tak jsem tam dal defaultně ten co máš v dokumentaci – tedy CurlRequester. Nic se nezměnilo, (ne)fungovalo to jako předtím, formulář se neodeslal. Ale jakmile jsem CurlRequester vyměnil za SimpleRequester, tak se formulář bez problému odeslal (pokud byla recaptcha zaškrtnutá). Pokud zaškrtnutá není, tak se formulář neodešle, ale nezobrazí se ani zpráva.

uestla
Backer | 783
+
0
-

Ale jakmile jsem CurlRequester vyměnil za SimpleRequester

Zkoušel jsi prosím dumpovat v CurlRequesteru $response, případně curl_error($ch), jak jsem tě odkazoval výše? Tipuji to na problém s certifikáty.

Pokud zaškrtnutá není, tak se formulář neodešle

Jako fyzicky se neodešle? Při kliknutí na submit se nic nestane? Nebo tím myslíš, že se odešle, ale považuje se za nevalidní (tj. nevyvolá se onSuccess event)?

nezobrazí se ani zpráva

Není to pouze tím, že ji nikde nevykresluješ?

Darthy
Člen | 13
+
0
-

Zkoušel jsi prosím dumpovat v CurlRequesteru $response, případně curl_error($ch), jak jsem tě odkazoval výše? Tipuji to na problém s certifikáty.

Dump mi vrací false a pro curl_error($ch) se nezobrazuje nic.

Při kliknutí na submit se nic nestane? Nebo tím myslíš, že se odešle, ale považuje se za nevalidní (tj. nevyvolá se > onSuccess event)?

Nevalidní.

Není to pouze tím, že ji nikde nevykresluješ?

Přiznám se že s nette nejsem tak daleko, je dost možné že ji nevykresluji, protože nevím jak ji vykreslovat. V presenteru volám flashMessage() pro vykreslování vlastních zpráv a v latte pak používám

{foreach $flashes as $flash}
	<div class="form-labels">{$flash->message}</div>
{/foreach}

a moje zprávy se mi vykreslují.

uestla
Backer | 783
+
0
-

pro curl_error($ch) se nezobrazuje nic.

„Nic“ ve smyslu NULL? Co ti to vydumpuje?

moje zprávy se mi vykreslují

To máš na mysli flash messages, nikoli chyby formuláře. Pokud vykresluješ ručně, je třeba na ně pamatovat – podívej např. do sandboxu.

Darthy
Člen | 13
+
0
-

„Nic“ ve smyslu NULL? Co ti to vydumpuje?

Pokud dám curl_error($ch) do dumpu, vyhodí prázdný řetězec, jen "".

Daewoo
Člen | 33
+
-1
-

Co se týče curlu, tak mně běží totok:

$url = $this->buildUrl($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
Mark53CZ
Člen | 7
+
+1
-

Ahoj,

aktualizoval jsme na novou verzi 7.0.0 kde přibyly validace a nevím si rady jak znovu zprovoznit to co fungovalo
dříve :)

V config.neon mám:

reCaptcha:
    secretKey: @App\Model\Managers\Settings::getRecaptchaSecretKey()
    siteKey: @App\Model\Managers\Settings::getRecaptchaSiteKey()
    methodName: 'addReCaptcha'

A problém je, že při vytváření DI containeru je v ReCaptchaControl\DI\Extension validace na string:

Validators::assertField($config, 'siteKey', 'string');

Moje funkce sice string vrací, ale při vytváření containeru jí validace vidí jako Nette\DI\Statement a tudíž vyhodí chybu. Neřešil někdo podobný problém, že by potřeboval předávat klíče pro recaptchu například z databáze a né jí mít natvrdo v config.neon?

uestla
Backer | 783
+
0
-

Ahoj @Mark53CZ

Je pravda, že na toto jsem nepomyslel.

Obecně nevím, jak tyto dynamičnosti řešit – např. ani z tohoto řádku nejsem zrovna odvázaný.

Nicméně pro tvůj případ mě napadl následující workaround:

parameters:
	recaptcha:
		siteKey: @App\Model\Managers\Settings::getRecaptchaSiteKey()
		secretKey: @App\Model\Managers\Settings::getRecaptchaSecretKey()

recaptcha:
	siteKey: '%recaptcha.siteKey%'
	secretKey: '%recaptcha.secretKey%'

Mohl bys to vyzkoušet, prosím?

Mark53CZ
Člen | 7
+
0
-

@uestla toto jsem už taky zkoušel, ale stejně je to stále jako Nette\DI\Statement a padne to na validaci :( Myslím, že dokud se nesestaví container tak se to nezmění…

Ondřej Kubíček
Člen | 494
+
0
-

zkus to ještě takhle, nazval bych to spíš prasárnou než workaroundem, ale vsadím se, že to bude fungovat

parameters:
    recaptcha:
        siteKey: @App\Model\Managers\Settings::getRecaptchaSiteKey()
        secretKey: @App\Model\Managers\Settings::getRecaptchaSecretKey()

recaptcha:
    siteKey: ::sprintf("%s", %recaptcha.siteKey%)
    secretKey: ::sprintf("%s", %recaptcha.secretKey%)
Mark53CZ
Člen | 7
+
0
-

@OndřejKubíček bohužel ani takto to nejde. Stále stejná chyba.

uestla
Backer | 783
+
0
-

To už bude možná lepší odebrat tu validaci – vyžadovat string mi dává smysl jen u methodName.

Můžu tě poprosit o přípravu Pull Requestu? ;-)

Mark53CZ
Člen | 7
+
0
-

Jasně :) Díky za rychlé odpovědi

uestla
Backer | 783
+
0
-

Pokračování u PR na GitHubu.

duskohu
Člen | 774
+
0
-

Ahojte, snazim sa najodit tito komponentu 7.0.1:
pridal som extension, nakonfiguroval secretKey a siteKey, pridal do formu field a macro do template:

$form->addReCaptcha('recaptcha', NULL, "Please prove you're not a robot.");

{input recaptcha}

Problem je v tom ze ked odoslem formular, tak sa nic nestane a form sa v pohode odosle. RObim nieco zle?

duskohu
Člen | 774
+
0
-

Tak uz sa mi to nejako podarilo rozchodit, len ked som zapol odosielanie formu ako ajax, tak to nejde, samozrejme som nacital aj assets/recaptcha.ajax.js subor, netteForms a netteAjax mam tiez.
formular as ajaxovo odosle, ale nikde mi nevypise error hlasku.

Je to preto ze sa mi naspat nevrati snippet s formularom a error hlaskou.

Editoval duskohu (18. 6. 2018 12:05)

uestla
Backer | 783
+
0
-

@duskohu Ahoj, jak jsi prosím vyřešil ten úvodní problém? Pokud se formulář odeslal bez validace a pustil onSuccess, je to závažný problém. Nebo ti jen chybělo vykreslení chybové hlášky?

Ohledně AJAX formuláře – zkoušel jsi vyjít z demo aplikace v tests/manual?

duskohu
Člen | 774
+
0
-

uestla napsal(a):

@duskohu Ahoj, jak jsi prosím vyřešil ten úvodní problém? Pokud se formulář odeslal bez validace a pustil onSuccess, je to závažný problém. Nebo ti jen chybělo vykreslení chybové hlášky?

Ohledně AJAX formuláře – zkoušel jsi vyjít z demo aplikace v tests/manual?

@uestla , Vsetko funguje v poriadku, v app problen neni, bol len problem medzi klavesnicou a stolickou :-). Som zabudol pridat na onSubmit redrawControl. A prave demo ma na to naviedlo. Takze vsetko je ok. Dakujem velmi pekne.

$form->onSubmit[] = function () {
    if ($this->presenter->isAjax()) {
        $this->redrawControl();
    }
};
jAkErCZ
Člen | 321
+
0
-

Chci se zeptat když to volám v modal oknu je nějaká možnost jak vrátit flashmessage o tom že to nepotvrdil?

uestla
Backer | 783
+
+1
-

@jAkErCZ O tom, že to nepotvrdil, by se měl dozvědět prostřednictvím chybové hlášky formuláře (nikoliv flashMessage). Vykresluješ chyby toho inputu? Případně chyby na úrovni celého formuláře?

Další otázka je, jestli máš daný formulář v modalu AJAXový či ne, a jak se ti to chová, když se odešle, ale obsahuje chyby (právě třeba kvůli nevyplněné reCAPTCHe).

jAkErCZ
Člen | 321
+
0
-

uestla napsal(a):

@jAkErCZ O tom, že to nepotvrdil, by se měl dozvědět prostřednictvím chybové hlášky formuláře (nikoliv flashMessage). Vykresluješ chyby toho inputu? Případně chyby na úrovni celého formuláře?

Další otázka je, jestli máš daný formulář v modalu AJAXový či ne, a jak se ti to chová, když se odešle, ale obsahuje chyby (právě třeba kvůli nevyplněné reCAPTCHe).

Ono jde o to že ten modal se mi vždy zavře… ale když ho otevřu tak tam vidím u toho že nepotvrdil… ale jak udělat aby se mi to nezavřelo..

uestla
Backer | 783
+
+1
-

@jAkErCZ Tak to asi nebude AJAXové. V takovém případě je dobré mít u modalu podmínku, aby se zobrazil v případě, že je odeslaný formulář, něco jako

<div n:class="modal, $form->isSubmitted() ? show" ...>
revoke
Člen | 36
+
0
-

Funguje někomu invisible recaptcha společně s AJAXem? Mám tento kód:

{form form class => 'ajax'}
    <div n:if="$form->ownErrors" class="alert alert--error"><ul><li n:foreach="$form->ownErrors as $error">{$error}</li></ul></div>

    <div class="js-hide">{input captcha, 'data-size' => 'invisible'}</div>

    <p n:ifcontent>
        <span class="inp__error" n:ifcontent>{$form['captcha']->error}</span>
    </p>

    <p class="text-center">
        <button n:name="send" type="submit" class="btn btn--yellow"><span class="btn__text">{_forms.send}</span></button>
    </p>
{/form}

    <script src="/js/netteForms.min.js"></script>
    <script src="/js/nette.ajax.min.js"></script>
    <script src="https://kesspess.cz/recaptcha/assets/vendor/uestla-recaptcha-control/assets/recaptcha.ajax.js"></script>
    <script n:syntax="off">(function(window,$){$(function(){$.nette.init();});})(window,window.jQuery);</script>

Nedochází k ověření u Google, protože formulář vrací Please prove you're not a robot.
Bez AJAXu (s HTML dle manuálu) mi to ale funguje.

uestla
Backer | 783
+
0
-

@revoke Takhle z hlavy mě napadá, že se formulář nejspíše submitne ještě dřív, než se stačí připnout k requestu ten validation token od reCAPTCHy.

Nešlo by to nějak „předřadit“ a zkombinovat?

Tj. volání ve skriptu invisible reCAPTCHy:
https://github.com/…isible.latte#L46

a navěšení submit handleru v nette.ajax.js:
https://github.com/…ette.ajax.js#L564

Editoval uestla (5. 9. 2018 20:08)