Znovunačtení dat v komponentě po ajaxovém signálu komponenty

kajinek32
Člen | 31
+
0
-

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

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

Kamil Valenta napsal(a):

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?

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

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

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!