Wrong pagination in Codeigniter

2

I have 15 ADs on my site and I did the paging for 10 ADs per page. Ok, CodeIgniter is doing paging with 10 ADs / Page, but on the second and last page CodeIgniter is showing 10, when it should only show 5. This is the Controller code:

function index($offset = 0) {
      // load pagination library 

        $this->load->library('pagination'); 
        $limit = 10;
        $config = array();
        $config['base_url']             = base_url('');
        $config['uri_segment']          = 1;
        $config['total_rows']           = $this->classificados_model->somarTodos($f_estado, $f_cidade); 
        $config['per_page']             = $limit;
        $config['use_page_numbers']     = TRUE;
        $config['num_links']            = 2;
        $config['first_link']           = 'Primeiro';
        $config['last_link']            = 'Último';
        $config['next_link']            = '»';
        $config['prev_link']            = '«';
        $config['first_tag_open']       = '<li>';
        $config['first_tag_close']      = '</li>';
        $config['last_tag_open']        = '<li>';
        $config['last_tag_close']       = '</li>';
        $config['prev_tag_open']        = '<li>';
        $config['prev_tag_close']       = '</li>';
        $config['next_tag_open']        = '<li>';
        $config['next_tag_close']       = '</li>';
        $config['cur_tag_open']         = '<li class="active"><a href="javascript:">';
        $config['cur_tag_close']        = ' <span class="sr-only">(current)</span> </a></li>';
        $config['full_tag_open']        = '<nav>
                <ul class="pagination">';
            $config['full_tag_close']   = '</ul>
        </nav>';
        $config['num_tag_open']         = '<li>';
        $config['num_tag_close']        = '</li>';      
        $this->pagination->initialize($config);
        $dados['anuncios']          =   $this->classificados_model->buscaAnuncios($limit, $offset, $f_estado, $f_cidade);
        $dados['paginacao']         =   $this->pagination->create_links();  
}

Model: Classifieds_Model

function buscaAnuncios($limit, $offset, $f_estado, $f_cidade) {
        $this->db->limit($limit, $offset);
        $where = array(
            'estados.sigla'                 =>  $f_estado, 
            'cidades.nome'                  =>  $f_cidade,
            'anuncios.anuncio_ativo'        =>  '1',
            'usuarios.bloqueado_usuario'    =>  '0',
            'usuarios.ativado_usuario'      =>  '1'
        );

        $this
            ->db
            ->select("*")
            ->from("usuarios")
            ->join("anuncios", "anuncios.usuario_anuncio_id = usuarios.id_usuario", "inner")
            ->join("estados", "estados.id = usuarios.estado_usuario", "inner")
            ->join("cidades", "cidades.id = usuarios.cidade_usuario AND estados.id = cidades.id_uf", "inner")


            ->order_by("anuncios.data_anuncio","desc");

            $query = $this->db->get_where('', $where);


        return $query->result_array();
    }

Query procedure result from page 2:

SELECT *
FROM ('usuarios')
INNER JOIN 'anuncios' ON 'anuncios'.'usuario_anuncio_id' = 'usuarios'.'id_usuario'
INNER JOIN 'estados' ON 'estados'.'id' = 'usuarios'.'estado_usuario'
INNER JOIN 'cidades' ON 'cidades'.'id' = 'usuarios'.'cidade_usuario' AND estados.id = cidades.id_uf
WHERE 'estados'.'sigla' =  'rj'
AND 'cidades'.'nome' =  'rio de janeiro'
AND 'anuncios'.'anuncio_ativo' =  '1'
AND 'usuarios'.'bloqueado_usuario' =  '0'
AND 'usuarios'.'ativado_usuario' =  '1'
ORDER BY 'anuncios'.'data_anuncio' desc
LIMIT 2, 10

Prints:

Page 1:

prntscr.com/6n4t5x

prntscr.com/6n4sra

Page 2:

prntscr.com/6n4tat

prntscr.com/6n4tg4

Thank you in advance!

    
asked by anonymous 30.03.2015 / 19:12

1 answer

2

I suggest two changes:

function buscaAnuncios($limit, $offset, $f_estado, $f_cidade) {

    $where = array(
        'estados.sigla'                 =>  $f_estado, 
        'cidades.nome'                  =>  $f_cidade,
        'anuncios.anuncio_ativo'        =>  '1',
        'usuarios.bloqueado_usuario'    =>  '0',
        'usuarios.ativado_usuario'      =>  '1'
    );

    $this
        ->db
        ->select("*")
        ->from("usuarios")
        ->join("anuncios", "anuncios.usuario_anuncio_id = usuarios.id_usuario", "inner")
        ->join("estados", "estados.id = usuarios.estado_usuario", "inner")
        ->join("cidades", "cidades.id = usuarios.cidade_usuario AND estados.id = cidades.id_uf", "inner")
        ->order_by("anuncios.data_anuncio","desc");

    // Definindo o limite e o offset APÓS o select;
    //
    // Imaginando que $limit seja a PÁGINA ATUAL (e comece em 1),
    // o offset dela é a quantidade de ítens nas páginas anteriores
    // (Página atual - 1) -> Páginas anteriores.
    // Remover o menos 1 se houver página 0.
    // Págs. Anteriores * limite -> Total de ítens "que passaram".
    $this->db->limit($limit, (($offset-1)*$limit));

    $query = $this->db->get_where('', $where);

    return $query->result_array();
}
    
31.03.2015 / 10:45