Redirect z formuláře v komonentě

Ages
Člen | 128
+
0
-

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

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)

Ages
Člen | 128
+
0
-

@Polki Díky moc!
Tento formulář by měl být přístupný napříč celou aplikací tak by to zde snad nemělo vadit.

Milo
Nette Core | 1283
+
+8
-

@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;
}
Ages
Člen | 128
+
0
-

@Milo díky za typ!