CodeIgniter:分页没有问号?

发布于 2024-12-19 12:42:49 字数 2067 浏览 1 评论 0原文

下面的代码使用查询字符串生成分页。但是,没有前导 ?。所以,我得到这样的信息:http://localhost/index.php/search/&limit=10有什么想法吗?

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());

编辑1:

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

编辑2:

文档似乎表明我所做的应该有效:http://codeigniter.com/user_guide/libraries/pagination.html

$config[ 'page_query_string'] = TRUE;

默认情况下,分页库假设您正在使用 URI 段,并构建类似的链接

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

如果您将 $config['enable_query_strings'] 设置为 TRUE,您的链接将自动重新- 使用查询字符串编写。也可以显式设置此选项。使用 $config['page_query_string'] 设置为 TRUE,分页链接将变为。

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧情勿念 2024-12-26 12:42:49

我自己也遇到过这个。使用查询字符串时,CodeIgniter 必须假设您有其他查询字符串参数(但是,CI 假设您正在使用查询字符串参数来映射控制器和方法...)。我喜欢使用查询字符串来处理过滤结果等内容,同时仍然使用 URI 中的基本路由选项(就像您一样)。

我不得不忍受?&就个人而言,但我想你可以像这样扩展分页库(长函数,抱歉):

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('?&', '?', rtrim($this->base_url).'&'.$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;
}
}

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('?&', '?', rtrim($this->base_url).'&'.$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;
}
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文