Фильтровать, сортировать и разбивать на страницы в Codeigniter - PullRequest
3 голосов
/ 12 марта 2010

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

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

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

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?

есть идеи?

Ответы [ 6 ]

3 голосов
/ 12 марта 2010

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

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

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

URL отформатированы так:

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

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

По умолчанию библиотека разбивки на страницы 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 голосов
/ 21 марта 2013

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

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

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

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

$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);
0 голосов
/ 04 апреля 2012

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

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, выполняют сортировку и нумерацию страниц.

0 голосов
/ 12 марта 2010

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

0 голосов
/ 12 марта 2010

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

URL-адрес, подобный этому, выглядит немного взломанным:

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

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

...