CodeIgniter: pagination doesn't have question

2019-06-21 23:11发布

问题:

The code below generates pagination using query strings. However, there is no leading ?. So, I get something like this: http://localhost/index.php/search/&limit=10. Any ideas why?

this->load->library('pagination');

$config                   = array();
$config['base_url']       = 'http://localhost/index.php/search/';
$config['total_rows']     = 200;
$config['per_page']       = 10;
$config['num_links']      = 4;

$config['full_tag_open']  = '<ol>';
$config['full_tag_close'] = '</ol>';

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

$config['last_link']      = 'Last';
$config['last_tag_open']  = '<li>';
$config['last_tag_close'] = '</li>';

$config['next_link']      = 'Next';
$config['next_tag_open']  = '<li>';
$config['next_tag_close'] = '</li>';

$config['prev_link']      = 'Previous';
$config['prev_tag_open']  = '<li>';
$config['prev_tag_close'] = '</li>';

$config['cur_tag_open']  = '<li class="active">';
$config['cur_tag_close'] = '</li>';

$config['num_tag_open']  = '<li>';
$config['num_tag_close'] = '</li>';

$this->pagination->initialize($config);
echo ($this->pagination->create_links());

EDIT 1:

http://codeigniter.com/forums/viewthread/161263/

EDIT 2:

The docs seem to suggest that what I did should work: http://codeigniter.com/user_guide/libraries/pagination.html

$config['page_query_string'] = TRUE;

By default, the pagination library assume you are using URI Segments, and constructs your links something like

http://example.com/index.php/test/page/20

If you have $config['enable_query_strings'] set to TRUE your links will automatically be re-written using Query Strings. This option can also be explictly set. Using $config['page_query_string'] set to TRUE, the pagination link will become.

http://example.com/index.php?c=test&m=page&per_page=20

回答1:

I've run into this myself. When using query strings, CodeIgniter has to assume you have other query string parameters (BUT, CI assumes you're using query string parameters to map your controller and method...). I like using query string for stuff like filtering results and such, while still using the basic routing options in the URI (like you).

I've had to live with the ?& personally, but I suppose you could extend the Pagination library like so (long function, sorry):

class MY_Pagination extends CI_Pagination {
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 = ceil($this->total_rows / $this->per_page);

    // Is there only one page? Hm... nothing more to do here then.
    if ($num_pages == 1)
    {
        return '';
    }

    // Determine the current page number.
    $CI =& get_instance();

    if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
    {
        if ($CI->input->get($this->query_string_segment) != 0)
        {
            $this->cur_page = $CI->input->get($this->query_string_segment);

            // Prep the current page - no funny business!
            $this->cur_page = (int) $this->cur_page;
        }
    }
    else
    {
        if ($CI->uri->segment($this->uri_segment) != 0)
        {
            $this->cur_page = $CI->uri->segment($this->uri_segment);

            // Prep the current page - no funny business!
            $this->cur_page = (int) $this->cur_page;
        }
    }

    $this->num_links = (int)$this->num_links;

    if ($this->num_links < 1)
    {
        show_error('Your number of links must be a positive number.');
    }

    if ( ! is_numeric($this->cur_page))
    {
        $this->cur_page = 0;
    }

    // Is the page number beyond the result range?
    // If so we show the last page
    if ($this->cur_page > $this->total_rows)
    {
        $this->cur_page = ($num_pages - 1) * $this->per_page;
    }

    $uri_page_number = $this->cur_page;
    $this->cur_page = 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)
    {
        $this->base_url = str_replace('?&amp;', '?', rtrim($this->base_url).'&amp;'.$this->query_string_segment.'=');
    }
    else
    {
        $this->base_url = rtrim($this->base_url, '/') .'/';
    }

    // And here we go...
    $output = '';

    // Render the "First" link
    if  ($this->first_link !== FALSE AND $this->cur_page > ($this->num_links + 1))
    {
        $first_url = ($this->first_url == '') ? $this->base_url : $this->first_url;
        $output .= $this->first_tag_open.'<a '.$this->anchor_class.'href="'.$first_url.'">'.$this->first_link.'</a>'.$this->first_tag_close;
    }

    // Render the "previous" link
    if  ($this->prev_link !== FALSE AND $this->cur_page != 1)
    {
        $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;
        }

    }

    // Render the pages
    if ($this->display_pages !== FALSE)
    {
        // Write the digit links
        for ($loop = $start -1; $loop <= $end; $loop++)
        {
            $i = ($loop * $this->per_page) - $this->per_page;

            if ($i >= 0)
            {
                if ($this->cur_page == $loop)
                {
                    $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
                }
                else
                {
                    $n = ($i == 0) ? '' : $i;

                    if ($n == '' && $this->first_url != '')
                    {
                        $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$loop.'</a>'.$this->num_tag_close;
                    }
                    else
                    {
                        $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix;

                        $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close;
                    }
                }
            }
        }
    }

    // Render the "next" link
    if ($this->next_link !== FALSE AND $this->cur_page < $num_pages)
    {
        $output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.($this->cur_page * $this->per_page).$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close;
    }

    // Render the "Last" link
    if ($this->last_link !== FALSE AND ($this->cur_page + $this->num_links) < $num_pages)
    {
        $i = (($num_pages * $this->per_page) - $this->per_page);
        $output .= $this->last_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$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
    $output = $this->full_tag_open.$output.$this->full_tag_close;

    return $output;
}
}