Ako vytvorit extension pre rozšírenie formuláru

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

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
+
0
-

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
+
0
-

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…

CZechBoY
Člen | 3608
+
0
-

A máš soubor s tou třídou někde v dosahu robotloaderu?

Čamo
Člen | 798
+
0
-

Normálne vo vendore ju mám. Nemá to niečo spoločné so súborom autoload.php, ktorý generuje composer? Ja som to tam vytvoril ručne.

Editoval Čamo (2. 11. 2016 23:26)

Čamo
Člen | 798
+
0
-

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
+
0
-

Nechápem. Teraz mi to prejde aj až po

return $form[$name] = new CaptchaControl( $builder->getByType( Nette\Http\Session::class ) );

ale zase sa neviem dostať k session.

Editoval Čamo (3. 11. 2016 2:25)

JZechy
Člen | 161
+
+2
-

Nejjednodušeji to můžeš vyřešit asi takhle.

V tvém případě následovně:

<?php
$init->addBody(
	'\PavelMaca\Captcha\CaptchaControl::register($this->getService(?));',
	$this->getContainerBuilder()->getByType('Nette\Http\Session')
);
?>
Čamo
Člen | 798
+
0
-

JZechy Díky snažím sa to pochopiť, len zatiaľ neúspešne.

Čamo
Člen | 798
+
0
-

JZechy Jo díky funguje to.

Čamo
Člen | 798
+
0
-

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');
}
CZechBoY
Člen | 3608
+
0
-

Vytvoříš Nette\Utils\Callback, nebo vrátíš pole

// Nette\Utils\Callback
return Nette\Utils\Callback::closure($this, 'validateCaptcha');

// nebo pole
return [$this, 'validateCaptcha'];
Čamo
Člen | 798
+
0
-

Ďakujem. Podarilo sa. Mám svoje prvé extension.

Editoval Čamo (4. 11. 2016 18:25)