Nette Framework: Pagination

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

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

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 …

Marax
Člen | 28
+
0
-

Nehledáš toto? Visual Paginator

Takeshi
Člen | 596
+
0
-

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

Etch
Člen | 403
+
0
-

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

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

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

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

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

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

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

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).

Takeshi
Člen | 596
+
0
-

duke napsal(a):

Ak si vsimnes, vyssie je este jedna verzia VisualPaginatora, ak mas novsiu verziu, ktora by mala fungovat, porad, dik

Etch
Člen | 403
+
0
-

Až dorazím z práce domů (za cca 40 minut), tak ti nahraji na git celý funkční sandbox a jestli ti to bude fungovat v něm, tak budem hledat dál. Protože ten modifikovaný VisualPaginator, který jsem zde poslal je pokud se použije tak jak má naprosto funkční.

Etch
Člen | 403
+
0
-

@Takeshi:

Zde si můžeš stáhnout SandBox s VisualPaginatorem. Vyzkoušej, jestli ti bude fungovat a pak napiš.

Takeshi
Člen | 596
+
0
-

Etch napsal(a):

Tak to čo si mi poslal mi ide uplne super, ale aj tak nechapem v com bola chyba. Idem to skumat. :-) Dakujem moc.