Terminazioni di riga con Windows

Premetto che uso Windows XP e PHP 4.2.3, e che sto lavorando ad uno script che usa file di testo.

Voglio che il contenuto di configurazione.txt possa essere modificato tramite form.

configurazione.txt ha questo aspetto:

<tipo>

contenuto

su più

righe

</tipo>

<tipo>

contenuto

su più

righe

</tipo>

...

Ecco come faccio:

  • Ricavo un array con le righe di configurazione.txt tramite file(configurazione.txt)
  • Con una funzione assegno i contenuti che stanno tra <tipo_contenuto>...</tipo_contenuto> a delle variabili
  • Nel form l'utente può ora modificare attraverso una textarea (<textarea>$variabile</textarea>) queste variabili.

Quando, effettuate le modifiche, l'utente preme il tasto di invio si tratta di riscrivere configurazione.txt con i nuovi valori. Quindi raccolgo i dati provenienti dal form in questo modo:

$array[] = "<tipo>\n".trim (stripslashes ($_POST['variabile']))."\n</tipo>";

e dopo avere aperto il file con fopen lo riscrivo con un ciclo foreach. Fine

Mi pare quasi di sentire la domanda: "Ma dove sta il problema?". Vi accontento subito.

Dopo la riscrittura le terminazioni di riga si sono duplicate, così per intenderci

<tipo>

contenuto

su più

righe

</tipo>

e si moltiplicano ad ogni modifica.

Avrei anche risolto ma non capisco perchè se al primo passaggio ricavo l'array in questo modo:

$array = str_replace ("\r", "", file (configurazione.txt)):

eliminando cioè \r con str_replace il problema sparisce.

Perché? Giuro eterna fedeltà a questo forum se trovo qualcuno che ha la pazienza di leggere fino in fondo il post, capirlo, e rispondermi. :smitten: :bye:

inviato 10 anni fa
usecram
X 0 X

Riporta la parte di codice compresa tra

$array = str_replace ("\r", "", file (configurazione.txt))

e

<textarea>$variabile</textarea>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ci provo.

Con questa funzione ricavo l'array:

  function estraiVariabiliConfigurazione ()  {
     global $indirizzo_configurazione, $conferma_inscrizione, $conferma_cancellazione, $benvenuto, 
                $congedo, $firma;
   (file_exists ($indirizzo_configurazione))?
   $array_configurazione = str_replace ("\r", "", file ($indirizzo_configurazione)):
   die ("<p class=\"segnalazione\">Impossibile trovare il file di configurazione</p>");
   $conferma_inscrizione = recuperaDati ($array_configurazione, "confermaInscrizione");
   $conferma_cancellazione = recuperaDati ($array_configurazione, "confermaCancellazione");
   $benvenuto = recuperaDati ($array_configurazione, "benvenuto");
   $congedo = recuperaDati ($array_configurazione, "congedo");
   $firma = recuperaDati ($array_configurazione, "firma");
}

recuperaDati() si occupa di reperire ciò che si trova ad esempio tra <firma> e </firma>

Poi il form:

  function mostraFormConfigurazione ()  {
     global $conferma_inscrizione, $conferma_cancellazione, $benvenuto, $congedo, $firma, $errori;
   echo "<h3>Configurazione programma</h3>";
                //Una funzione si occupa di verificare che non ci siano errori di compilazione
   if (isset ($errori))  { echo "<p class='segnalazione'>Hai compiuto ".count ($errori)." errore(i) di compilazione</p>"; }
   echo "
<form method='post' action='{$_SERVER['PHP_SELF']}'>
<p>
                ";
   //CONFERMA INSCRIZIONE
   echo "<label for='conferma_inscrizione'>Messaggio di conferma inscrizione</label><br />";
                //Stampa solo se l'operatore invia modifiche con errore in questo campo
   if (isset ($errori[0]))  {
        echo $errori[0];
      echo "<textarea rows='10' cols='50' id='conferma_inscrizione' class='errore' name='conferma_inscrizione'></textarea><br />"; }
   else { 
                                //Se l'errore non e in questo campo preserva il valore immesso nella compilazione
      if (isset ($_POST['conferma_inscrizione'])) $conferma_inscrizione = stripslashes ($_POST['conferma_inscrizione']);
      echo "<textarea rows='10' cols='50' id='conferma_inscrizione' name='conferma_inscrizione' title='Non cancellare i valori compresi tra %'>$conferma_inscrizione</textarea><br />"; }
   echo "
</p>";
//eccetera...

Non so quanto possa essere comprensibile.

Nel trascrivere spero di non avere fatto errori... :bye:

risposto 10 anni fa
usecram
X 0 X

riporta la funzione recuperaDati()

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
  function recuperaDati ($array, $tipo_messaggio)  {
     $messaggio = "";
    foreach ($array as $inizio => $valore)  { if (trim($valore) == "<$tipo_messaggio>") { $inizio++; break; } }
     foreach ($array as $fine => $valore)  { if (trim($valore) == "</$tipo_messaggio>")  { break; } }
   $differenza = $fine - $inizio;
   $taglio_matrice = array_slice ($array, $inizio);
   for ($indice= 0; $indice<$differenza; $indice++)  { $messaggio .= $taglio_matrice[$indice]; }
   return $messaggio;
}

In ogni caso grazie per la disponibilità :bye:

risposto 10 anni fa
usecram
X 0 X

Adesso mi serve la parte di codice che usi per ricomporre il file di configurazione con i valori provenienti da $_POST

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
  function riscriviVariabiliConfigurazione ()  {
     global $indirizzo_configurazione;
    $array_configurazione[0] = "<confermaInscrizione>\n".trim (stripslashes ($_POST['conferma_inscrizione']))."\n</confermaInscrizione>";
   $array_configurazione[1] = "<confermaCancellazione>\n".trim (stripslashes ($_POST['conferma_cancellazione']))."\n</confermaCancellazione>";
   $array_configurazione[2] = "<benvenuto>\n".stripslashes ($_POST['benvenuto'])."</benvenuto>";
   $array_configurazione[3] = "<congedo>\n".stripslashes ($_POST['congedo'])."</congedo>";
   $array_configurazione[4] = "<firma>\n".stripslashes ($_POST['firma'])."</firma>";
   $file = fopen ($indirizzo_configurazione, "w");
   foreach ($array_configurazione as $valore)  {
      fwrite ($file, "$valore\n");
   }
   fclose ($file);
}

Ciao :bye:

risposto 10 anni fa
usecram
X 0 X

Ehm ho dimenticato trim() e "\n</tipo>" in $array_configurazione[2] - [4] :bye:

risposto 10 anni fa
usecram
modificato 10 anni fa
X 0 X

Boh!  :giveup: :lamo:

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda