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?
есть идеи?
Вы пробовали реализовать функцию _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);