Nette Framework: Pagination
- Takeshi
- Člen | 596
Ahojte mám problém so stránkovaním. Používam najnovšiu verziu Nette – NetteFramework-2.0.1-PHP5.3 a pri tejto verzií sa mi nedarí.
- Pripojil som sa na databázu pomocou Nette\Database
- Pri staršej verzií sa mi podarilo pripojiť pomocou databázovej vrstvy dibi a stránkovanie som riešil pomocou VisualPaginator-u, … teraz, pri novšej verzií, ked pouzijem spominany VisualPaginator mi stale nieco chyba (treda – class)… je tu ina kniznica …
… mohol by mi niekto poradit PROSÍÍÍÍÍÍÍÍÍÍÍM ?????
- Takeshi
- Člen | 596
Ano pozera som to a aj mi to fungovalo … jedina nevyhoda je, ze neviem ako vytvorit cisla pri strankovani, teda … <1 2 3 4 5 6 7 ...... 14> … keď som do Paginator.php pridal funkciu steps() fungovalo mi aj to, len tie cisla sa mi iba zobrazovali ale prepinat medzi strankami sa mi nedalo …
- Etch
- Člen | 403
Takeshi napsal(a):
No to by bolo super, len ako som uz spominal VisualPaginator mi nefunguje … stale mu chyba nejaka ta funkcia … pri starsej verzii mi to nevadilo ale ta najnovsia ma, ako sa zda, kapanek inu kniznicu a teda malinko rozdielne funkcie … tak preto mi to nejde
Jaká funkce?? Co přesně ti na tom nefunguje?? Jakou chybu to vyhazuje??
Narychlo jsem udělal fix(doplnil jsem správné namespace) pro Nette 2.0 s namespace:
VisualPaginator.php
<?php
/**
* Nette Framework Extras
*
* This source file is subject to the New BSD License.
*
* For more information please see https://addons.nette.org
*
* @copyright Copyright (c) 2009 David Grudl
* @license New BSD License
* @link https://addons.nette.org
* @package Nette Extras
* @version $Id: VisualPaginator.php 4 2009-07-14 15:22:02Z david@grudl.com $
*/
use Nette\Application\UI\Control;
use Nette\Utils\Paginator;
/**
* Visual paginator control.
*
* @author David Grudl
* @copyright Copyright (c) 2009 David Grudl
* @package Nette Extras
*/
class VisualPaginator extends Control
{
/** @var Paginator */
private $paginator;
/** @persistent */
public $page = 1;
/**
* @return Nette\Paginator
*/
public function getPaginator()
{
if (!$this->paginator) {
$this->paginator = new Paginator;
}
return $this->paginator;
}
/**
* Renders paginator.
* @return void
*/
public function render()
{
$paginator = $this->getPaginator();
$page = $paginator->page;
if ($paginator->pageCount < 2) {
$steps = array($page);
} else {
$arr = range(max($paginator->firstPage, $page - 3), min($paginator->lastPage, $page + 3));
$count = 4;
$quotient = ($paginator->pageCount - 1) / $count;
for ($i = 0; $i <= $count; $i++) {
$arr[] = round($quotient * $i) + $paginator->firstPage;
}
sort($arr);
$steps = array_values(array_unique($arr));
}
$this->template->steps = $steps;
$this->template->paginator = $paginator;
$this->template->setFile(dirname(__FILE__) . '/template.phtml');
$this->template->render();
}
/**
* Loads state informations.
* @param array
* @return void
*/
public function loadState(array $params)
{
parent::loadState($params);
$this->getPaginator()->page = $this->page;
}
}
?>
- Takeshi
- Člen | 596
Tak uz sa mi aj s Visual Paginatorom podarilo vytvorit strankovanie … teda
az na tie cisla
<1 2 3 4 … 5> … iba som zatial nastavil pocet poloziek na stranu a
aktualnu stranu … nizsie je moj kod …
<?php
/**
* Homepage presenter.
*
* @author John Doe
* @package MyApplication
*/
class BooksPresenter extends BasePresenter
{
public function actionDefault(){
}
public function renderDefault()
{
$this->template->headTitle = "Knihy - Trajan";
$pagin = new VisualPaginator();
$pagin->getPaginator()->itemCount = 5;
$pagin->getPaginator()->itemsPerPage = 3;
$pagin->getPaginator()->page = 2;
$paginator = $pagin->getPaginator();
$database = new Nette\Database\Connection('mysql:host=localhost;dbname=database', 'root', '');
$this->template->books = $database->table('books')->limit($paginator->getLength(), $paginator->getOffset());
}
protected function createComponentPagin()
{
$pagin = new VisualPaginator;
$pagin->getPaginator()->itemsPerPage = 3;
return $pagin;
}
}
- Etch
- Člen | 403
Furt nějak nechápu, co ti na tom nefunguje.
public function renderDefault(){
$items = range(1,1000);
$paginator = $this['paginator']->getPaginator();
$paginator->itemsPerPage = 15;
$paginator->itemCount = count($items);
}
protected function createComponentPaginator(){
$control = new VisualPaginator;
return $control;
}
v šabloně pak
{control paginator}
a funguje to naprosto standardně.
Nešlo by nějak lépe vysvětlit, co je myšleno větou „teda az na tie
cisla
<1 2 3 4 … 5>“??
- Takeshi
- Člen | 596
Tak moj kod je nasledovny
<?php
/**
* Homepage presenter.
*
* @author John Doe
* @package MyApplication
*/
class BooksPresenter extends BasePresenter
{
public function actionDefault(){
}
public function renderDefault()
{
$this->template->headTitle = "Knihy - Trajan";
$pagin = new VisualPaginator();
$pagin->getPaginator()->itemCount = 5;
$pagin->getPaginator()->itemsPerPage = 3;
$paginator = $pagin->getPaginator();
$database = new Nette\Database\Connection('mysql:host=localhost;dbname=database', 'root', '');
$this->template->books = $database->table('books')->limit($paginator->getLength(), $paginator->getOffset());
}
protected function createComponentPagin()
{
$pagin = new VisualPaginator;
$pagin->getPaginator()->itemsPerPage = 3;
return $pagin;
}
}
no ked dam do sablony nieco ako … Method BooksPresenter::createComponentPagin() did not return or create the desired component.
taktiez ked pouzijem $this[‚paginator‘]->getPaginator(); tak mi to
vyhadzuje to iste
tak neviem v com je chyba
- Etch
- Člen | 403
V předchozím postu, jsem ti naznačil, jak to máš udělat a ty obratem pošleš ten samej nesmyslnej kód.
protected function createComponentPagin(){
$pagin = new VisualPaginator;
$pagin->getPaginator()->itemsPerPage = 3;
return $pagin;
}
Tohle by dejme tomu ještě šlo, ale stejně bych tam nechal jenom:
protected function createComponentPagin(){
$pagin = new VisualPaginator;
return $pagin;
}
a tohle svědčí o tom, že naprosto nechápeš princip továrniček.
public function renderDefault()
{
$this->template->headTitle = "Knihy - Trajan";
$pagin = new VisualPaginator();
$pagin->getPaginator()->itemCount = 5;
$pagin->getPaginator()->itemsPerPage = 3;
$paginator = $pagin->getPaginator();
$database = new Nette\Database\Connection('mysql:host=localhost;dbname=database', 'root', '');
$this->template->books = $database->table('books')->limit($paginator->getLength(), $paginator->getOffset());
}
řádky:
$pagin = new VisualPaginator();
$pagin->getPaginator()->itemCount = 5;
$pagin->getPaginator()->itemsPerPage = 3;
$paginator = $pagin->getPaginator();
jsou tam naprosto nesmyslné. Má tam být něco jako:
public function renderDefault()
{
$this->template->headTitle = "Knihy - Trajan";
$paginator = $this['pagin']->getPaginator();
$paginator->itemCount = 5;
$paginator->itemsPerPage = 3;
$database = new Nette\Database\Connection('mysql:host=localhost;dbname=database', 'root', '');
$this->template->books = $database->table('books')->limit($paginator->getLength(), $paginator->getOffset());
}
Celej kód by pak měl vypadat následovně:
<?php
class BooksPresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->headTitle = "Knihy - Trajan";
$paginator = $this['pagin']->getPaginator();
$paginator->itemCount = 5;
$paginator->itemsPerPage = 3;
$database = new Nette\Database\Connection('mysql:host=localhost;dbname=database', 'root', '');
$this->template->books = $database->table('books')->limit($paginator->getLength(), $paginator->getOffset());
}
protected function createComponentPagin(){
$pagin = new VisualPaginator;
return $pagin;
}
}
?>
a v šabloně pak budeš volat
{control pagin}
PS: Prosím obarvuj kód, ať se to dá rozumě číst.
- Takeshi
- Člen | 596
Ja si uvedomujem, ze som zaciatocnik! Ale to co mi ty pises mi nejde … ta ‚tovarnicka‘ mi nevracia komponent a v tom je problem! A neviem preco … tak este raz … moj kod …
class BooksPresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->headTitle = "Knihy - Trajan";
$paginator = $this['pagin']->getPaginator();
$database = new Nette\Database\Connection('mysql:host=localhost;dbname=database', 'root', '');
$this->template->books = $database->table('books');
}
protected function createComponentPagin(){
$pagin = new VisualPaginator;
return $pagin;
}
}
Pri tomto $paginator = $this[‚pagin‘]->getPaginator(); mi hadze chybu
Method BooksPresenter::createComponentPagin() did not return or create the desired component.
… preto som tam dal tie „nezmyselne riadky“ aby mi islo aspon nieco
- Etch
- Člen | 403
Používáš ten upravený VisualPaginator, který jsem sem poslal??
Pokud ano, tak bych ještě zkusil pro jistotu smazat cache. Pokud ti to ani potom nepůjde, tak ti někam na git nahraji celý sandbox, ve kterém to je celé zprovozněné.
- duke
- Člen | 650
Ta chyba „Method BooksPresenter::createComponentPagin() did not return
or create the desired component.“ znamená, že tvá metoda
createComponentPagin
nevrátila objekt typu
IComponent
, což je vyžadováno. Nejspíš používáš nějakou
starší verzi VisualPaginatoru, kde třída VisualPaginator nedědí z toho,
z čeho dědit má (měla by přímo či nepřímo dědit z
Nette\Application\UI\Control
).
- Etch
- Člen | 403
@Takeshi:
Zde si můžeš stáhnout SandBox s VisualPaginatorem. Vyzkoušej, jestli ti bude fungovat a pak napiš.