Статьи

Нумерация страниц в CodeIgniter: полное руководство

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

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

Позвольте мне выделить темы, которые мы собираемся затронуть в этой статье:

  • Демонстрация базовой подкачки
  • Изучите параметры настройки
  • Конфигурация нумерации страниц

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

В нашем примере мы создадим довольно простой список пользователей, в котором мы получим записи из пользовательской таблицы MySQL. Чтобы успешно запустить этот пример, убедитесь, что в вашей таблице пользователей есть поля uid и uname .

С этой настройкой мы готовы к работе.

controllers/Paging.php создадим файл controllers/Paging.php со следующим содержимым.

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
<?php
defined(‘BASEPATH’) OR exit(‘No direct script access allowed’);
 
class Paging extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
 
        // load Pagination library
        $this->load->library(‘pagination’);
         
        // load URL helper
        $this->load->helper(‘url’);
    }
     
    public function index()
    {
        // load db and model
        $this->load->database();
        $this->load->model(‘Users’);
 
        // init params
        $params = array();
        $limit_per_page = 1;
        $start_index = ($this->uri->segment(3)) ?
        $total_records = $this->Users->get_total();
 
        if ($total_records > 0)
        {
            // get current page records
            $params[«results»] = $this->Users->get_current_page_records($limit_per_page, $start_index);
             
            $config[‘base_url’] = base_url() .
            $config[‘total_rows’] = $total_records;
            $config[‘per_page’] = $limit_per_page;
            $config[«uri_segment»] = 3;
             
            $this->pagination->initialize($config);
             
            // build paging links
            $params[«links»] = $this->pagination->create_links();
        }
         
        $this->load->view(‘user_listing’, $params);
    }
     
    public function custom()
    {
        // load db and model
        $this->load->database();
        $this->load->model(‘Users’);
     
        // init params
        $params = array();
        $limit_per_page = 2;
        $page = ($this->uri->segment(3)) ?
        $total_records = $this->Users->get_total();
     
        if ($total_records > 0)
        {
            // get current page records
            $params[«results»] = $this->Users->get_current_page_records($limit_per_page, $page*$limit_per_page);
                 
            $config[‘base_url’] = base_url() .
            $config[‘total_rows’] = $total_records;
            $config[‘per_page’] = $limit_per_page;
            $config[«uri_segment»] = 3;
             
            // custom paging configuration
            $config[‘num_links’] = 2;
            $config[‘use_page_numbers’] = TRUE;
            $config[‘reuse_query_string’] = TRUE;
             
            $config[‘full_tag_open’] = ‘<div class=»pagination»>’;
            $config[‘full_tag_close’] = ‘</div>’;
             
            $config[‘first_link’] = ‘First Page’;
            $config[‘first_tag_open’] = ‘<span class=»firstlink»>’;
            $config[‘first_tag_close’] = ‘
             
            $config[‘last_link’] = ‘Last Page’;
            $config[‘last_tag_open’] = ‘<span class=»lastlink»>’;
            $config[‘last_tag_close’] = ‘
             
            $config[‘next_link’] = ‘Next Page’;
            $config[‘next_tag_open’] = ‘<span class=»nextlink»>’;
            $config[‘next_tag_close’] = ‘
 
            $config[‘prev_link’] = ‘Prev Page’;
            $config[‘prev_tag_open’] = ‘<span class=»prevlink»>’;
            $config[‘prev_tag_close’] = ‘
 
            $config[‘cur_tag_open’] = ‘<span class=»curlink»>’;
            $config[‘cur_tag_close’] = ‘
 
            $config[‘num_tag_open’] = ‘<span class=»numlink»>’;
            $config[‘num_tag_close’] = ‘
             
            $this->pagination->initialize($config);
                 
            // build paging links
            $params[«links»] = $this->pagination->create_links();
        }
     
        $this->load->view(‘user_listing’, $params);
    }
}

Далее нам понадобится файл models/Users.php который выбирает записи из таблицы пользователей.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
// models/Users.php
defined(‘BASEPATH’) OR exit(‘No direct script access allowed’);
 
class Users extends CI_Model
{
    function __construct()
    {
      parent::__construct();
    }
 
    public function get_current_page_records($limit, $start)
    {
        $this->db->limit($limit, $start);
        $query = $this->db->get(«users»);
 
        if ($query->num_rows() > 0)
        {
            foreach ($query->result() as $row)
            {
                $data[] = $row;
            }
             
            return $data;
        }
 
        return false;
    }
     
