how to create pagination for url with parameters i

2020-07-23 05:51发布

问题:

we have an application which has page's result on the bases of certain parameters like domain.com/index.php/welcome/student/male here welcome is controller student is method name male is parameter, now we want pagination for this, but the problem is a person can also use sub category like this domain.com/index.php/welcome/student/male/steven where steven is another parameter, how to create pagination for this type of urls. Thank you in advance :)

回答1:

Some problems when having optional parameters along with pagination:

  1. The placement of pagination offset changes in the URL based on the number of provided parameters.
  2. If optional parameters are not set, the pagination offset will act as a parameter.

Method 1:
Use query strings for pagination:

function student($gender, $category = NULL) {
    $this->load->library('pagination');
    $config['page_query_string'] = TRUE;
    $config['query_string_segment'] = 'offset';

    $config['base_url'] = base_url().'test/student/'.$gender;
    // add the category if it's set
    if (!is_null($category)) 
        $config['base_url'] = $config['base_url'].'/'.$category;

    // make segment based URL ready to add query strings
    // pagination library does not care if a ? is available
    $config['base_url'] = $config['base_url'].'/?';


    $config['total_rows'] = 200;
    $config['per_page'] = 20;
    $this->pagination->initialize($config);

    // requested page:
    $offset = $this->input->get('offset');

    //...
}

Method 2:
Assuming the category would never be a number and if the last segment is a numeric value then it's the pagination offset not a function's parameter:

function student($gender, $category = NULL) {
    // if the 4th segment is a number assume it as pagination rather than a category
    if (is_numeric($this->uri->segment(4))) 
        $category = NULL;

    $this->load->library('pagination');
    $config['base_url'] = base_url().'test/student/'.$gender;
    $config['uri_segment'] = 4;

    // add the category if it's set
    if (!is_null($category)) {
        $config['uri_segment'] = $config['uri_segment'] + 1;
        $config['base_url'] = $config['base_url'].'/'.$category;
    }

    $config['total_rows'] = 200;
    $config['per_page'] = 20;
    $this->pagination->initialize($config);

    // requested page:
    $offset = ($this->uri->segment($config['uri_segment'])) ? $this->uri->segment($config['uri_segment']) : 1;

    //...
}   

I prefer the first method because it does not interfere with function parameters and it would be easier to implement the pagination support at an abstract level.



回答2:

I worked around with codeigniter but i think that maybe you have to use config/routes.php. For example with:

$route['^(bar1|bar2)/routes/(:any)/(:any)'] = "routes/get_bar/$2/$3";

you could write a function in controller (in this case routes) like this:

public function get_bar($bar1 = null, $bar2 = null)

I hope this help you Regards!