Newsgroup: it.comp.www.php
Titolo: dividere testo di un record in più pagine

Ho trovato alcuni script su internet, e nei vecchi messaggi, per 
riuscire a dividere la visualizzazione di molti record su più pagine.
Il mio problema invece è dividere un testo molto lungo, contenuto in un 
campo di un singolo record, stampando a schermo ad esempio, tutto il 
testo diviso in n pagine da 300 caratteri (o righe, è indifferente) 
l'una, con una classica barra di navigazione del tipo pag |1|2|3|4|
il db è mysql.
qualche aiuto?

Mrhanky wrote:

prova a vedere 
http://it.php.net/wordwrap
 
--
www.iuz-lab.info

iuz ha scritto:

Purtroppo non sono molto ferrato con php, però mi sembra di capire che 
il word wrap sia utilizzato per spezzare parole molto lunghe o per 
ottimizzare l'impaginazione con dei ritorni a capo del testo.
Il mio problema è spezzare un testo molto lungo su più pagine, e non 
sono riuscito a trovare esempi che facciano al mio caso.
Mi servirebbe un esempio pratico per questo problema...

 >>qualche aiuto?
ne vale la pena ?
o l'utente per leggere una cosa di deve sorbire un pacco di pubblicita ?


 o l'utente per leggere una cosa di deve sorbire un pacco di pubblicita ?
non ho capito la storia della pubblicità,comunque direi che ne vale la 
pena, la pagina è sviluppata con un layout a 3 colonne, e il testo sarà 
inserito in quella centrale.
Oltre ad un fatto estetico, si ha una migliore visualizzazione della 
pagina e un testo troppo lungo non ha un bel impatto.
poi se per risolvere il problema ci sono altri suggerimenti, sono ben 
accetti...

 Mi servirebbe un esempio pratico per questo problema...
hai ragione scusa.. cmq potresti benissimo cavartela con substr() per
spezzare il testo 
--
www.iuz-lab.info

 il db è mysql.
