始终显示上一个&使用CodeIgniter分页类的下一个链接

时间:2013-04-16 01:49:34

标签: php codeigniter pagination codeigniter-2

问题描述
当我在第一页时,previous链接没有显示,当我在最后一页时,next链接也没有显示。我设置了$config['prev_link']='previous'$config['next_link']='next'

问题
如何始终呈现,使用CodeIgniter分页类,上一页下一页链接为<p>标记,当它们未被使用时?

更新
最终自己解决它。见下面的解决方案在v2.1.3上工作

4 个答案:

答案 0 :(得分:9)

  

以下是解决方案:

  1. 通过创建新文件MY_Pagination.php并将其放在application/library文件夹中来扩展Codeigniter分页类。

  2. 将所有变量和类前缀声明从protected更改为public

  3. 在MY_Pagination.php中定义两个公共变量:$display_prev_link$display_next_link并将其设置为FALSE

  4. 在create_links()函数中,将if ($this->prev_link !== FALSE && $this->cur_page !== 1)语句的末尾添加elseif语句:

    elseif ($this->display_prev_link && $this->cur_page === 1)
        $output .= $this->prev_tag_open.'<span>'.$this->prev_link.'</span>'.$this->next_tag_close;
    

    elseif语句末尾的另一个if ($this->next_link !== FALSE && $this->cur_page < $num_pages)语句:

    elseif ($this->display_next_link && $this->cur_page >= $num_pages)
        $output .= $this->next_tag_open.'<span>'.$this->next_link.'</span>'.$this->next_tag_close;
    
  5. 现在,

    通过定义$config['display_prev_link']$config['display_prev_link']等于TRUEFALSE,您可以控制PreviousNext链接的显示。

    以下是完整的application/library/MY_Pagination.php文件:

    <?php  
    
    // Extends the Pagination Class
    // Add an option of presenting the PREVIOUS and NEXT links when they're not needed.
    // by setting $display_prev_link - and - $display_next_link to true
    
    // !!! EDITIONS => LINES 263 AND 316 !!!
    
    defined('BASEPATH') OR exit('No direct script access allowed');
    
    class MY_Pagination extends CI_Pagination {
    
        public $display_prev_link = false;
        public $display_next_link = false;
    
        public $base_url        = '';
        public $prefix      = '';
        public $suffix      = '';
        public $total_rows      = 0;
        public $per_page        = 10;
        public $num_links       = 2;
        public $cur_page        = 0;
        public $use_page_numbers    = FALSE;
        public $first_link      = '&lsaquo; First';
        public $next_link       = '&gt;';
        public $prev_link       = '&lt;';
        public $last_link       = 'Last &rsaquo;';
        public $uri_segment     = 3;
        public $full_tag_open   = '';
        public $full_tag_close  = '';
        public $first_tag_open  = '';
        public $first_tag_close = '';
        public $last_tag_open   = '';
        public $last_tag_close  = '';
        public $first_url       = '';
        public $cur_tag_open        = '<strong>';
        public $cur_tag_close   = '</strong>';
        public $next_tag_open   = '';
        public $next_tag_close  = '';
        public $prev_tag_open   = '';
        public $prev_tag_close  = '';
        public $num_tag_open        = '';
        public $num_tag_close   = '';
        public $page_query_string   = FALSE;
        public $query_string_segment = 'per_page';
        public $display_pages   = TRUE;
        public $_attributes     = '';
        public $_link_types     = array();
        public $reuse_query_string   = FALSE;
        public $data_page_attr  = 'data-ci-pagination-page';
    
        // --------------------------------------------------------------------
    
        /**
         * Constructor
         *
         * @param   array   $params Initialization parameters
         * @return  void
         */
        public function __construct($params = array())
        {
            $this->initialize($params);
            log_message('debug', 'Pagination Class Initialized');
        }
    
        // --------------------------------------------------------------------
    
        /**
         * Initialize Preferences
         *
         * @param   array   $params Initialization parameters
         * @return  void
         */
        public function initialize($params = array())
        {
            $attributes = array();
    
            if (isset($params['attributes']) && is_array($params['attributes']))
            {
                $attributes = $params['attributes'];
                unset($params['attributes']);
            }
    
            // Deprecated legacy support for the anchor_class option
            // Should be removed in CI 3.1+
            if (isset($params['anchor_class']))
            {
                empty($params['anchor_class']) OR $attributes['class'] = $params['anchor_class'];
                unset($params['anchor_class']);
            }
    
            $this->_parse_attributes($attributes);
    
            if (count($params) > 0)
            {
                foreach ($params as $key => $val)
                {
                    if (isset($this->$key))
                    {
                        $this->$key = $val;
                    }
                }
            }
        }
    
        // --------------------------------------------------------------------
    
        /**
         * Generate the pagination links
         *
         * @return  string
         */
        public function create_links()
        {
            // If our item count or per-page total is zero there is no need to continue.
            if ($this->total_rows === 0 OR $this->per_page === 0)
            {
                return '';
            }
    
            // Calculate the total number of pages
            $num_pages = (int) ceil($this->total_rows / $this->per_page);
    
            // Is there only one page? Hm... nothing more to do here then.
            if ($num_pages === 1)
            {
                //$uri_page_number = 1;
                //return '';
            }
    
            // Set the base page index for starting page number
            $base_page = ($this->use_page_numbers) ? 1 : 0;
    
            // Determine the current page number.
            $CI =& get_instance();
    
            // See if we are using a prefix or suffix on links
            if ($this->prefix !== '' OR $this->suffix !== '')
            {
                $this->cur_page = (int) str_replace(array($this->prefix, $this->suffix), '', $CI->uri->rsegment($this->uri_segment));
            }
    
            if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
            {
                if ($CI->input->get($this->query_string_segment) != $base_page)
                {
                    $this->cur_page = (int) $CI->input->get($this->query_string_segment);
                }
            }
            elseif ( ! $this->cur_page && $CI->uri->segment($this->uri_segment) !== $base_page)
            {
                $this->cur_page = (int) $CI->uri->rsegment($this->uri_segment);
            }
    
            // Set current page to 1 if it's not valid or if using page numbers instead of offset
            if ( ! is_numeric($this->cur_page) OR ($this->use_page_numbers && $this->cur_page === 0))
            {
                $this->cur_page = $base_page;
            }
    
            $this->num_links = (int) $this->num_links;
    
            if ($this->num_links < 1)
            {
                show_error('Your number of links must be a positive number.');
            }
    
            // Is the page number beyond the result range?
            // If so we show the last page
            if ($this->use_page_numbers)
            {
                if ($this->cur_page > $num_pages)
                {
                    $this->cur_page = $num_pages;
                }
            }
            elseif ($this->cur_page > $this->total_rows)
            {
                $this->cur_page = ($num_pages - 1) * $this->per_page;
            }
    
            $uri_page_number = $this->cur_page;
    
            if ( ! $this->use_page_numbers)
            {
                $this->cur_page = (int) floor(($this->cur_page/$this->per_page) + 1);
            }
    
            // Calculate the start and end numbers. These determine
            // which number to start and end the digit links with
            $start  = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;
            $end    = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;
    
            // Is pagination being used over GET or POST? If get, add a per_page query
            // string. If post, add a trailing slash to the base URL if needed
            if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
            {
                $segment = (strpos($this->base_url, '?')) ? '&amp;' : '?';
                $this->base_url = rtrim($this->base_url).$segment.$this->query_string_segment.'=';
            }
            else
            {
                $this->base_url = rtrim($this->base_url, '/') .'/';
            }
    
            // And here we go...
            $output = '';
            $query_string = '';
    
            // Add anything in the query string back to the links
            // Note: Nothing to do with query_string_segment or any other query string options
            if ($this->reuse_query_string === TRUE)
            {
                $get = $CI->input->get();
    
                // Unset the controll, method, old-school routing options
                unset($get['c'], $get['m'], $get[$this->query_string_segment]);
    
                if ( ! empty($get))
                {
                    // Put everything else onto the end
                    $query_string = (strpos($this->base_url, '?') !== FALSE ? '&amp;' : '?')
                            .http_build_query($get, '', '&amp;');
    
                    // Add this after the suffix to put it into more links easily
                    $this->suffix .= $query_string;
                }
            }
    
            // Render the "First" link
            if ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1))
            {
                $first_url = ($this->first_url === '') ? $this->base_url : $this->first_url;
    
                // Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
                $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, 1);
    
                $output .= $this->first_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('start').'>'
                    .$this->first_link.'</a>'.$this->first_tag_close;
            }
    
            // Render the "previous" link
            if ($this->prev_link !== FALSE && $this->cur_page !== 1)
            {
                $i = ($this->use_page_numbers) ? $uri_page_number - 1 : $uri_page_number - $this->per_page;
    
                // Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
                $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
    
                if ($i === $base_page && $this->first_url !== '')
                {
                    $output .= $this->prev_tag_open.'<a href="'.$this->first_url.$query_string.'"'.$attributes.$this->_attr_rel('prev').'>'
                        .$this->prev_link.'</a>'.$this->prev_tag_close;
                }
                else
                {
                    $append = ($i === $base_page) ? $query_string : $this->prefix.$i.$this->suffix;
                    $output .= $this->prev_tag_open.'<a href="'.$this->base_url.$append.'"'.$attributes.$this->_attr_rel('prev').'>'
                        .$this->prev_link.'</a>'.$this->prev_tag_close;
                }
    
            } 
    // !!!!!!!! START EDITION !!!!!!!!!!
            elseif ($this->display_prev_link && $this->cur_page === 1) {
                    $output .= $this->prev_tag_open.'<span>'.$this->prev_link.'</span>'.$this->next_tag_close;
                }
    // !!!!!!!! END EDITION !!!!!!!!!!
    
            // Render the pages
            if ($this->display_pages !== FALSE)
            {
                // Write the digit links
                for ($loop = $start -1; $loop <= $end; $loop++)
                {
                    $i = ($this->use_page_numbers) ? $loop : ($loop * $this->per_page) - $this->per_page;
    
                    // Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
                    $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
    
                    if ($i >= $base_page)
                    {
                        if ($this->cur_page === $loop)
                        {
                            $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
                        }
                        else
                        {
                            $n = ($i === $base_page) ? '' : $i;
                            if ($n === '' && ! empty($this->first_url))
                            {
                                //$output .= $this->num_tag_open.'<a href="'.$this->first_url.$query_string.'"'.$attributes.$this->_attr_rel('start').'>'
                                //  .$loop.'</a>'.$this->num_tag_close;
                            }
                            else
                            {
                                $append = ($n === '') ? $query_string : $this->prefix.$n.$this->suffix;
                                $output .= $this->num_tag_open.'<a href="'.$this->base_url.$append.'"'.$attributes.$this->_attr_rel('start').'>'
                                    .$loop.'</a>'.$this->num_tag_close;
                            }
                        }
                    }
                }
            }
    
            // Render the "next" link
            if ($this->next_link !== FALSE && $this->cur_page < $num_pages)
            {
                $i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page;
    
                // Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
                $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
    
                $output .= $this->next_tag_open.'<a href="'.$this->base_url.$this->prefix.$i.$this->suffix.'"'.$attributes
                    .$this->_attr_rel('next').'>'.$this->next_link.'</a>'.$this->next_tag_close;
            } 
    // !!!!!!!! START EDITION !!!!!!!!!!
            elseif ($this->display_next_link && $this->cur_page >= $num_pages) {
                $output .= $this->next_tag_open.'<span>'.$this->next_link.'</span>'.$this->next_tag_close;
            }
    // !!!!!!!! END EDITION !!!!!!!!!!
    
            // Render the "Last" link
            if ($this->last_link !== FALSE && ($this->cur_page + $this->num_links) < $num_pages)
            {
                $i = ($this->use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page;
    
                // Take the general parameters, and squeeze this pagination-page attr in there for JS fw's
                $attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
    
                $output .= $this->last_tag_open.'<a href="'.$this->base_url.$this->prefix.$i.$this->suffix.'"'.$attributes.'>'
                    .$this->last_link.'</a>'.$this->last_tag_close;
            }
    
            // Kill double slashes. Note: Sometimes we can end up with a double slash
            // in the penultimate link so we'll kill all double slashes.
            $output = preg_replace('#([^:])//+#', '\\1/', $output);
    
            // Add the wrapper HTML if exists
            return $this->full_tag_open.$output.$this->full_tag_close;
        }
    
        // --------------------------------------------------------------------
    
        /**
         * Parse attributes
         *
         * @param   array   $attributes
         * @return  void
         */
        public function _parse_attributes($attributes)
        {
            isset($attributes['rel']) OR $attributes['rel'] = TRUE;
            $this->_link_types = ($attributes['rel'])
                        ? array('start' => 'start', 'prev' => 'prev', 'next' => 'next')
                        : array();
            unset($attributes['rel']);
    
            $this->_attributes = '';
            foreach ($attributes as $key => $value)
            {
                $this->_attributes .= ' '.$key.'="'.$value.'"';
            }
        }
    
        // --------------------------------------------------------------------
    
        /**
         * Add "rel" attribute
         *
         * @link    http://www.w3.org/TR/html5/links.html#linkTypes
         * @param   string  $type
         * @return  string
         */
        public function _attr_rel($type)
        {
            if (isset($this->_link_types[$type]))
            {
                unset($this->_link_types[$type]);
                return ' rel="'.$type.'"';
            }
    
            return '';
        }
    
    }
    
    /* End of file Pagination.php */
    /* Location: ./system/libraries/Pagination.php */
    

    并且不要忘记根据您的需要将$config['$display_prev_link']$config['$display_next_link']设置为truefalse

    祝你好运!

