Redirect z formuláře v komonentě
- Ages
- Člen | 128
Ahoj, snažím se udělat redirect ve formuláři v komponentě a vyhazuje
mi to chybu:
Component name must be non-empty alphanumeric string, '' given.
Nějak jsem vůbec z té hlášky nepochopil co by mohlo být špatně.
// Zde je kód
declare(strict_types=1);
namespace App\Components;
use Nette\Application\UI;
use Nette\Application\UI\Form;
class Navbar extends UI\Control
{
private $redactor = FALSE;
public function setParameters(bool $redactor) {
$this->redactor = $redactor;
}
public function render(): void {
$this->template->redactor = $this->redactor;
$this->template->render(__DIR__ . '/Navbar.latte');
}
protected function createComponentSearchForm(): Form {
$form = new Form;
$form->addText('search', 'Hledat:')
->setRequired('Hledat.');
$form->addSubmit('send', 'Uložit');
$form->onSuccess[] = [$this, 'searchFormSucceeded'];
return $form;
}
public function searchFormSucceeded(Form $form, $values): void {
$this->redirect(':Shop:Search:');
}
}
interface INavbarFactory
{
public function create(): Navbar;
}
- Polki
- Člen | 553
Ahoj, redirect v komponentě funguje trochu jinak, než redirect z preseteru.
Zkus ten redirect řádek změnit na:
$this->getPresenter()->redirect(':Shop:Search:');
EDIT 1: Jo a taky BestPractise není redirectovat takto natvrdo z komponenty, ale z presenteru si předat do komponenty/formuláře callback a redirectovat v presenteru, aby jsi měl tu komponentu/formulář opravdu znovupoužitelný a ne, aby byl redirectem vázaný na daný presenter.
Editoval Polki (7. 10. 2019 22:03)
- Milo
- Nette Core | 1283
@Ages Na komponentě si vytvoř událost a vyvolej jí, až bude potřeba. Například:
class Navbar extends UI\Control
{
/** @var callable[] */
public $onSuccess = [];
public function searchFormSucceeded()
{
# ... něco uděláš, zpracuješ data
# a vyvoláš událost
$this->onSuccess();
}
}
Tím máš komponentu odizolovanou. A potom, když komponentu použiješ, například z prezenteru, navěsíš si na událost callback.
public function createComponentNavbar(): Navbar
{
$navbar = new Navbar();
$navbar->onSuccess[] = function () {
$this->redirect(...);
};
return $navbar;
}