2010-03-11 4 views
3

Ive недавно начал использовать CodeIgniter, поскольку я искал очень легкий фреймворк, и, похоже, он стал лучшим выбором.Фильтр, сортировка и разбиение на страницы в 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 

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

любые идеи?

ответ

3

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

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

URL-адрес, как это кажется немного хака:

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

По этой причине я устанавливаю CodeIgniter использовать смесь сегментов URI и строку запроса. This answer shows you how you can achieve this.

0

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

2

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

Мое решение включает в себя подход комбинации/запроса строки (для этого требуется a solution like the one Stephen linked to).

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

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

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

По умолчанию библиотека разбиения 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(), вставляют смещение в соответствующем месте и сохраняют строку запроса хвоста.

0

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

путем удаления 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; 

Это как наиболее крупный бизнес, которые используют код воспламенитель сделать их сортировку и разбиение на страницы.

0

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

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

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); 
Смежные вопросы