Po odeslání formuláře se neprovede onSuccess

Václav Kraus
Člen | 77
+
0
-

Ahoj,

narazil jsem na problém a jsem z něj celkem zmatený.

Mám formulář:

<?php
final class SignInFormFactory
{
	use Nette\SmartObject;

	/** @var FormFactory */
	private $factory;

	/** @var User */
	private $user;


	public function __construct(FormFactory $factory, User $user)
	{
		$this->factory = $factory;
		$this->user = $user;
	}


	public function create(callable $onSuccess): Form
	{
		$form = $this->factory->create();
		$form->addText('username', 'Username:')->setHtmlAttribute('placeholder', 'Uživatelské jméno')
			->setRequired('Please enter your username.');

		$form->addPassword('password', 'Password:')->setHtmlAttribute('placeholder', 'Heslo')
			->setRequired('Please enter your password.');

		$form->addCheckbox('remember', 'Keep me signed in');

		$form->addSubmit('send', 'Sign in');

		$form->onSuccess[] = function (Form $form, \stdClass $values) use ($onSuccess): void {
			dump('ahoj!');
		};

		return $form;
	}
}
?>

V presenteru vyrobím komponentu…

<?php

final class SignPresenter extends BasePresenter
{
	/** @persistent */
	public $backlink = '';

	/** @var Forms\SignInFormFactory */
	private $signInFactory;

	/** @var Forms\SignUpFormFactory */
	private $signUpFactory;


	public function __construct(Forms\SignInFormFactory $signInFactory, Forms\SignUpFormFactory $signUpFactory)
	{
		$this->signInFactory = $signInFactory;
		$this->signUpFactory = $signUpFactory;
	}

	protected function beforeRender()
	{
		$this->setLayout(__DIR__ . '/templates/@sign.latte');
		parent::beforeRender();
	}


	/**
	 * Sign-in form factory.
	 */
	protected function createComponentSignInForm(): Form
	{
		return $this->signInFactory->create(function (): void {
			$this->restoreRequest($this->backlink);
			$this->redirect('Homepage:');
		});
	}

?>

A tu vykreslím v šabloně…

<?php

{control signInForm}

?>

Až po tuto část je vše v pořádku. Problém nastane až po odeslání formuláře. Po odeslání dojde k redirectu zpět na formulář
https://ibb.co/DbDv3GR
ale nedojde k onSuccess. Formulář ani nevyhodí žádné chyby. Tracy také nic. Používám poslední verzi nette/sandbox.

Nesetkal jste se s tím někdo? 🤔

Editoval Václav Kraus (23. 8. 2019 13:26)

BigCharlie
Člen | 283
+
+1
-

napadají mě dvě věci:

  • co přesně dělá ta factory $form = $this->factory->create()), nedává něco do onSuccess?
  • co se stane, když místo dumpu vyhodíš výjimku?
Marek Bartoš
Nette Blogger | 1146
+
0
-

Chyba se ti nemusí vypsat pokud uděláš chybu v šabloně. Ale podle toho co popisuješ – nezapomněl jsi ten dump přepsat na volání callbacku, co si předáváš z presenteru? dump se narozdíl od bdump vypisuje do stránky, ne do debuggeru, snadno se přehlédne.

Václav Kraus
Člen | 77
+
0
-

Děkuju za odpovědi!

@BigCharlie $this->factory->create(); dělá toto

<?php

final class FormFactory
{
	use Nette\SmartObject;

	public function create(): Form
	{
		$form = new Form;
		return $form;
	}
}
?>

Je to přesně to, co je v nette/sandbox. Proto moc nerozumím tomu, proč to nefunguje. Je to celé vlastně jen sandbox s pár balíčky navíc..

<?php

{
	...
	],
	"require": {
		"php": ">=7.1",
		"nette/application": "^3.0",
		"nette/bootstrap": "^3.0",
		"nette/caching": "^3.0",
		"nette/di": "^3.0",
		"nette/finder": "^2.5",
		"nette/forms": "^3.0",
		"nette/http": "^3.0",
		"nette/mail": "^3.0",
		"nette/robot-loader": "^3.0",
		"nette/safe-stream": "^2.4",
		"nette/security": "^3.0",
		"nette/utils": "^3.0",
		"latte/latte": "^2.5",
		"tracy/tracy": "^2.6",
		"nextras/orm": "^3.1",
		"nextras/migrations": "^3.1",
		"contributte/console": "^0.7.1",
		"nette/tester": "^2.3",
		"contributte/console-extra": "dev-master"
	},
	"require-dev": {
	},
	"autoload": {
		"classmap": ["app/Bootstrap.php"]
	},
	"minimum-stability": "stable",
	"config": {
		"platform": {
			"php": "7.2"
		}
	}
}
?>

common.neon

<?php

parameters:


application:
	errorPresenter: Error
	mapping:
		*: App\*Module\Presenters\*Presenter


session:
	expiration: 14 days

extensions:
    nextras.orm: Nextras\Orm\Bridges\NetteDI\OrmExtension
    console: Contributte\Console\DI\ConsoleExtension(%consoleMode%)
    console.cache: Contributte\Console\Extra\DI\CacheConsoleExtension
    console.router: Contributte\Console\Extra\DI\RouterConsoleExtension
    console.security: Contributte\Console\Extra\DI\SecurityConsoleExtension
    console.utils: Contributte\Console\Extra\DI\UtilsConsoleExtension
    nextras.dbal: Nextras\Dbal\Bridges\NetteDI\DbalExtension
    nextras.migrations: Nextras\Migrations\Bridges\NetteDI\MigrationsExtension

nextras.orm:
    model: App\Orm\Orm

console:
    name: app
    version: 'dev'
    catchExceptions: true
    autoExit: true
    url: http://application.loc
    lazy: false

nextras.migrations:
	dir: %appDir%/../migrations
	driver: mysql
	dbal: nextras
	withDummyData: %debugMode%


services:
	- App\Model\Facade\UsersFacade
	- App\Model\UserManager
	- App\Forms\FormFactory
	- App\Forms\SignInFormFactory
	- App\Forms\SignUpFormFactory
	router: App\Router\RouterFactory::createRouter

?>

v local.neon je už jen konfigurace přípojení nextras/dbal

@Mabar vyměnil jsem dump za bdump ale výsledek je stejný.

Jinak „Ale podle toho co popisuješ – nezapomněl jsi ten dump přepsat na volání callbacku, co si předáváš z presenteru“ moc se omlouvám, ale upřímně netuším, jak to myslíš :)

jiri.pudil
Nette Blogger | 1028
+
+1
-

@VáclavKraus new Form je Nette\Application\UI\Form, nebo Nette\Forms\Form? Aby se formulář po odeslání v presenteru zpracoval automaticky, musí to být ten první.

Marek Bartoš
Nette Blogger | 1146
+
+1
-

@VáclavKraus

Tady si předáváš callback

protected function createComponentSignInForm(): Form
{
    return $this->signInFactory->create(function (): void {
        $this->restoreRequest($this->backlink);
        $this->redirect('Homepage:');
    });
}

A předáváš si ho až sem

$form->onSuccess[] = function (Form $form, \stdClass $values) use ($onSuccess): void {
    dump('ahoj!');
};

Ale pak ho už nevoláš. Musíš přidat $onSuccess()

Václav Kraus
Člen | 77
+
0
-

Ahoj,

děkuji za reakce. Nakonec je problém trochu jinde. Zlobí to jen v případě, že aplikaci spustím v dockeru. Pokud ji pustím přes php server (https://www.php.net/…ebserver.php), tak to funguje dobře.

Budu hledat dál. vypadá to, že mám problém s ukládáním session v containeru.

Editoval Václav Kraus (13. 9. 2019 10:41)