reCAPTCHA pro Nette\Forms

- uestla
- Backer | 799
ReCaptchaControl
Použití (jednodušší už to být nemůže :-))
- pro získání public a private API key je nutné vytvořit účet na https://www.google.com/…admin/create
- zaregistrování provedeme pomocí extenze konfigu (díky @HosipLan za tip a @vojtech.dobes za pullík):
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
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
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
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
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)

- Filip Procházka
- Moderator | 4668
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)

- Filip Procházka
- Moderator | 4668
Nekomplikuj to tak :)
static function register(Nette\Config\Configurator $configurator, $prefix = 'reCaptcha')

- Martin Bubík
- Člen | 13
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:"Zadejte jm\u00e9no."}" 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> </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
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.