[PHP] Paginazione dati recuperati da file di testo

Buongiorno a tutti!

Avrei bisogno di realizzare un sistema per la paginazione di alcuni dati recuperati da un file di testo. Attualmente ottengo un output simile: Pagine (6): 1 2 3 4 5 6 (record totali nel file di testo: 18 - pagine totali: 6 e record per pagina 3), invece avrei bisogno di visualizzare una cosa simile, fermo restando le impostazioni di prima Pagine (6): 1 2 3 successive >> (record totali nel file di testo: 18 - pagine totali: 6 e record per pagina 3) quando si fa click su "successive" dovrebbe mostrare questo: Pagine (6): >

// nel file database.txt ho una decina di righe scritte così: 
// 07/06/05|Articolo nr.1|Testo di prova articolo uno... 
// 06/06/05|Articolo nr.2|Testo di prova articolo due... 
// etc... 
$archives = 'database.txt'; 
$file = file($archives); 

if(isset($_GET['id'])) { 

// recupero il numero di riga (con $id) di riferimento 
// nel file database.txt e stampo a video il contenuto... 

} else { 

// estraggo i record dal file di testo mostrando solo il "titolo" 
foreach($file as $k => $v) { 
$rows = explode('|', $v); 
$articles[] = "- $rows[1]\n"; 
} 

$num_row = count($file); // numero totale di record 
$break = 3; // record per pagina 
$tot_pag = ceil($num_row / $break); // pagine totali 
$cur_pag = (empty($_GET['n'])) ? 1 : (int)$_GET['n']; // pag corrente 
$first = ($cur_pag - 1) * $break; // pagina iniziale 
$break += $first; // limite ed incremento record successivi 

// ordino i record in maniera decrescente 
rsort($articles, SORT_NUMERIC); 
reset($articles); 

  // stampo i record 
  for($n = $first; $n < $break; $n++) { 
    echo @$articles[$n]; 
  } 

// visualizzo e creo i link per le pagine totali 
$sys_pag = "Pagine totali: ($tot_pag): "; 
for($i = 1; $i
inviato 11 anni fa
neida
X 0 X

Non capisco perchè il testo è stato spezzato... :-\

comunque, le parti che non sono comprensibili le aggiungo qui:

Avrei bisogno di realizzare un sistema per la paginazione di alcuni dati recuperati da un file di testo. Attualmente ottengo un output simile: Pagine (6): 1 2 3 4 5 6 (record totali nel file di testo: 18 - pagine totali: 6 e record per pagina 3), invece avrei bisogno di visualizzare una cosa simile, fermo restando le impostazioni di prima Pagine (6): 1 2 3 successive >> (record totali nel file di testo: 18 - pagine totali: 6 e record per pagina 3) quando si fa click su "successive" dovrebbe mostrare questo: Pagine (6): >

// continua da prima...
// ordino i record in maniera decrescente 
rsort($articles, SORT_NUMERIC); 
reset($articles); 

  // stampo i record 
  for($n = $first; $n < $break; $n++) { 
    echo @$articles[$n]; 
  } 

// visualizzo e creo i link per le pagine totali 
$sys_pag = "Pagine totali: ($tot_pag): "; 
for($i = 1; $i
risposto 11 anni fa
neida
X 0 X

Ohhh! ma cosa succede! :tichedoff:

Non capisco perchè il testo è stato spezzato... :-\

comunque, le parti che non sono comprensibili le aggiungo qui:

Avrei bisogno di realizzare un sistema per la paginazione di alcuni dati recuperati da un file di testo. Attualmente ottengo un output simile: Pagine (6): 1 2 3 4 5 6 (record totali nel file di testo: 18 - pagine totali: 6 e record per pagina 3), invece avrei bisogno di visualizzare una cosa simile, fermo restando le impostazioni di prima Pagine (6): 1 2 3 successive >> (record totali nel file di testo: 18 - pagine totali: 6 e record per pagina 3) quando si fa click su "successive" dovrebbe mostrare questo:

Pagine (6): >

Questa è la parte di codice che prima è stata tagliata...

// continua da prima...

// ordino i record in maniera decrescente

rsort($articles, SORT_NUMERIC);

reset($articles);

  // stampo i record

  for($n = $first; $n < $break; $n++) {

    echo @$articles[$n];

  }

// visualizzo e creo i link per le pagine totali

$sys_pag = "Pagine totali: ($tot_pag): ";

for($i = 1; $i

risposto 11 anni fa
neida
X 0 X

Ciao neida e benvenuto,

mi scuso personalmente per i problemi che hai avuto nell'invio del tuo messagio, anche se non so da cosa possano essere causati  :P. Potrsti cortesemente allegare lo script in questione a questa discussione? E' sufficiente che tu risponda alla discssione e, cliccando sul link "Opzioni addizionali..." potrai allegare il file in questione.

Grazie e a presto.

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Credo di aver risolto il problema dell'invio del codice. Se vuoi prova a riportare il codice in questione.

Ciao.

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Si, adesso non ci sono problemi con la lettura del codice...

Riepilogo il tutto molto brevemente.

Dal codice che trovi in allegato riesco ad ottenere questoPagine totali(6): 1 2 3 4 5 6

considera le impostazioni seguenti: nel file di testo ci sono 18 righe, decido di visualizzare 3 righe per pagina e in totale ottengo 6 pagine. ok?

Ora invece, fermo restando le stesse impostazioni di prima, vorrei poter avere una cosa simile:Pagine totali(6): 1 2 3 successive >>

e quando si fa click su "successive >>" dovrebbe stampare una cosa tipoPagine totali(6): << precedenti 2 3 4 successive >>

fino ad arrivare all'ultima pagina ed ottenere questoPagine totali(6): << precedenti 4 5 6

Spero tanto sia tutto chiaro...

Questo è il codice che vorrei modificare (nota la variabile $sys_pag)

<?php 
// nel file database.txt la struttura dei dati è tipo questa:
// 09/06/05|Articolo nr.1|Testo di prova articolo uno... 
// 08/06/05|Articolo nr.2|Testo di prova articolo due... 
// 07/06/05|Articolo nr.3|Testo di prova articolo tre... 
// etc... 

$archives = 'database.txt'; 
$file = file($archives); 

if(isset($_GET['id'])) { 

// recupero il numero della riga di riferimento con
// $id = $_GET['id']; nel file database.txt e stampo
// a video il contenuto con explode...

} else { 

// estraggo i record dal file di testo mostrando solo il "titolo" 
foreach($file as $k => $v) { 
  $rows = explode('|', $v); 
  $articles[] = "- <a href=\"?id=$k\">$rows[1]</a><br>\n"; 
} 

$num_row = count($file); // numero totale di record 
$break = 3; // record per pagina 
$tot_pag = ceil($num_row / $break); // pagine totali 
$cur_pag = (empty($_GET['n'])) ? 1 : (int)$_GET['n']; // pag corrente 
$first = ($cur_pag - 1) * $break; // pagina iniziale 
$break += $first; // limite ed incremento record successivi 

// ordino i record in maniera decrescente 
rsort($articles, SORT_NUMERIC); 
reset($articles); 

  // stampo i record 
  for($n = $first; $n < $break; $n++) { 
    echo @$articles[$n]; 
  } 

// visualizzo e creo i link per le pagine totali 
$sys_pag = "Pagine totali: ($tot_pag): "; 
for($i = 1; $i <= $tot_pag; $i++) { 
  if($i == $cur_pag) $sys_pag .= "<b>$i</b> "; 
  else $sys_pag .= "<a href=\"?n=$i\">$i</a> "; 
} 
echo "<br>$sys_pag"; 
} 
?>

Ok, è tutto! ...spero che mi potrai aiutare...

Grazie

risposto 11 anni fa
neida
X 0 X

Prova così e fammi sapere se funziona.

Nota la variabile $delta che decide quanto ampio deve essere l'intervallo dei numeri di pagina da mostrare.

Ciao!

<?php
// nel file database.txt la struttura dei dati è tipo questa:
// 09/06/05|Articolo nr.1|Testo di prova articolo uno...
// 08/06/05|Articolo nr.2|Testo di prova articolo due...
// 07/06/05|Articolo nr.3|Testo di prova articolo tre...
// etc...

$archives = 'database.txt';
$file = file($archives);

if(isset($_GET['id']))
{

   // recupero il numero della riga di riferimento con
   // $id = $_GET['id']; nel file database.txt e stampo
   // a video il contenuto con explode...

}
else
{
   // estraggo i record dal file di testo mostrando solo il "titolo"
   foreach($file as $k => $v) {
      $rows = explode('|', $v);
      $articles[] = "- <a href=\"?id=$k\">$rows[1]</a><br>\n";
   }

   $num_row = count($file); // numero totale di record
   $break = 3; // record per pagina
   $tot_pag = ceil($num_row / $break); // pagine totali
   $cur_pag = (empty($_GET['n'])) ? 1 : (int)$_GET['n']; // pag corrente
   $first = ($cur_pag - 1) * $break; // pagina iniziale
   $break += $first; // limite ed incremento record successivi

   // ordino i record in maniera decrescente
   rsort($articles, SORT_NUMERIC);
   reset($articles);

   // stampo i record
   for($n = $first; $n < $break; $n++) {
      echo @$articles[$n];
   }

   // visualizzo e creo i link per le pagine totali
   // ------------------------------------------------

   $delta = 1; // decide l'ampiezza dell'intervallo delle pagine da mostrare

   $inizio = $cur_pag - $delta; // prima pagina dell'intervallo
   $fine = $cur_pag + $delta; // ultima pagina dell'intervallo

   if($inizio < 1) $inizio = 1; // la prima pagina non può essere inferiore a 1
   if($fine > $tot_pag) $fine = $tot_pag; // l'ultima pagina non può essere maggiore delle pagine totali

   // costruisco l'intervallo delle pagine
   for($i = $inizio; $i <= $fine; $i++)
   {
      if($i == $cur_pag)
      $sys_pag .= "<b>$i</b> \n";
      else
      $sys_pag .= "<a href=\"?n=$i\">$i</a> \n";
   }

   // se la prima pagina dell'intervallo non è la 1 allora metto "Precedente"
   if($inizio > 1) $sys_pag = '<a href="?n='.($inizio-1)."\">Precedente</a> \n" . $sys_pag;

   // se l'ultima pagina dell'intervallo non è l'ultima vera metto "Successivo"
   if($fine < $tot_pag) $sys_pag .= '<a href="?n='.($fine+1)."\">Successivo</a> \n";

   // le pagine totali
   $sys_pag = "Pagine totali: ($tot_pag): \n" . $sys_pag;

   echo "<br>$sys_pag";
}
?>
risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni, scusa se rispondo solo adesso ma ieri sera non ho avuto modo di connettermi...

Beh, che dire?

La soluzione che hai elaborato è semplicemente fantastica!! O0

Fa esattamente quello che desideravo. Sei un grande!

(Ho fatto solo una semplicissima modifica: valorizzare la variabile $sys_pag, prima della costruzione dell'intervallo per le pagine (dove inizia il ciclo for), per evitare un notice. Per il resto, va che è una scheggia!)

Grazie! ...ancora e ancora grazie! ;)

risposto 11 anni fa
neida
X 0 X

Ciao Ragazzi sono nuovo del forum, mi chiamo massimo ho 30 anni e da poco mi sono avventurato nel mondo del WEB

Gianni leggo il tuo post che ritengo molto interessante e vorrei chiederti una gentilezza.

Il file che ho realizzato io per la paginazione è il seguente:

<?php

$paginazione = "Pagine totali: " . "<strong>".$tot_pages . "</strong> <br />

<br />

";

for($i = 1; $i <= $tot_pages; $i++)

{

if($i == $current_page)

{

$paginazione .= "<strong>".$i . "</strong> ";

}

else {

if($page < 10)

{

$uri=$_SERVER['REQUEST_URI'];

$pagina=substr ($uri, -10, 10);

      if ($pagina!='index.html'){

$uri2=substr_replace($uri, $i, -6, 1);

$paginazione .= "<a href=\"$uri2\" title=\"Vai alla pagina $i\">$i</a> ";

}

else{

$uri2=substr_replace($uri, $i, -12, 1);

$paginazione .= "<a href=\"$uri2\" title=\"Vai alla pagina $i\">$i</a> ";

}

}

else

{

$uri=$_SERVER['REQUEST_URI'];

$pagina=substr ($uri, -10, 10);

      if ($pagina!='index.html'){

$uri2=substr_replace($uri, $i, -7, 2);

$paginazione .= "<a href=\"$uri2\" title=\"Vai alla pagina $i\">$i</a> ";

}

else{

$uri2=substr_replace($uri, $i, -13, 2);

$paginazione .= "<a href=\"$uri2\" title=\"Vai alla pagina $i\">$i</a> ";

}

}

}

}

$paginazione .= "";

?>

Ora volevo chiederti volendolo modificare come quello postato da te come potrei fare?????

Scusami ma come già detto sono nuovo in questo mondo di PHP  >:D

risposto 7 anni fa
colvi77
modificato 7 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda