VisualPaginator – nefunguje :/

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
muflix
Člen | 92
+
0
-

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

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
+
0
-
$rows = $this->novinky->getAll($vp->offset, $vp->itemsPerPage);

musíš tam mít $vp->paginator->offset a $vp->paginator->itemsPerPage

muflix
Člen | 92
+
0
-

jo díky, ještě sem musel přepsat getALL() funkci

public function getAll($offset, $limit)
        {
            return$this->db->select('*')->from('novinky')->orderBy('datum_vlozeni DESC')->fetchAll($offset, $limit);
        }

a už to funguje

n.u.r.v.
Člen | 485
+
0
-

Ahoj, také se snažím zprovoznit ten VisualPaginator, ale nějak mi to nejde:

  1. Stáhl jsem si VP a dal do složky v mém projektu: libs/Paginator/VisualPaginator.php
  2. 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;
    }
  1. čtení z DB v modelu:
public function get_seznam_paginator(..., $p1, $p2) {
        return $this->connection->table("tabulka")->limit($p1, $p2);
    }
  1. 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
+
0
-

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:

  1. new VisualPaginator($this, ‚vp‘); // Takto jsi ji připojil ty
  2. createComponentVp // Toto je hezčí způsob
  3. $this[„vp“] = new VisualPaginator();
  4. $this->addComponent(„vp“, new VisualPaginator()); // Snad jsem se neuklepl v metodě, params

Editoval frosty22 (16. 7. 2013 16:15)

Zuben45
Člen | 268
+
0
-

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&hellip; {control paginator}</a>
      </div>


 </div>
  {/snippet}
JuniorJR
Člen | 181
+
0
-

@Zuben45: Neni to timhle:

<?php
public function findIncomplete()
{
    return $this->findAll()->order("id DESC")->limit(3); // <= vymazat limit
}
?>

?

Editoval JuniorJR (17. 9. 2013 15:04)

h4kuna
Backer | 740
+
0
-

Taky odstraň ze šablony http://127.0.0.1 pak to někam nahraješ a nepojede to.

Zuben45
Člen | 268
+
0
-

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)

Zuben45
Člen | 268
+
0
-

Ještě menší dotaz, jak změním ?paginator-page=2 na př /page/2 ? vím že přes routu, ale nvm jak :(

Aurielle
Člen | 1281
+
+1
-

page/<paginator-page> by jako maska routy mělo stačit.

Editoval Aurielle (17. 9. 2013 19:03)

Zuben45
Člen | 268
+
0
-

Aurielle napsal(a):

page/<paginator-page> by jako maska routy mělo stačit.

super, funguje a navíc paginator si sám upravil url, začínám milovat nette :)