Question

I've been developing a site over the past few weeks using CodeIgniter as the framework. I've been thinking of the best way to accomplish something, which in a lot of other frameworks in other languages is relatively simple: sortable tables. CodeIgniter switches off query strings by default, because your URLs contain method parameters. So a URL might look like:

/controller/method/param1/param2

You might think that you could just add in sortBy and sortOrder as two additional parameters to the controller method. I don't particularly want to do that, mainly because I want to have a re-usable controller. When you use query string parameters, PHP can easily tell you whether there is a parameter called sortBy. However, when you're using URL based parameters, it will vary with each controller.

I was wondering what my options were. As far as I can see they are something like:

  • Pass in my sortBy and sortOrder parameters, just suck it up, and develop some less-than-reusable component for it.
  • Have an additional controller, which will store the sortBy and sortOrder in the session (although it would have to know where you came from, and send you back to the original page).
  • Have some kind of AJAX function, which would call the controller above; then reload the page.
  • Hack CodeIgniter to turn query strings back on. Actually, if this is the only option, any links to how to do this would be appreciated.

I just can't quite believe such a simple task would present such a problem! Am I missing something? Does anyone have any recommendations?


Edit for clarification: I love jQuery, and I'm already using it on the site, so TableSorter is a good option. However, I would like to do server-side sorting as there are some pages with potentially large numbers of results, including pagination.

Was it helpful?

Solution

I have been using this method: http://codeigniter.com/forums/viewthread/45709/#217816

I also expanded it to set cookies based off the sort so when someone comes back the table is sorted the same as before.

OTHER TIPS

If you're OK with sorting on the client side, the Tablesorter plugin for jQuery is pretty nice.

I ran into this with a fairly complex table. The hard part was that the table could grow/shrink depending on certain variables!! Big pain :(

Here's how I handled it..

Adjusted system/application/config/config.php to allow the comma character in the URI:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-,';

Adjust my controller with a sorting function:

function sorter() {
  //get the sort params
  $sort = explode(",",$this->uri->segment(3)); //the 3rd segment is the column/order
  //pass the params to the model
  $data = $this->model_name->get_the_data($sort[0],$sort[1]);
  $this->_show($data);
}
function _show($data) {
  //all the code for displaying your table
}

I've oversimplified, but you get the idea. The purpose is to have a url like this:

/controller/sorter/columnname,sortorder

The sorter function calls another internal function to deal with the display/template/view logic - it's job is to deal with the sorting call and get the appropriate data from the model.

Of course, this could be reduced to just your current function:

function showGrid() {
  $sort = $this->uri->segment(3);
  if ($sort) {
    //get the data sorted
  } else {
    //get the data the default way
  }
  //rest of your view logic
}

That way, you don't even need a separate function - and can use the third segment to define your sorting.

I have been using this: http://net.tutsplus.com/tutorials/php/codeigniter-from-scratch-displaying-sorting-tabular-data/

from net.tutsplus.com

Unfortunately it is using what you don't like (/controller/method/param1/param2) but I have added this (the display function) for every controller when I need pagination. Or make a helper from it.

Other example is here: http://www.robertmullaney.com/2010/09/19/tablerecord-sorting-made-easier-for-codeigniter/

I recently added this Table sorter (which uses Prototype) to a bunch of my pages. It's fast and pretty easy to implement.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top