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)