Ho trovato il problema interessante ed ho studiato una soluzione. Guarda
se ti va bene.
Una volta ricavato il record dal database (che nell'esempio seguente ho
assegnato all'array $line["TESTO"] ) ne ricavo la lunghezza in caratteri
con la funzione strlen e l'assegno alla variabile $long.
Inizializzo le variabili $inizio che corrisponde al numero del primo
carattere seguente al taglio (il primo visibile nella pagina) e $pagina
corrispondente al numero di pagina.
<?
  $long=strlen($line["TESTO"]);
  $inizio=0;
  $pagina=0;
?>
Adesso comincio a tagliare il testo ed a contare il numero di pagine;
inserisco un ciclo while che mi permette di ripetere l'operazione fino
alla fine del documento.
A mano a mano che taglio il documento, incremento anche il numero della
pagina che contiene lo spezzone di documento che sto tagliando.
Con la variabile $fine indico il numero massimo di caratteri da
visualizzare nella pagina. Questo numero non è assolutamente tassativo:
per evitare di troncare le parole 
<?
  while ($inizio<$long){
    $pagina++;
    $fine=10;
?>
Con la variabile $x controllo di non essere arrivata alla fine del
testo; in tal caso assegno alla variabile $fine il numero di caratteri
rimanenti.
In caso contrario, cerco la posizione dell'ultima lettera dell'ultima
parola intera.
<?
    $x=$fine+$inizio;
    if ($x>=$long){
        $fine=$long-$inizio;
    }else{
        If (substr($line["TESTO"],$x,1)<>" "){
          $fine=strrpos(substr($line["TESTO"],$inizio,$fine)," ");
        }
        /* se non ha trovato parole intere nel range, cerca la fine
della parola nel range successivo (utile con limite di carattere per
pagina basso)*/
        if ($fine==""){
          $fine=$long-$inizio;
          $fine=strpos(substr($line["TESTO"],$inizio,$fine)," ");
        }
        /* se non ci sono parole intere neanche nel range successivo
(fine brano)*/
        if ($fine==""){
           $fine=$long-$inizio;
        }
    }
    $fine++;
?>
Una volta ricavata la stringa, faccio in modo che venga stampata quando
viene richiamato il numero di pagina corrispondente.
La variabile $inizio assumerà come nuova posizione il carattere
successivo all'ultimo stampato
<?
    If ($num==$pagina | $num=="" & $pagina==1){
        echo (substr($line["TESTO"],$inizio,$fine));
    }
    $inizio=$fine+$inizio;
  }
?>
Una volta terminata la procedura di divisione del testo in pagine,
creiamo la barra di navigazione fra le varie pagine.
<?
  echo "<br>";
  for ($i=1;$i<=$pagina;$i++){
      if (($i==$num) | ($i==1 & $num=="")){ 
        echo ("Page $i");
      }else{
      echo (" | <a href=\"leggi.php?num=$i\">Page $i<a>");
      }
  }
}
?>
Il risultato di questo script lo vedi all'indirizzo:
http://utenti.lycos.it/catiabenci/TESTO/leggi1.php
Commenti e suggerimenti sono graditi anche dagli altri partecipanti del
gruppo.
Ciao Catia

 
codice di esempio..
<?php
$testo  = "nlines 1           nlines 2           nlines 3           nlines 4          
nlines 5           nlines 6           nlines 7           nlines 8          
nlines 9           ";
function format_text($text, $pag=0, $lines=3, $ret_c="\n", $res_c="<br />",
$line_len=76){
$text = explode($ret_c, wordwrap($text, $line_len));
return(implode("$res_c", array_slice($text, $pag*$lines, $lines)));
}
while($pagina=format_text($testo, $i)){ echo "<br>INIZIO
PAGINA-><br>$pagina<br><br>FINE PAGINA<br>"; $i++;}
?>
la funzione la richiami così..
string format_text(string text, int needed_page, int needed_line_per_page,
string used_return, string needed_output_return, int line_lenght);
per default
pag = 0 (cioè pagina 1 perchè si comincia a contare da 0)
lines = 3 (linee per pagina)
ret_c = "\n" (ogni new_line sarà considerato come carattere di ritorno)
res_c = "<br />" (ogni carattere di ritorno verrà sostituito con <br /> nel
risultato)
line_len = 76 (la lunghezza di ogni riga sarà 76 ma una parola più lunga di
76 forza la riga ad allungarsi)
quindi..
format_text($testo, 1); // ottieni pagina uno con 3 righe
format_text($testo, 1, 6); // ottieni pagina uno con 6 righe
format_text($testo, 1, 6, "<br />", "\n", 45); // beh penso tu abbia capito
count_page($testo);
scusa se ogni tanto ho scritto in inglese, spero di essere stato chiaro
per stampare l'indice ingegnati, tanto penso tu abbia capito come funziona..
-- 
www.iuz-lab.info

 per stampare l'indice ingegnati, tanto penso tu abbia capito come funziona..
Innanzi tutto, complimenti per la funzione è veramente bella.
Per l'indice non ci sono problemi ho già risolto.
Ti ringrazio perchè è da poco che "gioco" con php e non ero a conoscenza
delle funzioni explode() ed implode().
Ciao Catia
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


codice di esempio..
<?php.....
Sfida:
riusciresti a fare la stessa cosa avendo però un testo html, mantenendone
l'integrità dei tag? Io no! E ci ho provato un bel pò non ti dico quanto per
mantenere una certa dignità, se ci riesci e posti il codice non dico che ti
offro da bere ma un bell'elogio te lo meriteresti! ;o)
Stefano

 Stefano
(proviamoci)
postami un html di esempio che racchiuda tutti i possibili tag che dovrei
mantenere integri..
-- 
www.iuz-lab.info



Tutti...
Anche quelli più complessi e che ne annidano altri, tipo le tabelle..
Anche quelli di word   :''(
Stefano

 Stefano
sicuramente non è proprio facile ma possibilissimo.. più che altro lascerei
perdere per il carico di lavoro che porterebbe lo script..
-- 
www.iuz-lab.info