Znovunačtení dat v komponentě po ajaxovém signálu komponenty
- kajinek32
- Člen | 35
Ahoj,
mám komponentu se seznamem objednávek.
class OrdersListComponent extends Control
{
private $orders;
private $orderModel;
public function __construct(\OrderModel $orderModel)
{
$this->orderModel = $orderModel;
}
public function setOrders($orders)
{
$this->orders = $orders;
return $this;
}
public function render(): void
{
$this->template->orders = $this->orders;
// Render
$this->template->render(__DIR__ . '/template.latte');
}
public function handleAccept($orderId)
{
$this->orderModel->setOrderAccepted($orderId, $this->presenter->getUser()->id); // update v databázi, odsouhlasí objednávku
if ($this->presenter->isAjax()) {
$this->redrawControl('ordersList');
$this->template->orders = $this->orders; // tady mi to načítá "stará" data
} else {
$this->presenter->redirect('this');
}
}
V Presenteru si tu komponentu vytvářím a posílám jí přes setOrders() data – ActiveRows jednotlivých objednávek.
public function actionDefault()
{
$orders = $this->orderModel->getCurrentOrders($this->getUser()->id);
$this->orders = $orders;
}
protected function createComponentOrdersList($name)
{
return $this->ordersListComponentFactory->create()->setOrders($this->orders);
}
v template komponenty to mám takto:
{snippet ordersList}
{foreach $orders as $order}
{$order->name} <a n:href="accept! $order->id" class="btn btn-sm btn-warning ajax">Přijmout objednávku</a>
{/foreach}
{/snippet}
Ta komponenta má signál handleAccept, kterým akceptuji objednávku. V tu chvíli se mají změnit data (udělám nějaký update), a po redrawControl bych očekával, že to načte komponentu s novými daty, což ale funguje jen bez Ajaxu, kdy se refreshne vše, a načtou se tedy nový data. Je mi jasné, že potřebuju nějak načíst data znovu – zkoušel jsem dát načtení v presenteru do jiných metod, než actionDefault (startup, beforeRender apod.), ale to mi nepomohlo.
Poradíte prosím, jak jednoduše při redrawControl znovu načíst data?
Koukal jsem na podobné příspěvky v diskusi, ale z odpovědí nejsem
moudrý.
P.S. – to přiřazení setOrders musím dělat v presenteru, protože si chci vytvořit těch komponent víc, s různými objednávkami v různém stavu (proto nepřipadá v úvahu, abych si ta data načítal až v komponentě)
Editoval kajinek32 (19. 3. 2021 23:30)
- Kamil Valenta
- Člen | 822
Handle se vykonává až po action, proto v té actionDefault seháš
ještě na neupdatovaná data.
Nechceš si
public function actionDefault()
{
$orders = $this->orderModel->getCurrentOrders($this->getUser()->id);
$this->orders = $orders;
}
přesunout do beforeRender?
- kajinek32
- Člen | 35
Kamil Valenta napsal(a):
Handle se vykonává až po action, proto v té actionDefault seháš ještě na neupdatovaná data.
Nechceš sipublic function actionDefault() { $orders = $this->orderModel->getCurrentOrders($this->getUser()->id); $this->orders = $orders; }
přesunout do beforeRender?
Děkuju, to jsem už zkoušel, ale pak mi to po tom redrawControl spadne na tom, že $orders v template komponenty neexistuje
Editoval kajinek32 (19. 3. 2021 23:59)
- Kamil Valenta
- Člen | 822
A voláš tam ten setOrders()?
A nebo, pokud presenter dodává data pro komponentu a stejně už je s ní
svázaný, dalo by se na ta data sahat ven rovnou.
if ($this->presenter->isAjax()) {
$this->template->orders = $this->presenter->orders;
$this->redrawControl('ordersList');
} else {
$this->presenter->redirect('this');
}
- kajinek32
- Člen | 35
Kamil Valenta napsal(a):
A voláš tam ten setOrders()?
A nebo, pokud presenter dodává data pro komponentu a stejně už je s ní svázaný, dalo by se na ta data sahat ven rovnou.if ($this->presenter->isAjax()) { $this->template->orders = $this->presenter->orders; $this->redrawControl('ordersList'); } else { $this->presenter->redirect('this'); }
Ha, v tom beforeRender jsem ten setOrders nevolal, ten byl jen při vytvoření komponenty v createComponentOrdersList.
Upravil jsem to tak, aby v beforeRender to volalo
$this['ordersList']->setOrders($this->orders);
A funguje! Díky!