2012-02-13 11 views
6

Ive cercando di fare una paginazione con CodeIgniter, dovrebbe essere così semplice secondo il manuale di Codeigniter, anche nell'esempio è cosìcome configurare il codeign code?

«Prima < 1 2 3 4 5> Ultimo»

$config['total_rows'] = $this->searchdesc_model->queryallrows(); 
$config['per_page'] = '10'; 
$config['uri_segment'] =4; 
$config['full_tag_open'] = '<p>'; 
$config['full_tag_close'] = '</p>'; 
$config['cur_tag_open'] = '<b>'; 
$config['cur_tag_close'] = '</b>'; 
$config['first_link'] = 'First'; 
$config['last_link'] = 'Last'; 
$config['last_tag_open'] = '<p>'; 
$config['last_tag_close'] = '</p>' 

$this->load->library('Company_Creation'); 

nella vista lo chiamo solo come paginazione-> create_links(); ?> (O mando attraverso la vista quando lo chiamo dal controller, ancora ho solo questo

1 2 3>

e non v'è alcun modo per far sembrare l'exmaple, può sembrare così fittizio ma, chiunque potrebbe aiutarmi con questo? o di avere un problema simile?

Grazie

EDIT 1

$config['total_rows'] = $this->searchdesc_model->queryallrows(); 
$config['per_page'] = '5'; 
$config['uri_segment'] =4; 
$config['full_tag_open'] = '<p>'; 
$config['full_tag_close'] = '</p>'; 
$config['cur_tag_open'] = '<b>'; 
$config['cur_tag_close'] = '</b>'; 
$config['first_link'] = ' First'; 
$config['last_link'] = ' Last'; 
$config['last_tag_open'] = '<p>'; 
$config['last_tag_close'] = '</p>'; 
$config['next_link'] = ''; 
$config['next_tag_open'] = '<p id="nextbutton" style="padding-left:5px;">'; 
$config['next_tag_close'] = '</p>'; 
$config['prev_link'] = ''; 
$config['prev_tag_open'] = '<p id="prevbutton" style="padding-right:5px;">'; 
$config['prev_tag_close'] = '</p>'; 
$config['num_links']=4; 
$data['retorno'] = $this->searchdesc_model->queryalldb($config['per_page'],$this->uri->segment(4,0)); 
$config['total_rows']=1000; 
$this->pagination->initialize($config); 

ho fatto questo, secondo alcuni consigli Ive recieve, come hai detto quando ci sono molti dati funziona bene, comunque mi piacerebbe mostrare il primo e il prossimo pulsante per tutto il tempo, ho impostato total_rows dopo la mia query (che chiamo con il giusto numero di righe), e ho provato anche prima e il i risultati sono gli stessi, ho anche bisogno di mostrare solo 4 numeri e sto usurando numb_links ... ancora non funziona (non so perché ci dicono i doc dovrebbero funzionare ..) qualche idea?

Grazie!

+0

quanto ne so, questo è solo un esempio di quello che appare come l'impaginazione. Non la paginazione effettiva che può essere creata utilizzando la classe di impaginazione CodeIgniter. Probabilmente dovrai estendere la classe di paginazione e modificare il metodo 'create_links()'. –

+0

Grazie, qualche idea su come crearli da solo? (Odio che il codeigniter fornisce questi esempi e non danno nemmeno indizi su come realizzarlo ...) – jpganz18

+0

Quale versione di CodeIgniter usi? –

risposta

9

Per produrre ciò che l'esempio mostra è in realtà piuttosto semplice. Hai solo bisogno di estendere la libreria di impaginazione per sistemare questo. Sono stato in grado di farlo. Indipendentemente dal numero di pagine che mostri, mostra ancora prima, ultima, freccia indietro e freccia avanti.

Se si desidera mostrare 5 pagine in ogni momento con il foward e il materiale di ritorno, è necessario avere tanti risultati per riempire quella pagina. Quindi imposta num_links su ciò che desideri prima e dopo se nella terza pagina. Quindi sarebbe 2. Le mie modifiche se sei sulla prima pagina lo fanno visualizzare 4 pagine dopo quando applicabile. Vedi l'immagine qui sotto. Il bianco è la pagina corrente. Il verde è pagine disponibili.

enter image description here enter image description here

Spero di aver spiegato tutto correttamente e questo funziona per voi. Fammi sapere.

controller

$this->pagingConfig = array(); 
    $this->pagingConfig['base_url'] = 'URL'; 
    $this->pagingConfig['total_rows'] = 0;//TOTAL ROWS 
    $this->pagingConfig['cur_page'] = 0;//CURRENT PAGE NUMBER 
    $this->pagingConfig['per_page'] = 0;//YOUR RESULTS PER PAGE 
    $this->pagingConfig['num_links'] = 2;//NUMBER OF LINKS BEFORE AND AFTER CURRENT PAGE IF ON PAGE ONE WILL SHOW 4 PAGES AFTERWARDS IF YOU HAVE ENOUGH RESULTS TO FILL THAT MANY 
    $this->pagingConfig['first_link'] = "&lt;&lt; First"; 
    $this->pagingConfig['last_link'] = "Last &gt;&gt;"; 
    $this->pagingConfig['full_tag_open'] = "<div class='pagination'>"; 
    $this->pagingConfig['full_tag_close'] = "</div>"; 
    $this->pagingConfig['last_tag_open'] = ""; 
    $this->pagingConfig['first_tag_close'] = ""; 
    $this->pagingConfig['anchor_class'] = "page"; 
    $this->pagination->initialize($this->pagingConfig); 
    $strPaging = $this->pagination->create_links(); 

ESTESA BIBLIOTECA PAGINATION CALL

function create_links() 
{ 
    // EDIT: ADDED THIS BECAUSE COULDN'T SEEM TO SET THIS ANYWHERE ELSE 
    if ($this->anchor_class != '') 
    { 
    $this->anchor_class = 'class="'.$this->anchor_class.'" '; 
    } 

    // If our item count or per-page total is zero there is no need to continue. 
    if ($this->total_rows == 0 OR $this->per_page == 0) 
    { 
    return ''; 
    } 

    // Calculate the total number of pages 
    $num_pages = ceil($this->total_rows/$this->per_page); 

    // Is there only one page? Hm... nothing more to do here then. 
    if ($num_pages == 1) 
    { 
    return ''; 
    } 

    // Determine the current page number. 
    $CI =& get_instance(); 

    if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) 
    { 
    if ($CI->input->get($this->query_string_segment) != 0) 
    { 
     $this->cur_page = $CI->input->get($this->query_string_segment); 

     // Prep the current page - no funny business! 
     $this->cur_page = (int) $this->cur_page; 
    } 
    } 
    else 
    { 
    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; 
    } 
    } 

    $this->num_links = (int)$this->num_links; 

    if ($this->num_links < 1) 
    { 
    show_error('Your number of links must be a positive number.'); 
    } 

    if (! is_numeric($this->cur_page)) 
    { 
    $this->cur_page = 1; 
    } 

    // Is the page number beyond the result range? 
    // If so we show the last page 
    if ($this->cur_page > $this->total_rows) 
    { 
    $this->cur_page = ($num_pages - 1); 
    } 

    // EDIT: DON'T NEED THIS THE WAY I'VE CHANGED IT 
    // $uri_page_number = $this->cur_page; 
    // $this->cur_page = floor(($this->cur_page/$this->per_page) + 1); 

    // EDIT: START OF MODIFIED START AND END TO WORK HOW I WANT 
    $totalLinks = ($this->num_links*2)+1; 
    if($totalLinks > ($this->total_rows/$this->per_page)) 
    { 
    $totalLinks = ceil($this->total_rows/$this->per_page); 
    } 
    //first page 
    if($this->cur_page == 1) 
    { 
    $start = 1; 
    $end = $start + $totalLinks - 1; 
    } 
    //middle pages 
    elseif($this->cur_page + $this->num_links <= $num_pages && $this->cur_page - $this->num_links > 0) 
    { 
    $start = $this->cur_page - $this->num_links; 
    $end = $this->cur_page + $this->num_links; 
    } 
    //last couple of pages 
    elseif(($this->cur_page + $totalLinks) > $num_pages) 
    { 
    $start = $num_pages - $totalLinks + 1; 
    $end = $num_pages; 
    //check to see if this is in the first half of links so it doesn't jump the paging 
    if($this->cur_page <= $this->num_links) 
    { 
     $start = 1; 
     $end = $start + $totalLinks - 1; 
    } 
    } 
    //first couple of pages 
    elseif(($this->cur_page - $totalLinks) < 1) 
    { 
    $start = 1; 
    $end = $start + $totalLinks - 1; 
    } 
    // EDIT: END OF MODIFIED START AND END TO WORK HOW I WANT 

    // EDIT: CODEIGNITERS BASE PAGING SETUP SEE ABOVE FOR MY CHANGES 
    // $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1; 
    // $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages; 

    // Is pagination being used over GET or POST? If get, add a per_page query 
    // string. If post, add a trailing slash to the base URL if needed 
    if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) 
    { 
    $this->base_url = rtrim($this->base_url).'&amp;'.$this->query_string_segment.'='; 
    } 
    else 
    { 
    $this->base_url = rtrim($this->base_url, '/') .'/'; 
    } 

    // And here we go... 
    $output = ''; 

    // Render the "First" link 
    // EDIT: CHANGED TO ALWAYS SHOW FIRST LINK AT LEAST 
    if ($this->first_link !== FALSE AND $this->cur_page != 1) 
    { 
    $first_url = ($this->first_url == '') ? $this->base_url."1" : $this->first_url; 
    $output .= $this->first_tag_open.'<a '.$this->anchor_class.'href="'.$first_url.'">'.$this->first_link.'</a>'.$this->first_tag_close; 
    } 
    else 
    { 
    $output .= $this->cur_tag_open.$this->first_link.$this->cur_tag_close; 
    } 

    // Render the "previous" link 
    // EDIT: CHANGED TO ALWAYS SHOW PREVIOUS LINK AT LEAST 
    if ($this->prev_link !== FALSE AND $this->cur_page != 1) 
    { 
    $i = $this->cur_page-1; 

    if ($i == 0 && $this->first_url != '') 
    { 
     $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; 
    } 
    else 
    { 
     $i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix; 
     $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; 
    } 

    } 
    else 
    { 
    $output .= $this->cur_tag_open.$this->prev_link.$this->cur_tag_close; 
    } 

    // EDIT: CHANGED THIS TO ALWAYS SHOW ALL LINKS WANTED EVEN IF ON FIRST PAGE 
    // Render the pages 
    if ($this->display_pages !== FALSE) 
    { 
    // Write the digit links 
    for ($loop = $start; $loop <= $end; $loop++) 
    { 
     // EDIT: DON'T NEED THIS THE WAY I'VE CHANGED IT 
     // $i = ($loop * $this->per_page) - $this->per_page; 

     if ($loop >= 0) 
     { 
      if ($this->cur_page == $loop) 
      { 
       $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page 
      } 
      else 
      { 
       $n = ($loop == 0) ? '0' : $loop; 

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

    // Render the "next" link 
    // EDIT: CHANGED TO ALWAYS SHOW NEXT LINK AT LEAST 
    if ($this->next_link !== FALSE AND $this->cur_page < $num_pages) 
    { 
    $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; 
    } 
    else 
    { 
    $output .= $this->cur_tag_open.$this->next_link.$this->cur_tag_close; 
    } 

    // Render the "Last" link 
    // EDIT: CHANGED TO ALWAYS SHOW LAST LINK AT LEAST 
    if ($this->last_link !== FALSE AND $this->cur_page != $num_pages) 
    { 
    $i = (($num_pages)); 
    $output .= $this->last_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->last_link.'</a>'.$this->last_tag_close; 
    } 
    else 
    { 
    $output .= $this->cur_tag_open.$this->last_link.$this->cur_tag_close; 
    } 

    // Kill double slashes. Note: Sometimes we can end up with a double slash 
    // in the penultimate link so we'll kill all double slashes. 
    $output = preg_replace("#([^:])//+#", "\\1/", $output); 

    // Add the wrapper HTML if exists 
    $output = $this->full_tag_open.$output.$this->full_tag_close; 

    return $output; 
} 
+0

Ho scritto tutorial su Cdeigniter Pagination. Si prega di dare un'occhiata e dare i vostri suggerimenti https://www.cloudways.com/blog/pagination-in-codeigniter/ –

5

L'unico motivo per cui si ottiene 1 2 3 > anziché « First < 1 2 3 4 5 > Last » è che semplicemente non si hanno abbastanza righe nel risultato per generare più di 3 pagine.

  • I collegamenti "Primo" e "Ultimo" non vengono visualizzati per impostazione predefinita se non sono necessari. Non è molto chiaro dall'esempio di documentation.

  • Non otterrete i collegamenti "Precedente" finché non oltrepassate la pagina 1, l'esempio è in realtà a pagina 3 (il "3" è in grassetto).

  • Poiché si forniscono modelli personalizzati nella configurazione anziché utilizzare i valori predefiniti, i risultati effettivi saranno leggermente diversi.

Se si vuole fare un rapido test per vedere più collegamenti, basta ridurre il per_page ad un numero inferiore o includere più righe nella vostra total_rows. Il numero totale di collegamenti mostrati può anche essere configurato con num_links.

+0

Grazie !! Ho ridotto i link a 5 (per ora ho solo 18 righe di dati) ma se imposto total_rows un parametro elevato ottengo, come hai detto tu, i link per il primo e l'ultimo, il problema se se clicco per ultimo vado a quella pagina (numero di pagina 1000) e non ha dati, nessun altro modo per simularlo? – jpganz18

+1

Hai solo bisogno di più dati. L'impostazione di 'total_rows' su un numero arbitrario è utile solo per un test rapido per vedere i collegamenti, non è qualcosa che in realtà vorresti fare. –

+0

Grazie, ho già impostato total_rows su 1000, ma quando clicco sul link "last" mi manda alla pagina 1000 ... che non ha dati ... qualche idea di come risolverlo? – jpganz18

0

Per coloro che in via di sviluppo la loro applicazione CI con PostgreSQL e non riescono a capire il motivo per cui limite impaginazione + Offset opere "strani ":

C ontroller:

... 
$offset = ($page-1)*$config["per_page"]; 
$this->reporting_model->some_fetch_method($id, $config["per_page"], $offset); 
... 

M odel:

... 
$this->db->limit($limit_perpage, $offset); 
$this->db->where("id", $id); 
$this->db->get('some_table'); 
... 
Problemi correlati