reCAPTCHA pro Nette\Forms

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

ReCaptchaControl

Použití (jednodušší už to být nemůže :-))

bootstrap.php:

ReCaptchaExtension::register( $configurator );

config.neon:

recaptcha:
	publicKey: '<your_public_key>'
	privateKey: '<your_private_key>'
	methodName: 'addRecaptcha' # optional

Forms:

$form->addReCaptcha('captcha')
		->addRule( Form::VALID, 'Text z obrázku byl špatně opsán.' );

Editoval uestla (1. 10. 2012 11:42)

Filip Procházka
Moderator | 4668
+
+1
-

Ta knihovna od Googlu vypadá, jako kdyby ji psal kůň po lobotomii.

Koukl bych po alternativě a následně z toho udělal composer balíček. Co ty na to?

uestla
Backer | 799
+
0
-

S tím nemám problém, díky.

uestla
Backer | 799
+
0
-

Ani alternativa nebyla moc valná, tak jsem sepsal svoji…

Bohužel nemám čas zprovozňovat Composer, čili uvítám pull request, bude-li někdo ochoten… Díky.

Kryšpin
Člen | 27
+
0
-

Mám problém. ReCaptcha funguje, ale nezobrazuje hlášku „Text z obrázku byl špatně opsán.“.

uestla
Backer | 799
+
0
-

Když špatně opíšeš text… ? Vypisuješ si $form->errors v šabloně?

Jen upřesním, že javascriptová validace není implementova(tel)ná…

Editoval uestla (6. 9. 2012 12:47)

uestla
Backer | 799
+
0
-

Provedl jsem menší update na základě pohnutky,
že static:: je peklíčko, víme (http://www.slideshare.net/…ekce-a-vbec) ;-)

Patřičně jsem aktualizoval úvodní příspěvek.

Filip Procházka
Moderator | 4668
+
0
-

OT: static je zlo pouze v případě, že pracuje se stavem (statická proměnná, statická funkce jiné třídy, která by mohla mít stav). Pokud nic takového neděláš, je statická funkce naprosto v pořádku.

uestla
Backer | 799
+
0
-

<OT>Souhlasím. Tadyhletonc je trošku výjimka v tom, že
prvek reCaptcha závisí na HTTP požadavku a API údajích,
které se jako stav dají chápat.</OT>

Filip Procházka
Moderator | 4668
+
0
-

Zamyslel bych se, jestli by se nevyplatilo napsat CompilerExtension. Jeden řádek kódu vs 10 ti poměrně sníží množství dotazů „nevíš proč mi to nefunguje?“. Navíc bys pak mohl zahodit tu factory class, protože bys mohl dát registraci do initialize.

Editoval HosipLan (1. 10. 2012 0:11)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

https://github.com/…ntrol/pull/1

$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('recaptcha', new ReCaptchaExtension);
};
recaptcha:
	publicKey: ...
	privateKey: ...
	# methodName: addReCaptcha

Editoval vojtech.dobes (1. 10. 2012 9:01)

uestla
Backer | 799
+
0
-

Super, přesně tak jsem si říkal, že bych
to napsal :-)

Díky, Vojto!

Filip Procházka
Moderator | 4668
+
0
-

Ještě bych doplnil

// class ReCaptchaExtension
public static function register($configurator)
{
	$configurator->onCompile[] = function ($configurator, $compiler) {
		$compiler->addExtension('recaptcha', new ReCaptchaExtension);
	};
}

a bude to super ;)

Editoval HosipLan (1. 10. 2012 10:04)

uestla
Backer | 799
+
0
-

Je to tam. :-)

Filip Procházka
Moderator | 4668
+
0
-

Nekomplikuj to tak :)

static function register(Nette\Config\Configurator $configurator, $prefix = 'reCaptcha')
uestla
Backer | 799
+
0
-

Moc se omlouvám .)

Martin Bubík
Člen | 13
+
0
-