答案 1 :(得分:5)

示例:http://www.friv100flash.com/

$config['base_url'] = base_url(); // xác định trang phân trang
$config['total_rows'] = $this->Game_model->count_all(); // xác định tổng số record
$config['per_page'] = 120; // xác định số record ở mỗi trang
$config['uri_segment'] = 1; // xác định segment chứa page number
$config['num_links'] = 7;

$config['display_pages'] = TRUE;
$config['use_page_numbers'] = TRUE;

//Encapsulate whole pagination 
$config['full_tag_open'] = '<ul class="pagination">';
$config['full_tag_close'] = '</ul>';

//First link of pagination
$config['first_link'] = 'First';
$config['first_tag_open'] = '<li>>';
$config['first_tag_close'] = '</li>';

//Customizing the “Digit” Link
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';

//For PREVIOUS PAGE Setup
$config['prev_link'] = 'prev';
$config['prev_tag_open'] = '<li>';
$config['prev_tag_close'] = '</li>';

//For NEXT PAGE Setup
$config['next_link'] = 'Next';
$config['next_tag_open'] = '<li>';
$config['next_tag_close'] = '</li>';

//For LAST PAGE Setup
$config['last_link'] = 'Last';
$config['last_tag_open'] = '<li>';
$config['last_tag_close'] = '</li>';

