开发者

Losing URI segments when paginating with CodeIgniter

I have a /payments interface where the user should be able to filter via price range, bank, and other stuff. Those filters are standard select boxes. When I submit the filter form, all the post data goes to another method called payments/search. That method performs the validation, saves the post values into a session flashdata and redirects the user back to /payments passing the flashdata name via URL.

So my standard pagination links with no filters are exactly like this:

payments/index/20/
payments/index/40/
payments/index/60/

And if you submit the filter form, the returning URL is:

payments/index/0/b48c7cbd5489129a337b0a24f830fd93

This works just great. If I change the zero for something else, it paginates just fine. The only issue however is that the << 1 2 3 4 >> page links wont keep the hash after the pagination offset. CodeIgniter is generating the page links ignoring that additional uri segment.

My uri_segment config is already set to 3:

$config['uri_segment'] = 3;

I cannot set uri_segment to 4 because that hash may or may not exists. Any ideas of how can I solve this? Is it mandatory for CI to have the offset as the last segment in the uri? Maybe I am trying an incorrect app开发者_如何学运维roach, so I am all ears.

Thank you folks.

edit: Why am I passing the flashdata name via uri you might ask? because it allows the user to open several browser tabs and do different searches in each tab. For each filtering you do, a new flashdata var is generated.


Just for users coming from Google, here is the solution:

In the pagination config array, I changed my base_url for this:

$config['base_url'] = site_url('payments/index/' . $this->uri->segment(3) . '/' . $this->uri->segment(4));

Where segment(3) is my offset number and segment(4) is the hash. So, in this case, the hash may or may not exists and the pagination will still work.

Another approach could be this: If you go to payments, and there is no flashdata ID in the URL, it redirects the user to payments/search and create an empty array with empty filters. Then it redirects back to payments/_NEW_FLASHDATA_ID_HERE_. This way, the URL will always have a flashdata ID in the URL and you can have the pagination offset in the last URI segment as usual.


Why not set the hash as a session item?

$this->session->set_userdata('session_flashdata_hash', $hash);

The hash will then be available until you unset it

$this->session->unset_userdata('session_flashdata_hash');

Or until you destroy the session.

$this->session->sess_destroy();


Why aren't you checking to see if the hash exists and set the uri_segment based on that?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