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 | 283
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 | 1274
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 | 1032
@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 | 1274
@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)