5
votes

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 approach, 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.

3
Hi. I want to ask you how did u implement the hash for filters? I also have filter and pagination, and I like your solution here. Thank you!Marko Aleksić

3 Answers

3
votes

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.

1
votes

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

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