Zabezpečení formuláře pomocí Captchy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
.:M@rt!n:.
Člen | 201
+
0
-

Ahoj,
na webu mám udělanou diskuzi formou klasického formuláře převedeného do AJAXu. Chtěl bych to zabezpečit captchou, ale bohužel se mě to zatím nedaří. Jedu podle návodu z doplňků . Nevím zda mám správně vytvořenou componentu s captchou, ale laděnka hlásí chybu: Call to undefined method Nette\Application\UI\Form::addCaptcha(). Komponenta pro diskuzi vypadá takto:

protected function createComponentDiskuzeForm() {
        $form = new Form($this, 'captcha');
        class_exists('Captcha');
        $presenter = $this;

        $form->addText('autor', 'Jméno: ', 20, 40)
                ->addRule(Form::FILLED, 'Je nutné vyplnit políčko pro jméno.');
        $form->addTextArea('text', 'Text: ', 60)
                ->addRule(Form::FILLED, 'Je nutné vyplnit políčko pro text.');

        $form->addCaptcha('captcha', 'Antispam')
                ->setTextColor(Image::rgb(255, 0, 0))
                ->addRule('Captcha::validateValid', 'Opište správně písmena z obrázku.');



        $form->addSubmit('save', 'Odeslat')->setAttribute('class', 'default');
        $form->addSubmit('cancel', 'Zrušit')
                        ->setValidationScope(FALSE)
                ->onClick[] = function () use ($presenter) {
                    $presenter->redirect('default');
                };

        $form->onSuccess[] = callback($this, 'diskuzeFormSubmitted');
        $form->addProtection('Vypršel časový limit, odešlete formulář znovu.'); //Obrana před Cross-Site Request Forgery (CSRF)

        return $form;
    }

Díky za rady

frosty22
Člen | 373
+
0
-

Podle oné hlášky není ona komponenta zaregistrovaná ve formuláři, díval jsem se na onu dokumentaci v doplňcích a též tam není zmínka o registraci, čili předpokládám, že asi existuje i nějaká magická registrace komponent (či spíše dříve existovala).

Zkus zaregistrovat onu komponentu takto, např. ve startupu (či kdekoliv jinde před vytvářením instance formuláře):

<?php
\Nette\Forms\Form::extensionMethod('addCaptcha', callback(new Captcha, "addCaptcha"));
?>
vvoody
Člen | 910
+
0
-

Ta registracia je na konci suboru Captcha.php

FormContainer::extensionMethod('addCaptcha', array('Captcha', 'addCaptcha'));

Zeby autor scripitu predpokladal ze sa subor includne?

.:M@rt!n:.
Člen | 201
+
0
-

Mám aplikaci rozdělenou na front a admin modul a při zaregistrování komponenty vyskočí nová hláška:

Class 'FrontModule\Captcha' not found
vvoody
Člen | 910
+
0
-

Ak pridas lomitko?

<?php
\Nette\Forms\Form::extensionMethod('addCaptcha', callback(new \Captcha, "addCaptcha"));
?>
.:M@rt!n:.
Člen | 201
+
0
-

tak jenom:

Class 'Captcha' not found
vvoody
Člen | 910
+
0
-

Mas ten subor Captcha.php pod adresarmi ktore prehladava RobotLoader?

.:M@rt!n:.
Člen | 201
+
0
-

Mám ho umístěný ve složce libs

vvoody
Člen | 910
+
0
-

Tak uz neviem. Dumpni si RobotLoadera a pozri ci tam ta trieda je.

$rl = $configurator->createRobotLoader()
	->addDirectory(APP_DIR)
	->addDirectory(LIBS_DIR)
	->register();

dump($rl);
die();

Editoval vvoody (20. 7. 2012 18:10)

.:M@rt!n:.
Člen | 201
+
0
-

tak jsem to zkusil v bootstrapu takhle, ale žádná změna:

require LIBS_DIR . '/Nette.Extras/Captcha.php';
frosty22
Člen | 373
+
0
-

To je blbost, tohle by muselo onen soubor requireovat a nebo vyhodit hlášku o neexistenci souboru, čili pokud tohle projde a ten soubor obsahuje onu třídu Captcha, potom:

new \Captcha.. nemůže vrátit chybu o neexistenci třídy. To již opravdu musí být chyba jinde.