Pagination stránkování Call to a member function page() on array

vanaveno
Člen | 144
+
0
-

Ahojte potřeboval bych rozchodit stránkování.

Tohle mi funguje.

1. případ

<?php
    public function getProducts()
    {
    	return $this->database->table('products');
    }

 	$products = $this->productManager->getProducts();
    // a do šablony pošleme pouze jejich část omezenou podle výpočtu metody page
    $lastPage = 0;

	$this->template->products = $products->page( $page, 20, $lastPage)->order('RAND()');

    $this->template->page = $page;
    $this->template->lastPage = $lastPage;
?>

2.případ
Ale když použiji tuto metodu, kterou potřebuji
v modelu mám

<?php
    public function getAllProducts($search)
    {
            $item = new ProductItem;
            $item->productId = $product->productId;
            $item->name = $product->name;
            $item->publish = $product->publish;
			....
			$this->addItem($item->productId, $item);
	}

    public function addItem($productId, ProductItem $item)
    {
        $this->items[$productId] = $item;
    }

    public function getItems()
	{
		return $this->items;
    }
		// v presenteru mám
		$products = $this->productManager->getItems();
		$this->template->products = $products->page( $page, 20, $lastPage);
        $this->template->page = $page;
        $this->template->lastPage = $lastPage;
?>

Hází mi to chybu Call to a member function page() on array .
Jak to prosím upravit, aby do page() nešly hodnoty jako array, popřípadě jestli není jiný způsob stránkování, který by se hodil k 2. případu.

Děkuji za případnou pomoc
Vana

Editoval vanaveno (14. 2. 2020 11:04)

David Matějka
Moderator | 6445
+
0
-

a k cemu slouzi $this->items? proc tam nepracujes s databazi?

vanaveno
Člen | 144
+
0
-

David Matějka napsal(a):

a k cemu slouzi $this->items? proc tam nepracujes s databazi?

No protože potřebuji přepočítat nějaké hodnoty. Je tam seznam produktů určité kategorie, kde se u jednotlivých produktů dopočítává dph a marže.

David Matějka
Moderator | 6445
+
0
-

takze ty si nactes z databaze vsechny produkty z dane kategorie, dopocitas nejakou hodnotu a pak to chces strankovat?

vanaveno
Člen | 144
+
-1
-

David Matějka napsal(a):

takze ty si nactes z databaze vsechny produkty z dane kategorie, dopocitas nejakou hodnotu a pak to chces strankovat?

Ano, lze to?

David Matějka
Moderator | 6445
+
+1
-

page je metoda na Selection, takze nelze. ale proc to delas takhle spatne? proc neprovedes paginaci nad selection, ktere pak nejak transformujes?

vanaveno
Člen | 144
+
0
-

David Matějka napsal(a):

page je metoda na Selection, takze nelze. ale proc to delas takhle spatne? proc neprovedes paginaci nad selection, ktere pak nejak transformujes?

Promiň ale teď tomu nerozumím. Jakož nejprve vypíši produkty z databáze a potom dopočítám jejich hodnoty jako je marže a dph?

David Matějka
Moderator | 6445
+
+1
-

ne, nejprve si vyberes z databaze data, ktera chces zobrazit (to znamena profiltrovana a strankovana, abys nenacital vechny polozky, jako to delas nyni) a tyto data tranformujes pred tim, nez je posles do sablony

Kamil Valenta
Člen | 752
+
0
-

Je ohromný slow down tahat z DB milión záznamů, ke každému z nich dopočítat marži a DPH a pak jich 10 zobrazit a 9999990 zahodit.

Pokud chceš podle té marže či DPH i řadit či filtrovat, tak si to dopočítávej už na úrovni DB, ať to jde do Selectiony.

vanaveno
Člen | 144
+
0
-

No já to mám takhle, nejprve vytáhnu z databáze produkty například podle kategorie, tady provedu transformaci cen a potom to pošlu do šablony. (nevytahuji všechny data). Takže jak píše David Matějka, ještě než to pošlu do šablony, tak to musím stránkovat? No mrknu na to až večer. Každopádně zatím díky za pomoc a ještě se nejspíše ozvu, kdyby na to nepřišel.

Kamil Valenta
Člen | 752
+
0
-

Ale ta kategorie, předpokládám, nemá omezený počet produktů, takže jich klidně ten milión být může.

Ideální je samozřejmě vytáhnout jen to, co budeš skutečně zobrazovat. Tedy vytáhnout jen N produktů, pokud jich máš N na stránce.

vanaveno
Člen | 144
+
0
-

Supr kluci, tak jsem to nakonec vyřešil, ale dík patří obzvláště Davidu Matějkovi, ten mě navedl správným směrem :)