//For CURRENT page on which you are
$config['cur_tag_open'] = '<li class="active"><a href="#">';
$config['cur_tag_close'] = '</a></li>';
$this->pagination->initialize($config);

if($this->uri->segment(1) == 0)
{
    $offset = 0;
}
else
{
    $offset = ($config['per_page'])*($this->uri->segment(1)-1);
}

答案 2 :(得分:0)

CI \ SYSTEM \库\ Pagination.php

    if  ($this->prev_link !== FALSE AND $this->cur_page != 1)
    {
        if ($this->use_page_numbers)
        {
            $i = $uri_page_number - 1;
        }
        else
        {
            $i = $uri_page_number - $this->per_page;
        }


        if ($i == 0 && $this->first_url != '')
        {
            $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
        }
        else
        {
            $i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix;
            $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
        }

    }

之后(ADD LAST 3 LINE)

    if  ($this->prev_link !== FALSE AND $this->cur_page != 1)
    {
        if ($this->use_page_numbers)
        {
            $i = $uri_page_number - 1;
        }
        else
        {
            $i = $uri_page_number - $this->per_page;
        }


        if ($i == 0 && $this->first_url != '')
        {
            $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
        }
        else
        {
            $i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix;
            $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
        }

    }
    else{
         $output .= '<span class="hidden">'.$this->prev_link.'</span>';
    }