    public function get_total()
    {
        return $this->db->count_all(«users»);
    }
}

Наконец, давайте создадим файл представления в views/user_listing.php который отображает список пользователей.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!— views/user_listing.php —>
<html>
    <head>
        <title>Paging Example-User Listing</title>
    </head>
     
    <body>
        <div class=»container»>
            <h1 id=’form_head’>User Listing</h1>
 
            <?php if (isset($results)) { ?>
                <table border=»1″ cellpadding=»0″ cellspacing=»0″>
                    <tr>
                        <th>ID</th>
                        <th>NAME</th>
                    </tr>
                     
                    <?php foreach ($results as $data) { ?>
                        <tr>
                            <td><?php echo $data->uid ?></td>
                            <td><?php echo $data->uname ?></td>
                        </tr>
                    <?php } ?>
                </table>
            <?php } else { ?>
                <div>No user(s) found.</div>
            <?php } ?>
 
            <?php if (isset($links)) { ?>
                <?php echo $links ?>
            <?php } ?>
        </div>
    </body>
</html>

Теперь зайдите на нашу пользовательскую страницу по адресу http: // your-code-igniter-site / paging / index, и вы увидите список пользователей вместе с нумерацией страниц! Итак, все, мы сделали это! Не волнуйтесь, я не оставлю вас так скоро, так как сейчас мы начнем разбирать каждую часть кода.

Мы начнем с файла models/Users.php как это будет вызываться из наших методов контроллера. Есть два важных метода, get_current_page_records и get_total , которые наша модель реализует для построения пагинационных ссылок.

Давайте get_total методу get_total . Он используется для подсчета количества записей в таблице пользователей.

1
2
3
4
public function get_total()
{
    return $this->db->count_all(«users»);
}

Далее есть метод get_current_page_records .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
public function get_current_page_records($limit, $start)
{
    $this->db->limit($limit, $start);
    $query = $this->db->get(«users»);
  
    if ($query->num_rows() > 0)
    {
        foreach ($query->result() as $row)
        {
            $data[] = $row;
        }
         
        return $data;
    }
  
    return false;
}

Есть два важных аргумента, которые вы должны отметить в методе get_current_page_records . Первый аргумент, $limit , используется для указания количества записей, которые будут возвращены во время выполнения запроса. И второй аргумент, $start , действует как начальный индекс записи.

Итак, как вы можете видеть, учитывая значения $start и $limit мы можем получать записи по странице. В этом суть пейджинга, а тем временем мы реализовали самый важный метод этой статьи!

Итак, это была наша модель — простая и элегантная!

Продвигаясь вперед, давайте переключим наше внимание на файл контроллера. Идите вперед и получите код метода конструктора.

01
02
03
04
05
06
07
08
09
10
public function __construct()
{
    parent::__construct();
  
    // load Pagination library
    $this->load->library(‘pagination’);
     
    // load URL helper
    $this->load->helper(‘url’);
}

Чтобы использовать нумерацию страниц в CodeIgniter, первое, что вам нужно сделать, это загрузить библиотеку нумерации страниц. И мы можем сделать это, используя $this->load->library('pagination') .

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

Теперь мы готовы пройти через сердце нашего контроллера — метод index .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public function index()
{
        // load db and model
        $this->load->database();
        $this->load->model(‘Users’);
 
        // init params
        $params = array();
        $limit_per_page = 1;
        $start_index = ($this->uri->segment(3)) ?
        $total_records = $this->Users->get_total();
 
        if ($total_records > 0)
        {
            // get current page records
            $params[«results»] = $this->Users->get_current_page_records($limit_per_page, $start_index);
             
            $config[‘base_url’] = base_url() .
            $config[‘total_rows’] = $total_records;
            $config[‘per_page’] = $limit_per_page;
            $config[«uri_segment»] = 3;
             
            $this->pagination->initialize($config);
             
            // build paging links
            $params[«links»] = $this->pagination->create_links();
        }
         
        $this->load->view(‘user_listing’, $params);
    }

Для начала мы убедимся, что база данных загружена правильно. После этого мы загружаем модель Users чтобы мы могли использовать методы модели.

1
2
$this->load->database();
$this->load->model(‘Users’);

Далее мы инициализируем пару важных переменных.

