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.