Formulář v komponentě, zachování parametrů (ekvivalent action metody presenteru?)
- sd
- Člen | 87
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 | 1274
Skoro jsi to trefil. Jen persistentní parametry (stejně jako inject) musí být public.