CPagination-nel eltérő pagesize az első oldalon

Hogy lehet megoldani azt, hogy ha van egy komplex lekérdezésem, hogy az 1. oldalon x eredmény legyen, de 2. oldaltól már y?

Akárhogy próbálom nem jön össze.

Ez az alap ötlet a kontrollerben:




$pages->pageSize = 5;

if(isset($_GET['page'])) $page->pageSize = 10;



Ezzel nem is lenne alapvetően semmi gond, de a 2. oldaltól mintha össze vissza kérdezné le az eredményeket. Van erre valami megoldás? Vagy esetleg én csinálom rosszul?

Szia

Hát ez érdekes feladat. A baj az ha a CActiveDataProvider-ben állítod a pageSize-t, akkor szerintem így alakul a lekérdezés.

  1. oldal: 1-5

  2. oldal: 11-20

  3. oldal: 21-30

Tehát a 6-10 rekordokat nem fogod látni.

Szerintem ezt csak úgy tudod megvalósítni, ha csinálsz saját lapozót.

Mert neked ilyen kell:

  1. oldal: 1-5

  2. oldal: 6-15

  3. oldal: 16-25

stb…

Csinálj egy saját lapozót és írd felül az applyLimit metódust.

class MyCPagination extends CPagination {

public function applyLimit($criteria) {

… ide kell a feltétel ami kiszámolja az új limiteket …

}

Most így első nekifutásra ez jutott eszembe. Remélem tudtam segíteni.

Üdv!

Igen, pont így szeretném. De nem CActiveDataProvider-t használok. Sima CDbcriteria és model findAll funkciók. Ezt sajnos nem tudom variálni, mert keresési funkciókból generálja ezt le. Szóval elég komplikált. :)

Amúgy, ahogy írod. A 2. oldalon már kevesebb jelenik meg, mint amennyinek kellene. De holnap meglesem ezt a saját applyLimit-es dolgot. :)

Én nem az applyLimit-tel próbálkoztam most, hanem a getOffset-tel, mert ez állítja be az értéket. Tegnap is próbálkoztam már ezzel csak nem a CPanination-ön belül.

Már majdnem jó a dolog.

4 adattal próbálkozok most.

1 oldalra 1-et akarok, a 2.-ra kettőt, a harmadikra meg maradna 1

Az első 2. oldal így már jó is, viszont a 3. oldalt nem jeleníti meg. Azt levágja, de úgy néz ki jó úton haladok. :)




class MyCPagination extends CPagination {


    public function getOffset() {

        if($this->getCurrentPage() != 0) {

            return ($this->getCurrentPage()*$this->getPageSize())-Yii::app()->params['firstPageSize'];

        } else {

            return $this->getCurrentPage()*$this->getPageSize();

        }

    }


}



Azért ez a probléma ennyire nem egyszerű. Nézd meg: /yii/framework/web/CPagination.php kódnak.

Az alábbi metódusokat újra kell írnod:

getCurrentPage

getPageCount

setFirstPageSize($value)

Fel kellene venned egy privát változót is

private $_firstPageSize=null;