Фильтровать, сортировать и разбивать на страницы в Codeigniter

Ive недавно начал использовать CodeIgniter, поскольку я искал очень легкий фреймворк, и, похоже, он стал лучшим выбором.

Я новичок во всей работе MVC, наслаждаясь этим, но я застрял с чем-то, что кажется очень простым.

Я кодирую CMS и нуждаюсь в способе фильтрации, сортировки и разбиения на страницы результатов. Я привык делать это с querystrings, поэтому у меня было бы что-то вроде:

articles.php?order=title&sort=desc&filter=articletitle&page=5 

Я понятия не имею, как это сделать в CI, поэтому я просто включил EnableQueryStrings в конфиге, и он отлично работает, но я чувствую, что это, вероятно, не самое элегантное решение.

Полагаю, я мог бы

 index.php/articles/index/order/title/sort/desc/filter/articletitle/page/5 

но для меня это кажется очень негибким, что, если, например, мне не нужно сортировать, как бы я удостоверился, что я смотрю на правильный сегмент uri?

есть идеи?

Related of "Фильтровать, сортировать и разбивать на страницы в Codeigniter"

Вы пробовали реализовать функцию _remap ? Он перенаправляет все запросы к контроллеру на эту функцию, позволяя реализовать столько (или как мало) тех, которые вам нравятся.

Тогда вы могли бы сделать что-то вроде этого:

 class Articles extends Controller { // Note: No need for a "order" or even an "index" function! public function _remap() { $assoc = $this->uri->uri_to_assoc( 4 ); /* $assoc is now array( "order"=>"title", "sort"=>"desc", "filter"=>"articletitle", "page"=>5); */ } } 

Я столкнулся с этой проблемой много раз и, наконец, решил попробовать ее правильно.

Мое решение включает в себя подход комбинированного пути / запроса строки (для этого требуется решение, подобное тому, с которым связан Стивен ).

URL-адреса отформатированы следующим образом:

http://www.myapp.dev/controller/index/10?order_by=id+asc&status=open

Эти необязательные параметры $ _GET могут быть затем использованы в качестве условий запроса, и вы можете использовать столько, сколько хотите, не закручивая смещение страницы.

По умолчанию библиотека Pagination от CodeIgniter не поддерживает размещение смещения до конца URI. Хитрость для получения поддержки CI заключается в расширении библиотеки разбиения на страницы так: http://pastie.org/1393513

Затем в вашем контроллере вы можете инициализировать разбивку на страницы так:

 $config['url_format'] = site_url('controller/index/{offset}?'.http_build_query($params)); $config['total_rows'] = $this->model->count_rows(); $config['per_page'] = 5; $this->pagination->initialize($config); 

Обратите внимание, что никакой uri_segment не требуется, поскольку настраиваемый метод Pagination :: initialize обнаруживает его на основе того, где {offset} попадает в строку url_format .

Ссылки, которые построены с помощью $this->pagination->create_links() , вставляют смещение в нужное место и сохраняют строку запроса хвоста.

Мне не нравится тот факт, что CodeIgniter разрушает строку запроса. Строка запроса отлично подходит для дополнительных параметров. Попытка поставить необязательные параметры в сегментах URI, и все начинает становиться странным.

Такой URL-адрес кажется немного взломанным:

 index.php/articles/index/order/title/sort/desc/filter/articletitle/page/5 

По этой причине я настраиваю CodeIgniter для использования смеси сегментов URI и строки запроса. Этот ответ показывает, как вы можете это достичь.

Немного неудобно, что вы не можете использовать строки запроса по умолчанию. Я преодолел это в своем текущем проекте в нескольких областях, отправив предпочтение сортировки в сообщение формы, а затем сохраняя это предпочтение в сеансе пользователя.

Вы всегда можете сделать что-то вроде:

 www.yourdomain.com/articles/order-title/sort-desc/filter-articletitle/page-5 

удалив index.php с .htaccess. Затем просто взорвайтесь на «-» для каждого сегмента URI.

 $order = $this->uri->segment(2, 0); $sort = $this->uri->segment(3, 0); $filter = $this->uri->segment(4,0); $page = $this->uri->segment(5, 0; if(!empty($order)){ $order = explode('-', $order); } else { $order = 'defaultorder'; } /** And so on for the rest of the URI segments **/ 

или даже удалить весь взрыв из уравнения и просто сделать:

 www.yourdomain.com/articles/title/desc/articletitle/5 $order = $this->uri->segment(2, 0); $sort = $this->uri->segment(3, 0); $filter = $this->uri->segment(4,0); $page = $this->uri->segment(5, 0; 

Вот как большинство основных компаний, использующих Code Igniter, выполняют свою сортировку и разбивку на страницы.

Лично я большой поклонник или комбинация строк / строк запроса, предложенная Лу, но я думаю, что у меня есть более простой метод, чем его.

Мое решение помещает параметр страницы в строку запроса вместе с вашими параметрами фильтрации, например

 http://mysite.com/admin/contacts?status=open&per_page=20 

Он работает благодаря опции page_query_string класса pagination. Вот:

 $query_string = some_function_to_get_your_filter_query_string_params(); $config['base_url'] = site_url("admin/contacts?". $query_string); $config['total_rows'] = $total_rows; $config['per_page'] = $per_page; $config['page_query_string'] = TRUE; $this->pagination->initialize($config);