Completed
Push — master ( b86bcd...3e8326 )
by Rougin
03:27
created

PaginateTrait::getOffset()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 14
ccs 9
cts 9
cp 1
rs 9.2
c 0
b 0
f 0
cc 4
eloc 7
nc 4
nop 1
crap 4
1
<?php
2
3
namespace Rougin\Credo\Traits;
4
5
/**
6
 * Paginate Trait
7
 *
8
 * @package Credo
9
 * @author  Rougin Royce Gutib <[email protected]>
10
 *
11
 * @property \CI_Config     $config
12
 * @property \CI_Input      $input
13
 * @property \CI_Loader     $load
14
 * @property \CI_Pagination $pagination
15
 * @property \CI_URI        $uri
16
 *
17
 * @method array   all()
18
 * @method integer countAll()
19
 * @method array   findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
20
 */
21
trait PaginateTrait
22
{
23
    /**
24
     * Limits the data based on given configuration and generates pagination links.
25
     *
26
     * @param  integer $perPage
27
     * @param  array   $config
28
     * @return array
29
     */
30 3
    public function paginate($perPage, $config = [])
31
    {
32 3
        $this->load->library('pagination');
33
34 3
        $this->prepareConfiguration($config);
35
36 3
        $config['per_page']   = $perPage;
37 3
        $config['total_rows'] = $this->countAll();
38
39 3
        $offset = $this->getOffset($config);
40
41 3
        $this->pagination->initialize($config);
42
43 3
        $items = $this->findBy([], [], $perPage, $offset);
44
45 3
        return [ $items, $this->pagination->create_links() ];
46
    }
47
48
    /**
49
     * Returns the offset from the defined configuration.
50
     *
51
     * @param  array $config
52
     * @return integer
53
     */
54 3
    protected function getOffset(array $config)
55
    {
56 3
        $offset = $this->uri->segment($config['uri_segment']);
57
58 3
        if ($config['page_query_string']) {
59 3
            $offset = $this->input->get($config['query_string_segment']);
60 3
        }
61
62 3
        if ($config['use_page_numbers'] && $offset != 0) {
63 3
            $offset = ($config['per_page'] * $offset) - $config['per_page'];
64 3
        }
65
66 3
        return $offset;
67
    }
68
69
    /**
70
     * Retrieves configuration from pagination.php.
71
     * If not available, will based on given and default data.
72
     *
73
     * @param  array $config
74
     * @return void
75
     */
76 3
    protected function prepareConfiguration(array &$config)
77
    {
78 3
        $this->load->helper('url');
79
80
        $items = [
81 3
            'base_url'             => current_url(),
82 3
            'page_query_string'    => false,
83 3
            'query_string_segment' => 'per_page',
84 3
            'uri_segment'          => 3,
85 3
            'use_page_numbers'     => false,
86 3
        ];
87
88 3
        foreach ($items as $item => $defaultValue) {
89 3
            if ($this->config->item($item) !== null) {
90 3
                $config[$item] = $this->config->item($item);
91 3
            } elseif (! isset($config[$item])) {
92 3
                $config[$item] = $defaultValue;
93 3
            }
94 3
        }
95 3
    }
96
}
97