答案 3 :(得分:0)

Codeigniter Pagination Library pagination.php

class CI_Pagination { 

public $limit;

public $active_page;

public $query;

public $url;

function run_query(){
  $CI= &get_instance();
  $query= $CI->db->query($this->query)->result_array();
  return $query;  
}

function result(){
  $CI= &get_instance();
  $limit_start=($this->active_page - 1) * $this->limit;
  $limit_end=$this->limit;
  $query=$this->query.' order by id desc limit '.$limit_start.','.$limit_end;
  $query= $CI->db->query($query)->result_array();
  return $query; 
}

function size(){
  return sizeof($this->run_query());
}


function page_number(){
    ?>
    <ul class="pagination  no-margin">
        <li class="prev <?php if($this->active_page <= '1'){echo 'disabled';}else{echo '';} ?>">
            <a href="<?= $this->url ?>page=<?= $this->active_page-1 ?>">
                <i class="ace-icon fa fa-angle-double-left"></i>
            </a>
        </li>

        <?php 

            if($this->active_page >=10){$i=$this->active_page-8;}else{$i=2;} 

            $end_point=ceil($this->size()/$this->limit);
        ?>

        <li class="<?php if($this->active_page==$i){echo 'active';} ?>">
            <a href="<?= $this->url ?>page=1">1</a>
        </li>

        <li class="<?php if($this->active_page<=10){echo 'hide';} ?>">
            <a href="<?= $this->url ?>page=<?= $this->active_page-1 ?>">...</a>
        </li>

        <?php $n=1; for($i;$i<=$end_point-1;$i++){ if($n++ >=10){break;}?>

            <li class="<?php if($this->active_page==$i){echo 'active';} ?>">
                <a href="<?= $this->url ?>page=<?= $i ?>"><?= $i ?></a>
            </li>

        <?php } ?>

        <li class="<?php if($this->active_page>=($end_point-5)){echo 'hide';} ?>">
                <a href="<?= $this->url ?>page=<?= $this->active_page+1 ?>">...</a>
        </li>

        <li class="<?php if($this->active_page==$i){echo 'active';} ?>">
                <a href="<?= $this->url ?>page=<?= $end_point .'">'. $end_point ?></a>
        </li>

        <li class="next <?php if($this->active_page >=ceil($this->size()/$this->limit)){echo'disabled';}?>">
            <a href="<?= $this->url ?>page=<?= $this->active_page+1 ?>">
                <i class="ace-icon fa fa-angle-double-right"></i>
            </a>
        </li>
    </ul>
<?php
}

}

在Codeigniter控制器中

$this->load->library('pagination');
        $this->pagination->active_page = $page;
        $this->pagination->url = base_url('admins/popup?');
        $this->pagination->limit='50';
        $this->pagination->query='select * from contact where admin_id like "%'.$data["client_id"][0]["client_id"].'%"';
        $this->pagination->run_query();
        $data['pagination_data'] = $this->pagination->result();

IN Codeigniter视图:

foreach ($pagination_data as $fet) { }
$this->pagination->page_number();

Jquery:

$(document).ready(function(){
            if($('#example >tbody >tr').length <=0){
              var row= document.getElementById("example").insertRow(-1);
              var cell1 = row.insertCell(0).colSpan=12;
              var cell1 = row.insertCell(0);
              cell1.innerHTML = "Result Not Found !";
            }
        });