reCAPTCHA pro Nette\Forms

uestla
Člen | 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
Člen | 799
+
0
-

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

uestla
Člen | 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
Člen | 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
Člen | 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
Člen | 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š
Nette 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
Člen | 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
Člen | 799
+
0
-

Je to tam. :-)

Filip Procházka
Moderator | 4668
+
0
-

Nekomplikuj to tak :)

static function register(Nette\Config\Configurator $configurator, $prefix = 'reCaptcha')
uestla
Člen | 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
Člen | 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

RSS tématu Téma zavřeno