Skvela prace, diky…
Jen bych upozornil na drobny bug – v pripade kdyz pouziju $form->addGroup() tak se captcha renderuje spatne. Vypise se 2x – jednou do tabulky formulare a pak jeste jednou do samostatne tabulky pod formularem…
viz. priklad:

<?php
	protected function createComponentRentOrder() {
		$form = new Form();
		$form->addGroup("Rezervace fotoateléru");
		$form->addText('client', 'Jméno a příjmení', 30, 30)
				->setRequired('Zadejte jméno.');
		$form->addText('email', 'Email', 30, 40)
				->setRequired('Zadejte email.');
		$form->addText('phone', 'Telefon', 30, 9)
				->setRequired('Zadejte %label.');
		$form->addReCaptcha('captcha')
				->addRule(Form::VALID, 'Text z obrázku byl špatně opsán.');
		$form->addSubmit('login', 'Odeslat objednávku');
		$form->onSuccess[] = callback($this, 'submitRentOrder');
		return $form;
	}
?>

vygeneruje tohle:

<form action="/test?do=rentOrder-submit" method="post" id="frm-rentOrder">

<fieldset>
<legend>Rezervace fotoateléru</legend>

<table>
<tr class="required">
	<th><label class="required" for="frmrentOrder-client">Jméno a příjmení</label></th>

	<td><input type="text" size="30" maxlength="30" class="text" name="client" id="frmrentOrder-client" required="required" data-nette-rules="{op:':filled',msg:&quot;Zadejte jm\u00e9no.&quot;}" value="" /></td>
</tr>

<tr class="required">
	<th><label class="required" for="frmrentOrder-email">Email</label></th>

	<td><input type="text" size="30" maxlength="40" class="text" name="email" id="frmrentOrder-email" required="required" data-nette-rules="{op:':filled',msg:'Zadejte email.'}" value="" /></td>
</tr>

<tr class="required">
	<th><label class="required" for="frmrentOrder-phone">Telefon</label></th>

	<td><input type="text" size="30" maxlength="9" class="text" name="phone" id="frmrentOrder-phone" required="required" data-nette-rules="{op:':filled',msg:'Zadejte Telefon.'}" value="" /></td>
</tr>

<tr>
	<th><label for="frmrentOrder-captcha"></label></th>

	<td><script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld5R9gSAAAAAJE7zsMj0_rYwt8Y77Vtvw2mxqii"></script><noscript><iframe src="http://www.google.com/recaptcha/api/noscript?k=6Ld5R9gSAAAAAJE7zsMj0_rYwt8Y77Vtvw2mxqii" width="500" height="300" frameborder="0"></iframe><br /><textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea><input type="hidden" name="recaptcha_response_field" value="manual_challenge" /></noscript></td>
</tr>

<tr>
	<th>&nbsp;</th>

	<td><input type="submit" class="button" name="login" id="frmrentOrder-login" value="Odeslat objednávku" /></td>
</tr>
</table>
</fieldset>

<table>
<tr>
	<th><label for="frmrentOrder-captcha"></label></th>

	<td><script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld5R9gSAAAAAJE7zsMj0_rYwt8Y77Vtvw2mxqii"></script><noscript><iframe src="http://www.google.com/recaptcha/api/noscript?k=6Ld5R9gSAAAAAJE7zsMj0_rYwt8Y77Vtvw2mxqii" width="500" height="300" frameborder="0"></iframe><br /><textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea><input type="hidden" name="recaptcha_response_field" value="manual_challenge" /></noscript></td>
</tr>
</table>

</form>

Editoval Martin Bubík (27. 10. 2012 13:37)

Martin Bubík
Člen | 13
+
0
-

a jeste jeden detail…
Zkusil jsem, jak bude vypadat verze bez javascriptu a je to necitelne – cestina je rozhozena, ale to nevim jeslti jde nejak ovlivnit.

uestla
Backer | 799
+
0
-

Děkuji za hlášení.

Vícenásobné vykreslování jsem vyřešil, bohužel kódování
vypadá jako problém reCaptchy