Нумерация страниц не корректирует отображение номеров страниц Codeigniter - PullRequest
5 голосов
/ 28 января 2012

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

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

возможно ли это, я трачу часы на поиск советов в интернете, но, как я понимаю, ничего не понимаюРабота.

Может быть, вы можете посоветовать любую библиотеку?

Ответы [ 3 ]

11 голосов
/ 14 мая 2012

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

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

Код:

$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);

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

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

7 голосов
/ 28 января 2012

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

OLD (строки 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;
} 

NEW:

Добавьте опцию '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); 

NEW:

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

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

OLD (строка 206):

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

NEW:

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

$i = $uri_page_number - 1; 

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

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

NEW:

Отсутствует нумерация страниц по URI, следует считать страницу 1.

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

OLD (строка 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;
}

NEW:

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;
} 

OLD (строка 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;

NEW:

Следующая страница всегда должна быть суммой текущей страницы и равна 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; 

OLD (строка 262):

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

NEW:

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

$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, и поэтому один

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

0 голосов
/ 23 декабря 2013

Вы можете избежать ошибок 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...