1
2
3
4
5
// init params
$params = array();
$limit_per_page = 1;
$start_index = ($this->uri->segment(3)) ?
$total_records = $this->Users->get_total();

Переменная $limit_per_page определяет лимит на страницу. Конечно, вы можете установить его как хотите; в данный момент он установлен на 1 для примера.

$start_index содержит начальный индекс записи MySQL. Когда CodeIgniter создает ссылки разбиения на страницы, он добавляет начальный индекс страницы в качестве третьего сегмента в URL-адресе по умолчанию. Вы можете изменить это поведение по умолчанию, но это то, что мы зарезервируем в последнем разделе этой статьи, где мы обсудим параметры настройки.

Наконец, мы вызываем метод get_total модели Users, чтобы получить итоговые записи таблицы users, и он назначается переменной $total_records .

Далее мы выбираем записи текущей страницы, используя метод get_current_page_records .

1
2
// get current page records
$params[«results»] = $this->Users->get_current_page_records($limit_per_page, $start_index);

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

1
2
3
4
5
6
$config[‘base_url’] = base_url() .
$config[‘total_rows’] = $total_records;
$config[‘per_page’] = $limit_per_page;
$config[«uri_segment»] = 3;
 
$this->pagination->initialize($config);

И это набор минимальных параметров для построения пагинационных ссылок.

  • base_url : URL, который будет использоваться при создании ссылок на страницы
  • total_rows : общее количество записей
  • per_page : количество записей на странице

Наконец, мы используем метод create_links для создания ссылок на страницы.

1
2
// build paging links
$params[«links»] = $this->pagination->create_links();

Остальное — просто формальность для вызова нашего представления user_listing и рендеринга вывода! Запустите URL-адрес http: // your-code-igniter-site / paging / index, чтобы увидеть список пользователей вместе со ссылками на страницы.

Это очень простой, но полезный пример разбивки на страницы, который вы можете использовать в соответствии со своими требованиями.

В следующем разделе мы рассмотрим, как можно настроить нумерацию страниц по умолчанию с точки зрения внешнего вида и функциональности.

В этом разделе мы рассмотрим доступные варианты, которые вы можете использовать, если хотите настроить стандартные нумерацию страниц.

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

1
$config[«uri_segment»] = 4;

Параметр num_links позволяет вам определять количество цифровых ссылок, которые будут отображаться до и после номера активной страницы в ссылках на нумерацию страниц.

1
$config[‘num_links’] = 2;

При доступе к сегменту URI подкачки это начальный индекс по умолчанию. Например, если у вас есть десять записей на странице, сегмент URI подкачки будет равен 20 для третьей страницы. Вместо этого, если вы хотите показать фактические номера страниц в ссылках на пейджинг, вы можете установить для use_page_numbers значение TRUE .

1
$config[‘use_page_numbers’] = TRUE;

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

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

1
$config[‘reuse_query_string’] = TRUE;

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

Если вы хотите обернуть код разбивки на страницы любым другим тегом HTML, вы можете сделать это с помощью параметров full_tag_open и full_tag_close .

1
2
$config[‘full_tag_open’] = ‘<div class=»pagination»>’;
$config[‘full_tag_close’] = ‘</div>’;

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

Если вы хотите изменить текст, который будет отображаться для первой, последней, следующей и предыдущей ссылок, вы также можете это сделать.

1
2
3
4
$config[‘first_link’] = ‘First Page’;
$config[‘last_link’] = ‘Last Page’;
$config[‘next_link’] = ‘Next Page’;
$config[‘prev_link’] = ‘Prev Page’;

Кроме того, если вы хотите обернуть эти отдельные ссылки каким-либо HTML-тегом, вы можете сделать это так же, как и мы, чтобы обернуть весь код подкачки.

01
02
03
04
05
06
07
08
09
10
11
$config[‘first_tag_open’] = ‘<span class=»firstlink»>’;
$config[‘first_tag_close’] = ‘
  
$config[‘last_tag_open’] = ‘<span class=»lastlink»>’;
$config[‘last_tag_close’] = ‘
  
$config[‘next_tag_open’] = ‘<span class=»nextlink»>’;
$config[‘next_tag_close’] = ‘
  
$config[‘prev_tag_open’] = ‘<span class=»prevlink»>’;
$config[‘prev_tag_close’] = ‘

Иногда вы хотите по-другому оформить активную ссылку. Вы можете сделать это, применив теги-обертки, как показано ниже.

