Data-Pagination

 view release on metacpan or  search on metacpan

lib/Data/Pagination.pm  view on Meta::CPAN

package Data::Pagination;

use strict;

our $VERSION = '0.44';

# {{{ new()

# Constructor.
# Making all calculations and storing results at class properties.
# Param int $total_entries Total number of entries (>= 1)
# Param int $entries_per_page Number of entries per page (>= 1)
# Param int $pages_per_set Number of pages per set (>= 1)
# Param int $current_page Current number of page

sub new {
    my ($class, $total_entries, $entries_per_page, $pages_per_set, $current_page) = @_;

    my $self = bless {} => $class;

    # total number of entries (>= 1) (copied from arguments)
    $self->{total_entries} = $total_entries;

    # number of entries per page (>= 1) (copied from arguments)
    $self->{entries_per_page} = $entries_per_page;

    # number of pages per set (>= 1) (copied from arguments)
    $self->{pages_per_set} = $pages_per_set;

    # total number of pages (>= 1)
    $self->{total_pages} = int(($self->{total_entries} - 1) / $self->{entries_per_page}) + 1;

    # current number of page (>= 1) (corrected)
    $self->{current_page} = $current_page;
    if ($self->{current_page} < 1) {
        $self->{current_page} = 1;
    } elsif ($self->{current_page} > $self->{total_pages}) {
        $self->{current_page} = $self->{total_pages};
    }

    # previous number of page (>= 1 or undef)
    $self->{prev_page} = $self->{current_page} - 1;
    if ($self->{prev_page} < 1) {
        $self->{prev_page} = undef;
    }

    # next number of page (>= 1 or undef)
    $self->{next_page} = $self->{current_page} + 1;
    if ($self->{next_page} > $self->{total_pages}) {
        $self->{next_page} = undef;
    }

    # start position of current set (>= 1)
    $self->{start_of_set} = int(($self->{current_page} - 1) / $self->{pages_per_set}) * $self->{pages_per_set} + 1;

    # end position of current set (>= 1)
    $self->{end_of_set} = $self->{start_of_set} + $self->{pages_per_set} - 1;
    if ($self->{end_of_set} > $self->{total_pages}) {
        $self->{end_of_set} = $self->{total_pages};
    }

    # numbers of set (one or more numbers in array)
    $self->{numbers_of_set} = [];
    for (my $i = $self->{start_of_set}; $i <= $self->{end_of_set}; ++$i) {
        push(@{$self->{numbers_of_set}}, $i);
    }

    # nearest page number of the previous set (>= 1 or undef)
    $self->{page_of_prev_set} = $self->{start_of_set} - 1;
    if ($self->{page_of_prev_set} < 1) {
        $self->{page_of_prev_set} = undef;
    }

    # nearest page number of the next set (>= 1 or undef)
    $self->{page_of_next_set} = $self->{end_of_set} + 1;
    if ($self->{page_of_next_set} > $self->{total_pages}) {
        $self->{page_of_next_set} = undef;
    }

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.848 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )