Stránkování

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
radvis
Začátečník | 110
+
0
-

Ahoj, pokouším se zprovoznit stránkování, ale nedaří se mi to.
Error: Call to a member function applyLimit() on a non-object

presenter:

// retrieving data
		$dataSource = $inzerat->select()->fetchAll();

		// paging
		$paginator = new Paginator;
		$paginator->itemsPerPage = 15;
		$paginator->itemCount = count($dataSource);
		$paginator->page = $this->getParam('page');


		$dataSource->applyLimit($paginator->length, $paginator->offset);

// paginator steps
		$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));
		}

// sorting
		$i = 1;
		parse_str($this->order, $list);
		foreach ($list as $field => $dir) {
			$dataSource->orderBy($field, $dir === 'a' ? dibi::ASC : dibi::DESC);
			$list[$field] = array($dir, $i++);
		}

		//$this->template->table = $table;
		$this->template->order = $list;
		$this->template->canonical = empty($list) ? NULL : $this->link('this', array('order' => NULL));
		$this->template->currentOrder = $this->order;
		$this->template->paginator = $paginator;
		$this->template->steps = $steps;
		$this->template->rows = $dataSource->getIterator();
		$this->template->columns = $dataSource->getResult()->getInfo()->getColumnNames();

	}
despiq
Člen | 320
+
0
-

tohle

<?php
$dataSource = $inzerat->select()->fetchAll();
?>

je co?

radvis
Začátečník | 110
+
0
-

ma to byt, že $inzerat je model a ma použít funkci select() a vybrat vše.

Honza Marek
Člen | 1664
+
0
-

A dělá to? :-D A co to je vše? Je to DataSource?

radvis
Začátečník | 110
+
0
-

Je to vpoctatě tohle "":https://doc.nette.org/…ani-a-razeni

Ondřej Mirtes
Člen | 1536
+
0
-

Pokud metoda select() vrací DibiDataSource, tak na ni nesmíš volat fetchAll(), aby to DibiDataSource zůstal :))

radvis
Začátečník | 110
+
0
-

Opraveno a tenhle error.

**InvalidArgumentException

Argument passed to SmartCachingIterator::__construct must be an array or interface Iterator provider, NULL given.**

Editoval radvis (27. 1. 2010 21:51)

redhead
Člen | 1313
+
0
-

jinak řečeno, projdi si ještě jednou ten tutoriál.

Jakub Lédl
Člen | 55
+
0
-

Metoda fetchAll třídy DibiFluent vrací pole – metody logicky nejdou volat na čemkoli, co není objekt.

Správný zápis by s použitím DibiFluent vypadal asi takto:

<?php

$data = $inzerat->select('*')->from('název tabulky')->offset($paginator->offset)
                             ->limit($paginator->length)->fetchAll();

?>

Editoval Jakub Lédl (27. 1. 2010 21:54)

radvis
Začátečník | 110
+
0
-

To select() je funkce v modelu:)

Jakub Lédl
Člen | 55
+
0
-

radvis napsal(a):

To select() je funkce v modelu:)

Sakra :-) A vrací DibiDataSource (jinak omlouvám se, jestli tě ten problbečky popis nejak urazil :-D) ?

Pokud jo, tak prostě prvně volej applyLimit a pak teprv fetchAll.

radvis
Začátečník | 110
+
0
-

Neurazil … já jsem strašně pomalej:( a navíc jsem teď začal číst php dokumentaci od začátku. Zjístil jsem, že mám hodně nedostatků. Jinak už jsem to dal pryč to fetchAll(), ale je tu další problém

InvalidArgumentException

Argument passed to SmartCachingIterator::__construct must be an array or interface Iterator provider, NULL given.

redhead
Člen | 1313
+
0
-
$datasource = $model->select();

$datasource->applyLimit($paginator->length, $paginator->offset);

$result = datasource->fetchAll();

$this->template->rows = $result;
radvis
Začátečník | 110
+
0
-

redhead napsal(a):

$datasource = $model->select();

$datasource->applyLimit($paginator->length, $paginator->offset);

$result = datasource->fetchAll();

$this->template->rows = $result;

To asi není řešení tohodle

**InvalidArgumentException

Argument passed to SmartCachingIterator::__construct must be an array or interface Iterator provider, NULL given.**

nebo se pletu?

Ola
Člen | 385
+
0
-

Může být – v šabloně se kvůli blbým datům snažíš procházet NULL.

radvis
Začátečník | 110
+
0
-

Když použiju „$result = datasource->fetchAll();“ hodí mi to parse error.

redhead
Člen | 1313
+
0
-

chybí mi tam $

radvis
Začátečník | 110
+
0
-

Call to a member function fetchAll() on a non-object. Já už jsem z toho blázen:D.

redhead
Člen | 1313
+
0
-

nebude chyba ve velikosti písmen (dataSource)?? nesmíš to jen kopírovat a vkládat. Měl bys ten kód hlavně pochopit

radvis
Začátečník | 110
+
0
-

Neznáte někdo dobrou literaturu na netu o php nejlépe o nette?

Další chyba když jsem tam dal $dataSource:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚APPLY LIMIT 1 0‘ at line 1

Editoval radvis (28. 1. 2010 11:07)

radvis
Začátečník | 110
+
0
-

Nemohl by mi někdo prosím poradit aby už to fungovalo?:( díky.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚APPLY LIMIT 1 0‘ at line 1

Ondřej Mirtes
Člen | 1536
+
0
-

A řekl jsi paginatoru, kolik položek máš a kolik jich chceš na stránku mít?

radvis
Začátečník | 110
+
0
-

To nevim, jak to zjístím? Já se v tom nette strácím pořád víc a víc:(

redhead
Člen | 1313
+
0
-

místo

applyLimit()

volej jen

limit()

Ondřej Mirtes
Člen | 1536
+
0
-

V tom případě nepoužívá DataSource, ale DibiFluent.

redhead
Člen | 1313
+
0
-

no právě, podle toho co mu to hlásí..

Ondřej Mirtes
Člen | 1536
+
0
-

radvis: Ty se neztrácíš v Nette, ale v programování obecně. Nechci být zlý, ale neměl bys jen kopírovat kusy kódu, ale každej řádek, kterej napíšeš, bys měl zároveň chápat. Není to nic těžkého. Většina dotazů, které jsi tu položil, mi nepřijde taková, že by si s člověk nedokázal poradit sám. Nemůžeš se pořádně naučit framework, pokud neznáš základy samotného programování.

radvis
Začátečník | 110
+
0
-

Ondřej Mirtes napsal(a):

V tom případě nepoužívá DataSource, ale DibiFluent.

Používam dibi. DibiFluent dám místo datasource?

Ondřej Mirtes
Člen | 1536
+
0
-

Spíš si přečti můj poslední příspěvek.

radvis
Začátečník | 110
+
0
-

Přečetl a také už čtu knihu zas od začátku, ale rád bych dořešil to, co mám orzdělané.