Ako vytvorit extension pre rozšírenie formuláru
- Čamo
- Člen | 798
Zdravím,
prosím vás môže mi niekto pomôcť s vytvorením extension. Potrebujem
v podstate pridať do formulárov rozšírenie pre captchu.
Začal som podľa dokumentácie takto:
<?php
namespace Test\Captcha;
use Nette;
use Nette\DI\CompilerExtension;
use Nette\Forms\Container as FormContainer;
class Extension extends CompilerExtension
{
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$config = $this->getConfig($this->getDefaultConfig());
$builder->addDefinition( $this->prefix( 'captcha' ) )
->setClass( 'PavelMaca\Captcha\CaptchaControl', [ '@session' ] );
FormContainer::extensionMethod('addCaptcha', function ( FormContainer $form, $name ) use ( $builder )
{
return $form[$name] = new CaptchaControl( $builder->getByType( Nette\Http\Session::class ) );
});
}
public function afterCompile(Nette\PhpGenerator\ClassType $class)
{
}
}
No ale ladenka hneď na mňa že „Class ‚Test\Captcha\Extension‘ not found“ Nechápem, čo mám zle.
- CZechBoY
- Člen | 3608
Tak zkus něco aktuálnějšího a udržovanýho, třeba https://componette.org/…o/recaptcha/
nebo se můžeš inspirovat jen extension: https://github.com/…xtension.php
Editoval CZechBoY (2. 11. 2016 22:49)
- Čamo
- Člen | 798
No z tej recaptche som nenadobudol dobrý dojem ked som tak zbežne
prečítal https://forum.nette.org/…ro-formulare?p=2
A táto captcha funguje perfektne, len by som to chcel urobiť ako
extension.
Ten error vôbec nechápem. Však tú triedu som sem skopíroval…
- Čamo
- Člen | 798
Tak som si urobil fork a z neho chcem urobiť extension. Upravil som to pre composer.
"repositories": [
{
"type": "git",
"url": "https://github.com/camohub/CaptchaControl.git"
}
],
"require": {
"camohub/CaptchaControl": "@dev"
}
Teraz sa to už začne načítavať, ale vyhodí:
Call to undefined method Nette\Application\UI\Form::addCaptcha().
Vlastne sa nevykoná FormContainer::extensionMethod() v triede Extension:
<?php
namespace Test\Captcha;
use Nette;
use Nette\DI\CompilerExtension;
use Nette\Forms\Container as FormContainer;
class Extension extends CompilerExtension
{
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$config = $this->getConfig($this->getDefaultConfig());
}
public function afterCompile( Nette\PhpGenerator\ClassType $class )
{
$builder = $this->getContainerBuilder();
FormContainer::extensionMethod('addCaptcha', function ( FormContainer $form, $name ) use ( $builder )
{
return $form[$name] = new CaptchaControl( $builder->getByType( Nette\Http\Session::class ) );
});
}
public function getDefaultConfig()
{
return [];
}
}
Vie mi niekto povedať čo robím zle?
Editoval Čamo (3. 11. 2016 1:12)
- Čamo
- Člen | 798
Mohli by ste mi ešte poradiť ako vyriešiť exception: „Call to undefined
function Test\Captcha\callback()“
Vo formulári sa volá getValidator()
$form->addCaptcha('captcha', 'Captcha: ')
->setRequired('Ty jeden hnusny robot co tu chces?')
->addRule($form["captcha"]->getValidator(), 'Text z obrázku je nesprávny.')
a v komponente CaptchaControl je to zapísané ako
/**
* @return Nette\Callback
*/
public function getValidator()
{
return callback($this, 'validateCaptcha');
}