1
2
$config[‘cur_tag_open’] = ‘<span class=»curlink»>’;
$config[‘cur_tag_close’] = ‘

Точно так же, если вы хотите обернуть цифровые ссылки чем-то:

1
2
$config[‘num_tag_open’] = ‘<span class=»numlink»>’;
$config[‘num_tag_close’] = ‘

На этом история кастомизации заканчивается. Фактически, вы можете пойти дальше и посмотреть пример настройки по адресу http: // your-code-igniter-site / paging / custom, который уже включен в наш файл контроллера!

Теперь вы знаете о конфигурации, которая необходима для создания приличной нумерации страниц с любым списком моделей. И большую часть времени вы хотите, чтобы это было одинаковым на всем сайте. Что вы собираетесь сделать, чтобы достичь этого? У вас может возникнуть желание скопировать код конфигурации и вставить его в каждое действие, которое требует настройки нумерации страниц.

На самом деле, есть лучший способ справиться с этим сценарием. Вы можете создать файл конфигурации подкачки по адресу application/config/pagination.php и использовать переменную $config для определения ваших настроек.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$config[‘per_page’] = 10;
$config[«uri_segment»] = 3;
  
$config[‘full_tag_open’] = ‘<div class=»pagination»>’;
$config[‘full_tag_close’] = ‘</div>’;
     
$config[‘first_link’] = ‘First Page’;
$config[‘first_tag_open’] = ‘<span class=»firstlink»>’;
$config[‘first_tag_close’] = ‘
     
$config[‘last_link’] = ‘Last Page’;
$config[‘last_tag_open’] = ‘<span class=»lastlink»>’;
$config[‘last_tag_close’] = ‘
     
$config[‘next_link’] = ‘Next Page’;
$config[‘next_tag_open’] = ‘<span class=»nextlink»>’;
$config[‘next_tag_close’] = ‘
  
$config[‘prev_link’] = ‘Prev Page’;
$config[‘prev_tag_open’] = ‘<span class=»prevlink»>’;
$config[‘prev_tag_close’] = ‘
  
$config[‘cur_tag_open’] = ‘<span class=»curlink»>’;
$config[‘cur_tag_close’] = ‘
  
$config[‘num_tag_open’] = ‘<span class=»numlink»>’;
$config[‘num_tag_close’] = ‘

Исходя из этого, пересмотренный метод действия index должен выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public function index()
{
    // load db and model
    $this->load->database();
    $this->load->model(‘Users’);
  
    // init params
    $params = array();
    $start_index = ($this->uri->segment(3)) ?
    $total_records = $this->Users->get_total();
     
    // load config file
    $this->config->load(‘pagination’, TRUE);
    $settings = $this->config->item(‘pagination’);
    $settings[‘total_rows’] = $this->Users->get_total();
    $settings[‘base_url’] = base_url() .
  
    if ($total_records > 0)
    {
        // get current page records
        $params[«results»] = $this->Users->get_current_page_records($settings[‘per_page’], $start_index);
         
        // use the settings to initialize the library
        $this->pagination->initialize($settings);
         
        // build paging links
        $params[«links»] = $this->pagination->create_links();
    }
     
    $this->load->view(‘user_listing’, $params);
}

Конечно, переменные total_rows и base_url меняются от действия к действию, поэтому вам нужно явно устанавливать их в каждом действии.

Для этого вам необходимо загрузить конфигурацию нумерации страниц.

1
2
$this->config->load(‘pagination’, TRUE);
$settings = $this->config->item(‘pagination’);

Далее вы можете переопределить настройки, относящиеся к конкретному действию.

1
2
$settings[‘total_rows’] = $this->Users->get_total();
$settings[‘base_url’] = base_url() .

И вы сделали с этим!

Так что это была история конфигурации пагинации, и на этом статья тоже заканчивается!

Сегодня мы просмотрели библиотеку пагинации в CodeIgniter.

В первой части этой статьи я продемонстрировал, как вы можете использовать библиотеку пагинации, предоставив очень простой, но полезный пример.

После этого мы обсудили параметры настройки, доступные в вашем распоряжении при настройке нумерации страниц.

Наконец, мы обсудили конфигурацию пагинации в последнем разделе.

CodeIgniter — это мощная платформа PHP. Если вы только начинаете или начинаете со следующей версии, не забудьте также проверить, что у нас есть .

Я хотел бы знать ваши отзывы в виде запросов и комментариев, используя канал ниже!