VisualPaginator – nefunguje :/
- muflix
- Člen | 92
Ahoj, snažim se rozchodit stránkování, ale bohužel mi to nějak
nejde..
hodně se to tu řešilo i jsou nějaké návody
https://componette.org/search/?…
https://pla.nette.org/…ivajici-ajax
https://forum.nette.org/…al-paginator
https://forum.nette.org/…ocet-novinek
jenže příde mi to co člověk to vlastní řešení, nicméně sem skusil řešení, které se mi zdálo dobrý.
prvně se snažim jít cestou Modelu, tj třída /app/models/Novinky.php
public function getAll($offset, $limit)
{
return $this->db->fetchAll('SELECT * FROM novinky')->offsetSet($offset, $limit);
}
public function countNovinky()
{
return $this->db->fetchSingle("SELECT COUNT(*) FROM novinky");
}
potom Presenter /app/presenters/HomepagePresenter.php
public function renderNovinky()
{
$vp = new VisualPaginator($this, 'paginator');
$vp->paginator->itemsPerPage = 5;
$vp->paginator->itemCount = $this->novinky->countNovinky();
$rows = $this->novinky->getAll($vp->offset, $vp->itemsPerPage);
$this->template->rows = $rows;
}
a Šablona /app/templates/Homepage/novinky.latte
{block content}
Novinky
<table>
{foreach $rows as $row}
<tr>
<td>{$row->id}</td>
<td>{$row->perex}</td>
<td>{$row->text}</td>
<td>{$row->datum_vlozeni}</td>
</tr>
{/foreach}
</table>
{control paginator}
a Error, který mi to hází (‚Cannot read an undeclared property VisualPaginator::$offset‘)
do /app/components/VisualPaginator/VisualPaginator.php jsem přidal
use Nette\Application\UI\Control;
use Nette\Utils\Paginator;
aby mi to fungovalo i v novym Nette
prosim polopatě :D předem děkuji
- iguana007
- Člen | 970
Zkus ten render v presenteru přepsat takto:
public function renderNovinky() {
$vp = new VisualPaginator($this, 'paginator');
$paginator = $vp->getPaginator();
$paginator->itemsPerPage = 5;
$paginator->itemCount = $this->novinky->countNovinky();
$rows = $this->novinky->getAll($paginator->offset, $paginator->itemsPerPage);
$this->template->rows = $rows;
}
- petr.jirous
- Člen | 128
$rows = $this->novinky->getAll($vp->offset, $vp->itemsPerPage);
musíš tam mít
$vp->paginator->offset a $vp->paginator->itemsPerPage
- n.u.r.v.
- Člen | 485
Ahoj, také se snažím zprovoznit ten VisualPaginator, ale nějak mi to nejde:
- Stáhl jsem si VP a dal do složky v mém projektu: libs/Paginator/VisualPaginator.php
- v presenteru jsem udělal metodu renderManage:
public function renderManage() {
$vp = new VisualPaginator($this, 'vp');
$paginator = $vp->getPaginator();
$paginator->itemsPerPage = 10;
$paginator->itemCount = count(100);
$paginator->Page = 1;
$this->setView('manage');
$this->seznam = $this->za->get_seznam_paginator(..., $paginator->itemsPerPage, $paginator->offset);
$this->template->seznam = $this->seznam;
}
- čtení z DB v modelu:
public function get_seznam_paginator(..., $p1, $p2) {
return $this->connection->table("tabulka")->limit($p1, $p2);
}
- latte (manage):
<tr n:foreach="$seznam as $list">
<td><a href="{link odkaz:?parametr=$list->polozka1}">{$list->polozka1}</a></td>
<td><a href="{link odkaz:?parametr=$list->polozka2}">{$list->polozka2}</a></td>
<td><a href="{link odkaz:?parametr=$list->polozka3}">{$list->polozka3}</a></td>
<td><a href="{link odkaz:?parametr=$list->polozka4}">{$list->polozka4}</a></td>
</tr>
Ale háže mi to chybu „Component with name ‚vp‘ already exists.“ A to jsem přitom ještě do latte ani nedal vykreslení toho paginatoru (to je další dotaz – jak?)
Prosím o radu, co dělám blbě…díky
- frosty22
- Člen | 373
Použij továrničku, čili třeba v BasePresenteru:
<?php
class BasePresenter extends Presenter {
protected function createComponentPaginator($name)
{
$vp = new VisualPaginator($this, $name);
$vp->getPaginator()->itemsPerPage = 20;
return $vp;
}
}
?>
Potom v místě, kde získáváš data – čili ten render:
<?php
public function renderManage() {
$vp = $this["paginator"]->getPaginator();
$paginator->itemCount = count(100); // BTW tady ses asi uklepl, jinak to spadne :)
$paginator->Page = 1;
$this->setView('manage'); // to nemusíš volat, výchozí se bere dle render* tj. renderManage
$this->seznam = $this->za->get_seznam_paginator(..., $paginator->itemsPerPage, $paginator->offset);
$this->template->seznam = $this->seznam;
}
?>
A v šabloně, kde ho chceš vykreslit:
{control paginator}
BTW: Jinak ta chyba je protože již někde musíš mít připojenou komponentu s názvem „vp“, například metoda createComponentVp.
BTW2: „A to jsem přitom ještě do latte ani nedal“ ⇒ nejde o to, jestli ho dáš do do šablony nebo ne, jakmile připojíš komponentu do stromu, tak již existuje a komponenta jde připojit několika způsoby:
- new VisualPaginator($this, ‚vp‘); // Takto jsi ji připojil ty
- createComponentVp // Toto je hezčí způsob
- $this[„vp“] = new VisualPaginator();
- $this->addComponent(„vp“, new VisualPaginator()); // Snad jsem se neuklepl v metodě, params
Editoval frosty22 (16. 7. 2013 16:15)
- Zuben45
- Člen | 268
Dobrý den, potřeboval bych poradit, stránkovač mi funguje, ale jen tehdy kdy zadám počet výpisů na stránku na 2 (tedy přesněji, zobrazí se pouze u této hodnoty). Nevíte co s tím ?
Můj kód:
protected function createComponentPaginator()
{
$visualPaginator = new VisualPaginator();
$visualPaginator->paginator->itemsPerPage = 3;
return $visualPaginator;
}
public function renderDefault()
{
$this->template->anyVariable = 'any value';
$paginator = $this['paginator']->getPaginator();
$paginator->itemCount = count($this->newsRepository->findIncomplete());
$this->template->news = $this->newsRepository->findVysledky($paginator->offset, $paginator->itemsPerPage);
}
class NewsRepository extends Repository
{
public function findIncomplete()
{
return $this->findAll()->order("id DESC")->limit(3);
}
public function findVysledky($off,$limit)
{
return $this->findAll()->order("id DESC")->limit($limit,$off);
}
}
{snippet news}
<div id="news">
{control paginator}
{foreach $news as $new}
<section class="sections">
<header class="title">{$new->nazev}</header>
<article>
<img src="http://127.0.0.1{$basePath}/{$new->obrazek}" alt="Battlefield 4">
<p>{$new->text_uvod} ... <a href="http://127.0.0.1{$basePath}/novinky/{$new->id}">číst celé.</a>
</p>
</article>
<div class="stats">
<span class="left">
<img src="http://127.0.0.1{$basePath}/images/stats_user.png" alt="Zuben45"> {$new->autor}
<img src="http://127.0.0.1{$basePath}/images/stats_view.png" alt="stats_view"> 1230
<img src="http://127.0.0.1{$basePath}/images/stats_comment.png" alt="stats_comment"> 5
</span>
<span class="right">
7.6.2013 <img src="http://127.0.0.1{$basePath}/images/stats_rss.png" alt="RSS - Battlefield 4">
</span>
</div>
</section>
{/foreach}
{control paginator}
<div id="next">
<a>Zobrazit více… {control paginator}</a>
</div>
</div>
{/snippet}
- Zuben45
- Člen | 268
JuniorJR napsal(a):
@Zuben45: Neni to timhle:
<?php public function findIncomplete() { return $this->findAll()->order("id DESC")->limit(3); // <= vymazat limit } ?>
?
Ajo, jsem blbec :D, díky :)
h4kuna napsal(a):
Taky odstraň ze šablony http://127.0.0.1 pak to někam nahraješ a nepojede to.
Ano vím to, to udělám ihned jak se web dokončí, momentálně potřebuji, aby se mi ukazovalo vše normálně a pak bych nemusel řešit jestli se načetl obrázek apod. :)
Editoval Zuben45 (17. 9. 2013 16:08)