Kontrolka, kde invalidovat snippet?

Klobás
Člen | 113
+
0
-

Ahoj, rád bych se zeptal zkušenějších na následující:

Mám jednoduchou komponentu, která přebírá data a ty stránkuje.
Stránkování je ajaxové a já bych rád věděl, kam narvat redrawControl, protože v metodě render to nefunguje. Proč vlatně ne?
Kontrolka nemá žádný handle, visual paginator si stránkuje sám, takže kam to dát?

První pokus

<?php
class ContentPaginatorControl extends Control
{
    private $data;
    private $templateFile;

    public function createComponentPaginator()
	{
        $paginator =  new VisualPaginator;
        return $paginator;
    }


    public function render()
    {

		if ($this->presenter->isAjax())
			$this->redrawControl();

        $this->template->total = $this->data->count("*");

        // paginator
        $vp                      = $this['paginator'];
        $paginator               = $vp->getPaginator();
        $paginator->itemsPerPage = 3;
        $paginator->itemCount    = $this->template->total;

        // selection, ted uz s limitem, proto z novu ten stejny dotaz
        $selection = $this->data;
		$selection->limit($paginator->itemsPerPage, $paginator->offset);

        $this->template->data = $this->data;
        $this->template->setFile(__DIR__ . '/../templates/components/'.$this->templateFile);
        $this->template->render();


    }

?>

Pak mě napadlo upravit visual paginator takto

<?php
	/**
	 * Loads state informations.
	 * @param  array
	 * @return void
	 */
	public function loadState(array $params): void
	{
		parent::loadState($params);
        $this->getPaginator()->page = $this->page;
        $this->onHandlePage($this, $this->page); // PŘIDAL JSEM VLASTNÍ EVENT
	}

?>

a kontrolku upravil takto

<?php
class ContentPaginatorControl extends Control
{
    private $data;
    private $templateFile;

    public function createComponentPaginator()
	{
        $paginator =  new VisualPaginator;
        $paginator->onHandlePage[] = function ($paginator, $page) {
            // kdyz se provede ajaxovy pozadavek, prekreslit vsechny snippety na strance
            if ($this->presenter->isAjax())
            {
                $this->redrawControl();
            }
        };



        return $paginator;
    }
?>

a konečně to funguje.

Moje 2 otázky:

  1. Proč redrawControl nefunguje v render metodě?
  2. Je moje řešení validní? Dá se to vyřešit ještě nějak jinak?
Martk
Člen | 651
+
0
-

V render metodě už je pozdě, respektive se vůbec nezavolá render metoda. Správně by to mělo být takhle:

$paginator =  new VisualPaginator;
$paginator->onPaginate[] = function (): void {
	$this->redrawControl();
};
return $paginator;
Klobás
Člen | 113
+
0
-

Martk napsal(a):

V render metodě už je pozdě, respektive se vůbec nezavolá render metoda. Správně by to mělo být takhle:

$paginator =  new VisualPaginator;
$paginator->onPaginate[] = function (): void {
	$this->redrawControl();
};
return $paginator;

Jak to, že se nezavolá? Koukal jsem co dělá redraw control a nějak interně si plní proměnnou snippets a o ukončení běhu a vyrenderovaní tam nic není nebo jsem hledal špatně.

Mám nějakou starší verzi VP a vůbec tam event onPaginate není. A kontrola na isAjax (z Presenteru) není potřeba?

A kdybych neměl možnost eventu, jak to jde v tomto konkrétním případě udělat? Nějak nasimulovat handle nebo co?

Editoval Klobás (14. 2. 2020 20:48)

Ondřej Kubíček
Člen | 494
+
0
-

a který visual paginator to máš?

Klobás
Člen | 113
+
0
-

@OndřejKubíček Nějaký starý, ale o to ted už tolik nejde.
Zajímá mne proč redrawControl nefunguje v render metodě komponenty a kdybych nemohl použít handle jestli existuje ještě nějaké jiné řešení.

Díky.

MajklNajt
Člen | 470
+
0
-

@Klobás už ti predsa odpovedal Martk – k volaniu render metódy vôbec nedôjde, pretože tá sa volá iba ak je komponenta invalidovaná – čiže pomocou redrawControl() v handle alebo ju môžeš invalidovať zvonku

Klobás
Člen | 113
+
0
-

@MajklNajt ano, ale to vysvětlení mi technicky nestačilo, nemůžeš mi prosím ukázat (odkázat) na konkrétní kód v nette (link + řádek), ať to chování líp pochopím? Hledal jsem v UI\Presenter → run atd, ale nevím jestli to je ono.

David Matějka
Moderator | 6445
+
+1
-

konkretne https://github.com/…etBridge.php#…

plus muzes kouknout na mou prednasku z posoboty: https://www.youtube.com/watch?…

Klobás
Člen | 113
+
+1
-

@DavidMatějka Díky, tohle už chápu a přednáška super!