przewiń do treści

PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych

Włodzimierz Gajda

class Pager
{
    private $klasa = '';
    private $klasaPeer = '';

    private $liczba_wszystkich_rekordow = 0;
    private $liczba_rekordow_na_stronie = 12;
    private $liczba_stron = 0;
    private $numer_strony = 0;
    private $numer_pierwszego_rekordu = 0;
    private $szerokosc = 11;

    private $base_url;
    private $rekordy;
    private $criteria = null;

    public function __construct(
        $klasa, $liczba_rekordow_na_stronie = 10,
        $criteria = null, $szerokosc = 11
    ) {
        if (is_null($criteria)) {
            $this->criteria = new Criteria();
        } else {
            $this->criteria = clone $criteria;
        }

        $this->klasa = $klasa;
        $this->klasaPeer = $klasa . 'Peer';
        $this->liczba_rekordow_na_stronie = $liczba_rekordow_na_stronie;
        $this->przeliczLiczbeRekordow();
        $this->przeliczLiczbeStron();
        $this->szerokosc = $szerokosc;
    }

    public function przeliczLiczbeRekordow()
    {
        $this->liczba_wszystkich_rekordow =
            call_user_func($this->klasaPeer . '::doCount', $this->criteria);
    }

    public function przeliczLiczbeStron()
    {
        $this->liczba_stron = (int)ceil(
          $this->liczba_wszystkich_rekordow / $this->liczba_rekordow_na_stronie
        );
    }

    public function isValidPage($page)
    {
        return str_ievpifr($page, 1, $this->liczba_stron);
    }

    public function setPage($page)
    {
        if ($this->isValidPage($page)) {
            $this->numer_strony = $page;
            $this->numer_pierwszego_rekordu = ($page - 1) * $this->liczba_rekordow_na_stronie;
        }
    }

    public function getPages($szerokosc = false)
    {
        if ($szerokosc) {
            $this->setWidth($szerokosc);
        }

        $polowa = (int)floor($this->szerokosc / 2);
        $minimum = $this->numer_strony;
        $minimum = $minimum - $polowa;
        $minimum = max($minimum, 1);
        $maksimum = $minimum + $this->szerokosc - 1;

        $za_duzo = $maksimum - $this->liczba_stron;
        if ($za_duzo > 0) {
            $minimum = $minimum - $za_duzo;
            $minimum = max($minimum, 1);
        }

        $maksimum = min($minimum + $this->szerokosc - 1, $this->liczba_stron);

        $pages = array();

        for ($i = $minimum; $i <= $maksimum; $i++) {
            $pages[] = $i;
        }
        return $pages;
    }


    public function assignRecords()
    {
        $this->criteria->setLimit($this->liczba_rekordow_na_stronie);
        $this->criteria->setOffset($this->numer_pierwszego_rekordu);

        $tmp = call_user_func($this->klasaPeer . '::doSelect', $this->criteria);

        $i = $this->numer_pierwszego_rekordu + 1;

        $this->rekordy = array();
        foreach ($tmp as $obj) {
            $this->rekordy[$i] = $obj;
            $i++;
        }
    }

    public function getRecords()
    {
        return $this->rekordy;
    }

    public function setBaseURL($url)
    {
        return $this->base_url = $url;
    }

    public function getPageURL($page)
    {
        if ($page !== false) {
            return $this->base_url . $page;
        } else {
            return '';
        }
    }

    public function getPage()
    {
        return $this->numer_strony;
    }

    public function getFirstPage()
    {
        if ($this->liczba_stron > 0) {
            return 1;
        } else {
            return false;
        }
    }

    public function getLastPage()
    {
        if ($this->liczba_stron > 0) {
            return $this->liczba_stron;
        } else {
            return false;
        }
    }

    public function getPreviousPage()
    {
        if ($this->numer_strony > 1) {
            return $this->numer_strony - 1;
        } else {
            return false;
        }
    }

    public function getNextPage()
    {
        if ($this->numer_strony < $this->liczba_stron) {
            return $this->numer_strony + 1;
        } else {
            return false;
        }
    }

    public function getFirstPageURL()
    {
        return $this->getPageURL($this->getFirstPage());
    }

    public function getPreviousPageURL()
    {
        return $this->getPageURL($this->getPreviousPage());
    }

    public function getNextPageURL()
    {
        return $this->getPageURL($this->getNextPage());
    }

    public function getLastPageURL()
    {
        return $this->getPageURL($this->getLastPage());
    }

    public function isPager()
    {
        return ($this->liczba_stron > 1);
    }

    public function isCurrentPage($strona)
    {
        return ($strona == $pager->getPage());
    }

    public function getNbPages()
    {
        return $this->liczba_stron;
    }

    public function leftDots($szerokosc = false)
    {
        if ($szerokosc) {
            $this->setWidth($szerokosc);
        }

        $polowa = (int)floor($this->szerokosc / 2);
        $minimum = $this->numer_strony;
        $minimum = $minimum - $polowa;
        $minimum = max($minimum, 1);
        $maksimum = $minimum + $this->szerokosc - 1;

        $za_duzo = $maksimum - $this->liczba_stron;
        if ($za_duzo > 0) {
            $minimum = $minimum - $za_duzo;
            $minimum = max($minimum, 1);
        }

        return ($minimum > 1);
    }

    public function rightDots($szerokosc = false)
    {
        ...
    }

}

Listing 21.2. Klasa Pager

Rozdział 21. Stronicowanie

listing-21-02.txt

Reklama

Szkolenia z Symfony 2.0