Пагинация не корректно отображает номера страниц Codeigniter

Моя функция контроллера

function test($start_from = 0)
{
    $this->load->library('pagination');

    $data = array();

    $per_page = 3;
    $total = $this->activity_model->count_by();

    $config['base_url'] = base_url() . 'test';
    $config['total_rows'] = $total;
    $config['per_page'] = $per_page;
    $config['uri_segment'] = 2;
    $config['num_links'] = 2;
    $config['use_page_numbers'] = TRUE;

    $data['follow'] = $this->activity_model->get($per_page, $start_from);

   $this->pagination->initialize($config); 

   $data['pagination'] = $this->pagination->create_links();

    $this->load->view('front_end/test' ,$data);
}

мой маршрут:

 $route['test'] = "user_activity/test";
 $route['test/(:any)'] = "user_activity/test/$1";

модель :

 function get($limit,$start_from)
 {
 $sql = "SELECT * FROM user_follow LIMIT $start_from, $limit";

  $query = $this->db->query($sql);
  return $query->result_array();
 }

Проблема в том, что у меня есть разбиение на страницы 1,2,3,4,5.... и на каждой странице я отображаю 3 элемента. Я хочу сделать это в URL-адресе, чтобы показать номера моих страниц 1,2,3,4,5

Когда я нажимаю URL-адрес второй страницы, отображается 3 Когда я нажимаю URL-адрес третьей страницы, отображается 6 и так далее +3

возможно ли, я часами ищу советы в Интернете, но ничего, насколько я понимаю [code]$config['use_page_numbers'] = TRUE;[/code] делаю то, что мне нужно, но в моем случае это все равно не работает.

Может посоветуете какую-нибудь библиотеку?


person Viktors    schedule 28.01.2012    source источник


Ответы (3)


Внесите следующие изменения в класс Pagination (/system/libraries/Pagination.php), чтобы он использовал номера страниц вместо смещений.

СТАРЫЙ (строки 146–153):

if ($CI->uri->segment($this->uri_segment) != 0)
{
     $this->cur_page = $CI->uri->segment($this->uri_segment);

    // Prep the current page - no funny business!
    $this->cur_page = (int) $this->cur_page;
} 

НОВОЕ:

Добавьте опцию «else» в оператор if, чтобы убедиться, что значение по умолчанию; страница = 1.

if ($CI->uri->segment($this->uri_segment) != 0)
{
    $this->cur_page = $CI->uri->segment($this->uri_segment);

    // Prep the current page - no funny business!
    $this->cur_page = (int) $this->cur_page;
}
else
{
    $this->cur_page = 1;
} 

СТАРЫЙ (строка 175):

$this->cur_page = floor(($this->cur_page/$this->per_page) + 1); 

НОВОЕ:

Просто закомментируйте эту строку, чтобы текущая страница подчинялась контроллеру/URI.

//$this->cur_page = floor(($this->cur_page/$this->per_page) + 1); 

СТАРЫЙ (строка 206):

$i = $uri_page_number - $this->per_page; 

НОВОЕ:

Предыдущая страница всегда должна быть текущей страницей за вычетом 1.

$i = $uri_page_number - 1; 

СТАРЫЙ (строка 230):

if ($this->cur_page == $loop) 

НОВОЕ:

URI без нумерации страниц следует рассматривать как страницу 1.

if ($this->cur_page == $loop || ($this->cur_page == 1 && $this->cur_page == $loop)) 

СТАРЫЙ (строки 238–247):

if ($n == '' && $this->first_url != '')
{
    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$loop.'</a>'.$this->num_tag_close;
}
else
{
   $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix;

    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close;
}

НОВОЕ:

URL-адреса страниц должны использовать номера страниц, а не смещения.

if ($n == '' && $this->first_url != '')
{
    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$loop.'">'.$loop.'</a>'.$this->num_tag_close;
}
else
{
    $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix;

    $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$loop.'">'.$loop.'</a>'.$this->num_tag_close;
} 

СТАРЫЙ (строка 256):

$output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.($this->cur_page * $this->per_page).$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close;

НОВОЕ:

Следующая страница всегда должна быть суммой текущей страницы и 1.

$output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.($this->cur_page + 1).$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close; 

СТАРЫЙ (строка 262):

$i = (($num_pages * $this->per_page) - $this->per_page); 

НОВОЕ:

Последней страницей должно быть общее количество страниц.

$i = $num_pages; 

Замените все старые строки новыми строками. Убедитесь, что вы делаете резервную копию файла перед изменением.

Надеюсь это поможет :)

ИЗМЕНИТЬ:

Вам необходимо обновить функциональный тест контроллера, например:

function test($start_from = 0)
{
    $this->load->library('pagination');

    $data = array();

    $per_page = 3;
    $total = $this->activity_model->count_by();

    $config['base_url'] = base_url() . 'test';
    $config['total_rows'] = $total;
    $config['per_page'] = $per_page;
    $config['uri_segment'] = 2;
    $config['num_links'] = 2;
    $config['use_page_numbers'] = TRUE;

    $start = $per_page * ($start_from-1);

    $data['follow'] = $this->activity_model->get($per_page, $start);

    $this->pagination->initialize($config); 

    $data['pagination'] = $this->pagination->create_links();

    $this->load->view('front_end/test' ,$data);
}

