2012-01-28 11 views
5

La mia funzione di regolatoreImpaginazione non risolvono i numeri di pagina di visualizzazione 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); 
} 

il mio percorso:

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

modello:

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

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

problema è che ho impaginazione 1,2, 3,4,5 .... e in ogni pagina visualizzo 3 elementi. Voglio farlo in url esso esposizione i miei numeri di pagina 1,2,3,4,5

Quando clicco seconda pagina url spettacolo 3 Quando clicco terzo URL della pagina Mostra 6 e così via +3

è possibile, passo ore a cercare consigli su internet ma niente come capisco [codice] $ config ['use_page_numbers'] = TRUE; [/ code] fa quello che mi serve ma nel mio caso non funziona ancora.

Forse puoi consigliare qualche libreria?

risposta

7

Apportare le seguenti modifiche alla classe di impaginazione (/system/libraries/Pagination.php) in modo che utilizzi i numeri di pagina anziché gli offset.

VECCHIE (linee 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; 
} 

NUOVI:

Add ‘altro’ opzione per se-dichiarazione per assicurarsi che di default è; 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; 
} 

VECCHIO (linea 175):

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

NUOVO:

sufficiente trasformare in commento la riga in modo pagina corrente obbedisce regolatore/URI.

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

VECCHIO (linea 206):

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

NUOVO:

Pagina precedente deve essere sempre pagina corrente sottratto dal 1.

$i = $uri_page_number - 1; 

VECCHIO(Linea 230):

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

NUOVO:

URI mancante impaginazione deve essere considerato Pagina 1.

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

VECCHIO (linea 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; 
} 

NUOVO:

URL pagina devono utilizzare i numeri di pagina e non offset.

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

VECCHIO (linea 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; 

NUOVO:

Pagina successiva dovrebbe essere sempre la somma di pagina corrente e 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 (linea 262):

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

NUOVO:

Ultima pagina dovrebbe essere il numero totale di pagine.

$i = $num_pages; 

Sostituire tutte le vecchie linee con nuove linee. Assicurati di fare un backup del file prima di cambiarlo.

Spero che questo aiuti :)

EDIT:

È necessario aggiornare il test di funzionamento del controller come:

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

Qui ho aggiunto un nuovo $ lunghezza variabile che è $per_page * ($start_from-1) . Ora passa questo $ start come argomento per modellare.

Ciò fare è moltiplicare il numero di elementi per pagina con (numero della pagina corrente -1) .Questo significa che se i tuoi articoli per pagina è 10 e si è sulla seconda pagina del $start = 10 *(2-1) che dà 10. Così il risultato partirà da 10,20 e così uno

Spero che questo aiuti :)

+0

sarà questo andare per CodeIgniter 2.0.3? Comunque grazie ! – Viktors

+0

Ci saranno alcune piccole modifiche nei numeri di riga. In ogni modo, provalo. La mia è una versione un po 'vecchia. Per favore fatemi sapere se funziona :) – Sabari

+0

Questa cosa funziona per voi? – Sabari

11

sono riuscito a fare questo senza modificare la classe. Il modo migliore è quello di fare una copia della classe impaginazione, apportare le modifiche e utilizzarlo. In questo modo, se aggiorni CI, non perderai la modifica. Ecco la mia soluzione senza modificare la classe.

Prima di tutto voglio dire che utilizzando solo l'opzione di configurazione $config['use_page_numbers'] = TRUE anche fare il trucco, ma non del tutto. Le cose che ho scoperto non funzionanti usando solo questa opzione sono le seguenti:
se si tenta di modificare manualmente le pagine della barra degli URL le tratta come offset non come le pagine e anche se si tenta di tornare dalla pagina 2 alla pagina 1 utilizzando il link "prev" si tratta anche il numero di pagina come un un offset.

Il codice:

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

In questo modo
pagina = false (mio/url) o (la mia/url/pagina) - in sostanza se il segmento uri 4 ° è falsa,
page = 0 (il mio/url/page/0),
e
page = 1 (mio/url/page/1)

saranno tutti visualizzare la prima pagina e poi gli altri collegamenti saranno lavorando bene. Ad esempio, sto anche convalidando la pagina - se qualcuno vuole entrare (il mio/url/pagina/2323) questo genererà un errore e nel modello dovresti controllare se il risultato è falso e se è il controller dovrebbe mostrare un errore pagina o qualcosa del genere. Spero che questo ti aiuti.

+0

questo risolve il mio problema tnx – Ramje

0

È possibile evitare gli errori PHP se qualcuno inserendo manualmente il numero di pagina dall'URL:

per esempio il mio/url/page/786 il risultato potrebbe non avere nulla da visualizzare per la query 786, per impostazione predefinita vi mostrerà PHP error..to evitare questo è possibile utilizzare:

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

speranza che questo aiuta ... per la query me tweet su Twitter @sufiyantech

Problemi correlati