Formulář v komponentě, zachování parametrů (ekvivalent action metody presenteru?)

sd
Člen | 87
+
0
-

Ahoj,

řeším problém, kdy mám komponentu, která mi vypisuje seznam objednávek. Vzhledem k tomu, že tento výpis se používá na více místech + je na jedné stránce vícekrát v různých variantách (dle typu obj.), tak se data tahají variabilně v komponentě, kde mám formuláře na filtrování.

Filtrování řeším signálem, kdy si nastavím perzistentní parametr status. Jenže po odeslání formuláře dojde k přesměrování bez signálu.

Problém je v tom, že po odeslání formuláře se mi tam dostává $defaultStatus z presenteru. Přesměruje se totiž na URL bez signálu.
Kdybych seznam načítal v presenteru a měl persistentní parametr pro status filtr tam, tak by stačilo fetování dat do action metody presenteru, ale v komponentě nevím, že by nějaký ekvivalent byl? Jak bych toto měl správně vyřešit?

Zkoušel jsem třeba i předat aktuální filtr status do formuláře a vrátit si ho v callbacku, poté přesměrovat na signál. Nicméně bez úspěchu.

V presenteru

/**
* @persistent(ordersList)
*/

také nepomohlo

final class OrdersList extends BaseControl
{
    /** @var string @persistent */
    private $type; // typ objednávky..

	/** @var int @persistent */
    private $status;

	/** @var array */
    private $orders;

	/** @var OrdersRepository */
	private $ordersRepository;

	public function __construct(string $type = '...', int $defaultStatus = null,
                                OrdersRepository $ordersRepository, ActionsFormFactory $actionsFF)
    {
        parent::__construct();
        $this->type                 = $type;
        $this->status               = $defaultStatus ? $defaultStatus : -1;

        $this->ordersRepository     = $ordersRepository;
        $this->actionsFF = $actionsFF;

		$this->orders = $this->loadOrders($this->status);
    }

    protected function createComponentActionsForm(): \Nette\Forms\Form
    {
        return $this->actionsFF->create(function (int $count): void {

			$this->presenter->flashMessage("Akci ovlivněno $count objednávek");

        }, $this->orders);
    }

	public function render(): void
    {
        $this->template->bookings = $this->bookings = $this->loadOrders($this->status);

        $this->template->setFile(__DIR__ . '/default.latte');
        $this->template->render();
    }

	public function handleFilterStatus(int $status): void
    {
        $this->status = $status;
    }

Díky moc.

Editoval sd (20. 9. 2021 18:04)

Marek Bartoš
Nette Blogger | 1146
+
+2
-

Skoro jsi to trefil. Jen persistentní parametry (stejně jako inject) musí být public.

sd
Člen | 87
+
0
-

@MarekBartoš Aj, nojo, jsem pako. Díky moc!