Здесь я добавил новую переменную $start, которая равна $per_page * ($start_from-1). Теперь передайте этот $start в качестве аргумента модели.

Это умножает количество элементов на странице на (текущий номер страницы -1). Это означает, что если ваши элементы на странице 10, а вы находитесь на второй странице, $start = 10 *(2-1), что дает 10. Таким образом, ваш результат будет начинаться с 10,20 и так далее.

Надеюсь это поможет :)

person Sabari    schedule 28.01.2012
comment
Будут небольшие изменения в номерах строк. В любом случае попробуйте. Моя немного старая версия. Пожалуйста, дайте мне знать, если это работает :) - person Sabari; 29.01.2012
comment
Ссылки на страницы идут отлично, даже параметр URL идет правильно.. Но теперь результат отображения изменился. У меня есть галерея участников. Когда я нажимаю «ссылка на 2-ю страницу», тот же участник снова повторяется на следующей странице. Так что я должен сделать какие-либо настройки для этого? потому что в предыдущем запросе это было так.. LIMIT 0,10 LIMIT 10,10 И теперь это происходит так LIMIT 0,10 LIMIT 2,10 LIMIT 3,10 - person Viktors; 29.01.2012
comment
Вам нужно изменить свой код аналогичным образом. Нумерация страниц Codeingter по умолчанию смещена. ТАК значение смещения передается, чтобы взять начальную точку результата. Мы изменили это сейчас... Нам нужно изменить код таким же образом. Я вставил сюда только код разбиения на страницы - person Sabari; 29.01.2012
comment
В вашем коде $start_from, который вы передаете, является аргументом функции, который мы получим из нумерации страниц, равной 1,2,3 и т. д. Я покажу это в своем редактировании. - person Sabari; 29.01.2012
comment
$start_from = $start_from › 1 ? $start_from-1:0; $start_from = $start_from * $per_page; - person Viktors; 29.01.2012
comment
и заработало... просто интересно код после обновления должен работать с цифрами так хорошо как и без цифр. Если я использую для этого дополнительный код, значит, все в порядке? - person Viktors; 29.01.2012
comment
спасибо, как я вижу на первый взгляд, это то же самое, что я пишу ниже, только у вас это в одну строку - person Viktors; 29.01.2012

Мне удалось сделать это без изменения класса. Лучшим способом будет сделать копию класса пагинации, внести свои изменения и использовать ее. Таким образом, если вы обновите CI, вы не потеряете модификацию. Вот мое решение без изменения класса.

Во-первых, я хочу сказать, что использование только опции конфигурации $config['use_page_numbers'] = TRUE также поможет, но не полностью. Я обнаружил, что при использовании только этой опции не работают следующие вещи:
если вы попытаетесь отредактировать страницы панели URL вручную, они будут рассматриваться как смещение, а не как страницы, а также если вы попытаетесь вернуться со страницы 2 на страницу 1. используя ссылку «предыдущая», он также обрабатывает номер страницы как смещение.

Код:

$config['base_url'] = base_url('my/url/page');
$config['total_rows'] = count($this->my_model->get_all());
$config['per_page'] = 2;
$config['use_page_numbers'] = TRUE;     
$config['uri_segment'] = 4; 

//i'm looading the pagination in the constuctor so just init here
$this->pagination->initialize($config); 

if($this->uri->segment(4) > 0)
    $offset = ($this->uri->segment(4) + 0)*$config['per_page'] - $config['per_page'];
else
    $offset = $this->uri->segment(4);
//you should modify the method in the model to accept limit and offset or make another function - your choice       
$data['my_data'] = $this->my_model->get_all($config['per_page'], $offset);

Таким образом
страница = false (мой/url) или (мой/url/страница) - в основном, если 4-й сегмент uri неверен,
страница = 0 (мой/url/страница/0),
и
страница = 1 (мой/url/страница/1)

все будут отображать первую страницу, а затем другие ссылки будут работать нормально. Я также проверяю страницу, например, если кто-то хочет войти (my/url/page/2323), это вызовет ошибку, и в модели вы должны проверить, является ли результат ложным, и если это так, контроллер должен показать ошибку страница или что-то в этом роде. Надеюсь это поможет.

person 0v3rth3d4wn    schedule 14.05.2012

Вы можете избежать ошибок php, если кто-то вручную введет номер страницы из URL-адреса:

например, my/url/page/786 ваш результат может ничего не отображать для запроса 786 , по умолчанию он покажет вам ошибку php. Чтобы избежать этого, вы можете использовать:

if (isset($result)) {
  $isArray = is_array($result) ? "YES" : "NO"; //check that result is an array or not as per your requirement.
  if ($isArray == "YES") {
   echo "show your stuffs here..";
  }
  else{
   echo "display your message instead for php error here..";
  }
}

надеюсь, это поможет... для запроса напишите мне в твиттере @sufiyantech

person Mohammed Sufian    schedule 23.12.2013