2012-01-28 13 views
5

Mi función del controladorLa paginación No números de página pantalla correctos 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); 
} 

mi ruta:

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

modelo:

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

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

problema es que tengo la paginación 1,2, 3,4,5 ... y en cada página muestro 3 elementos. Quiero hacer eso en el URL que se muestran mis números de página 1.2.3.4.5

Cuando hago clic segunda página url espectáculo 3 Cuando hago clic tercera página url espectáculo 6 y así sucesivamente 3

es posible, me paso horas buscando consejos en internet pero nada como entiendo [code] $ config ['use_page_numbers'] = TRUE; [/ code] hago lo que necesito pero en mi caso todavía no funciona.

Tal vez pueda aconsejar a cualquier biblioteca?

Respuesta

7

Realice los siguientes cambios en la clase de paginación (/system/libraries/Pagination.php) para que use números de página en lugar de desplazamientos.

antiguo (líneas 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; 
} 

NUEVO:

opción Agregar ‘otra cosa’ a la sentencia if para asegurarse de que por defecto es; page = 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; 
} 

VIEJO (línea 175):

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

NUEVO:

Simplemente a comentar la línea de modo de página actual obedece controlador/URI.

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

VIEJO (línea 206):

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

NUEVO:

Página anterior siempre debe ser restada por página actual 1.

$i = $uri_page_number - 1; 

VIEJO (Línea 230):

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

NUEVO:

URIs de paginación que falta debe considerarse página 1.

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

VIEJO (línea 238 a 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; 
} 

NUEVO:

URL de la página deben usar números de página y no compensa.

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

VIEJO (línea 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; 

NUEVO:

Página siguiente debe ser siempre la suma de la página actual y 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; 

ANTIGUO (línea 262):

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

NUEVO:

última página debe ser el número total de páginas.

$i = $num_pages; 

Reemplace todas las líneas viejas con líneas nuevas. Asegúrese de hacer una copia de seguridad del archivo antes de cambiar.

Espero que esto ayude :)

EDIT:

Es necesario que actualice su prueba de función del controlador como:

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

Aquí he añadido un nuevo comienzo $ variable que es $per_page * ($start_from-1) . Ahora pasa este $ start como argumento al modelo.

Lo que esto hacer es multiplicar el número de elementos por página con (número de página actual -1) .Este significa que si sus artículos por página es 10 y que están en la segunda página del $start = 10 *(2-1) que da 10. Por lo que su resultado se iniciará desde 10,20 y así uno

espero que esto ayude :)

+0

durará esto para CodeIgniter 2.0.3? Gracias de todas formas ! – Viktors

+0

Habrá algunos pequeños cambios en los números de línea. De todos modos, pruébalo. La mía es una versión un poco vieja. Por favor, hágamelo saber si funciona :) – Sabari

+0

¿Esto funciona para usted? – Sabari

11

he conseguido hacer esto sin modificar la clase. La mejor manera será hacer una copia de la clase de paginación, hacer los cambios y usarla. De esta manera, si actualiza CI, no perderá la modificación. Aquí está mi solución sin modificar la clase.

Primero, quiero decir que usar solo la opción de configuración $config['use_page_numbers'] = TRUE también hará el truco pero no del todo. Las cosas que descubrí que no funcionan solo con esta opción son las siguientes:
si intenta editar las páginas de la barra de direcciones de forma manual las trata como páginas de desplazamiento no similares y también si intenta volver de la página 2 a la página 1 usando el enlace "prev" también trata el número de página como un desplazamiento.

El código:

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

De esta manera
página = false (mi/url) o (mi/URL/página) -, básicamente, si el segmento URI cuarto es falsa,
page = 0 (mi/url/page/0),
y
page = 1 (mi/URL/página/1)

será todo mostrar la primera página y luego los demás enlaces se trabaja bien. También estoy validando la página, por ejemplo, si alguien quiere ingresar (mi/url/página/2323) arrojará un error y en el modelo debe verificar si el resultado es falso y si es el controlador debe mostrar un error página o algo. Espero que esto ayude.

+0

éste resolvió mi problema tnx – Ramje

0

Puede evitar errores de PHP si alguien introducir manualmente el número de página de la URL:

por ejemplo, mi/url/page/786 el resultado podría no tener nada que mostrar para la consulta 786, por defecto le mostrará PHP error..to evitar esto se puede utilizar:

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

esperanza esto ayuda ... de consulta Pia en Twitter @sufiyantech

Cuestiones relacionadas