Jump to content

How paginate page can keep up after the table was sorted


hitman47

Recommended Posts

Here is my pagination code:

 

 class Paginator{  
        var $items_per_page;  
        var $items_total;  
        var $current_page;  
        var $num_pages;  
        var $mid_range;  
        var $low;  
        var $high;  
        var $limit;  
        var $return;  
        var $default_ipp =11;  //items_per_page
      
        function Paginator()  
        {  
            $this->current_page = 1;  
            $this->mid_range = 7;  
            $this->items_per_page = (!empty($_GET['ipp'])) ? $_GET['ipp']:$this->default_ipp;  
        }  
      
        function paginate()  
        {  
            if($_GET['ipp'] == 'All')  
            {  
                $this->num_pages = ceil($this->items_total/$this->default_ipp);  
                $this->items_per_page = $this->default_ipp;  
            }  
            else  
            {  
                if(!is_numeric($this->items_per_page) OR $this->items_per_page <= 0) $this->items_per_page = $this->default_ipp;  
                $this->num_pages = ceil($this->items_total/$this->items_per_page);  
            }  
            $this->current_page = (int) $_GET['page']; // must be numeric > 0  
            if($this->current_page < 1 Or !is_numeric($this->current_page)) $this->current_page = 1;  
            if($this->current_page > $this->num_pages) $this->current_page = $this->num_pages;  
            $prev_page = $this->current_page-1;  
            $next_page = $this->current_page+1;  
      
            if($this->num_pages > 3)  
            {  
                $this->return = ($this->current_page != 1 And $this->items_total >= 10) ? "<a class=\"paginate\" href=\"$_SERVER[php_SELF]?page=$prev_page&ipp=$this->items_per_page\">« Previous</a> ":"<span class=\"inactive\" href=\"#\">« Previous</span> ";  
      
                $this->start_range = $this->current_page - floor($this->mid_range/2);  
                $this->end_range = $this->current_page + floor($this->mid_range/2);  
      
                if($this->start_range <= 0)  
                {  
                    $this->end_range += abs($this->start_range)+1;  
                    $this->start_range = 1;  
                }  
                if($this->end_range > $this->num_pages)  
                {  
                    $this->start_range -= $this->end_range-$this->num_pages;  
                    $this->end_range = $this->num_pages;  
                }  
                $this->range = range($this->start_range,$this->end_range);  
      
                for($i=1;$i<=$this->num_pages;$i++)  
                {  
                    if($this->range[0] > 2 And $i == $this->range[0]) $this->return .= " ... ";  
                    // loop through all pages. if first, last, or in range, display  
                    if($i==1 Or $i==$this->num_pages Or in_array($i,$this->range))  
                    {  
                        $this->return .= ($i == $this->current_page And $_GET['page'] != 'All') ? "<a title=\"Go to page $i of $this->num_pages\" class=\"current\" href=\"#\">$i</a> ":"<a class=\"paginate\" title=\"Go to page $i of $this->num_pages\" href=\"$_SERVER[php_SELF]?page=$i&ipp=$this->items_per_page\">$i</a> ";  
                    }  
                    if($this->range[$this->mid_range-1] < $this->num_pages-1 And $i == $this->range[$this->mid_range-1]) $this->return .= " ... ";  
                }  
                $this->return .= (($this->current_page != $this->num_pages And $this->items_total >= 10) And ($_GET['page'] != 'All')) ? "<a class=\"paginate\" href=\"$_SERVER[php_SELF]?page=$next_page&ipp=$this->items_per_page\">Next »</a>\n":"<span class=\"inactive\" href=\"#\">» Next</span>\n";  
                $this->return .= ($_GET['page'] == 'All') ? "<a class=\"current\" style=\"margin-left:10px\" href=\"#\">All</a> \n":"<a class=\"paginate\" style=\"margin-left:10px\" href=\"$_SERVER[php_SELF]?page=1&ipp=All\">All</a> \n";  
            }  
            else  
            {  
                for($i=1;$i<=$this->num_pages;$i++)  
                {  
                    $this->return .= ($i == $this->current_page) ? "<a class=\"current\" href=\"#\">$i</a> ":"<a class=\"paginate\" href=\"$_SERVER[php_SELF]?page=$i&ipp=$this->items_per_page\">$i</a> ";  
                }  
                $this->return .= "<a class=\"paginate\" href=\"$_SERVER[php_SELF]?page=1&ipp=All\">All</a> \n";  
            }  
            $this->low = ($this->current_page-1) * $this->items_per_page;  
            $this->high = ($_GET['ipp'] == 'All') ? $this->items_total:($this->current_page * $this->items_per_page)-1;  
            $this->limit = ($_GET['ipp'] == 'All') ? "":" LIMIT $this->low,$this->items_per_page";  
        }  
      
        function display_items_per_page()  
        {  
            $items = '';  
            $ipp_array = array(10,25,50,100,'All');  
            foreach($ipp_array as $ipp_opt)    $items .= ($ipp_opt == $this->items_per_page) ? "<option selected value=\"$ipp_opt\">$ipp_opt</option>\n":"<option value=\"$ipp_opt\">$ipp_opt</option>\n";  
            return "<span class=\"paginate\">Items per page:</span><select class=\"paginate\" onchange=\"window.location='$_SERVER[php_SELF]?page=1&ipp='+this[this.selectedIndex].value;return false\">$items</select>\n";  
        }  
      
        function display_jump_menu()  
        {  
            for($i=1;$i<=$this->num_pages;$i++)  
            {  
                $option .= ($i==$this->current_page) ? "<option value=\"$i\" selected>$i</option>\n":"<option value=\"$i\">$i</option>\n";  
            }  
            return "<span class=\"paginate\">Page:</span><select class=\"paginate\" onchange=\"window.location='$_SERVER[php_SELF]?page='+this[this.selectedIndex].value+'&ipp=$this->items_per_page';return false\">$option</select>\n";  
        }  
      
        function display_pages()  
        {  
            return $this->return;  
        }  
    }

 

And this is where my sorted table is:

 

 $displayed_articles = count_articles(NULL);//get number of articles in my table
                   
        $pages = new Paginator;  
        $pages->items_total = $displayed_articles;  
        $pages->mid_range = 9;//The third line tells the paginator the number of page links to display  
        $pages->paginate();

 

show_article_list($articles, $pages->display_pages(),$pages->display_jump_menu(),$pages->    display_items_per_page());    //my function where my table is and where my data would be shown

 

If i want to sort my table and keep my pagination what should i add?

 

Please help i am stuck and it is urgent

Edited by hitman47
Link to comment
Share on other sites

you would output the sort links above each column of data. the links would contain the column/field name to sort and the asc/desc sort order (opposite of what the current sort order is, default to asc if there is no current sort order.) something like ?sort=some_field_name,sort_order=asc

 

you would also combine the submitted column/field name and the asc/desc sort order with the page= and ipp= attributes in the links. you would end up with combined links that look like ?page=x&ipp=10&sort=some_field_name,sort_order=asc

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.