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

- Václav Kraus
 - Člen | 77
 
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 | 285
 
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 | 1313
 
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
 
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 | 1034
 
@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 | 1313
 
@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
 
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)