Kontrolka, kde invalidovat snippet?
- Klobás
- Člen | 113
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:
- Proč redrawControl nefunguje v render metodě?
- Je moje řešení validní? Dá se to vyřešit ještě nějak jinak?
- Klobás
- Člen | 113
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)
- David Matějka
- Moderator | 6445
konkretne https://github.com/…etBridge.php#…
plus muzes kouknout na mou prednasku z posoboty: https://www.youtube.com/watch?…