modifica da codice del file settings.php

5 contenuti / 0 new
Ultimo contenuto
modifica da codice del file settings.php

Ciao a tutti,
per la creazione di un nostro modulo, abbiamo bisogno di andare a modificare da codice una riga del file Settings.php.

Nello specifico, dobbiamo inserire (se non esiste) o modificare (se esiste) la riga che contiene i dati per l'accesso ad un db esterno(moodle nel nostro caso).
Questo è quello che abbiamo scritto:

        $found = false;
$name=$form['values']['db_name'];
$user=$form['values']['user'];
$pass=$form['values']['password'];
$address=$form['values']['server_address'];
$f = fopen('///opt/lampp/htdocs/drupal/sites/default/settings.php', 'r+');
while($line = fgets($f)) {
             if(preg_match("/(\['moodle'\])+/", $line)) {
                  $found = true;
                  fputs($f, preg_replace($line, "\$db_url['moodle'] = 'mysqli://".$user.":".$pass."@".$address."/".$name."';", $line));
                   break;
              }
}
if(!$found) {
   fputs($f, "\$db_url['moodle'] = 'mysqli://".$user.":".$pass."@".$address."/".$name."';");
}
fclose($f);

Il risultato però è:

1- Se la stringa non esiste viene inserita la stringa corretta alla fine del file
2- Se la stringa esiste, viene copiata la stessa nella riga successiva.

Qualcuno ha idea di dove si trovi l'errore?
Grazie mille in anticipo per l'attenzione!

Una curiosità: ti serve lo script per ogni installazione o quando? Che link utilizzi? Sai mi sembra solo una parte di codice perchè $name=$form['values']['db_name']; significa che c'è un form da qualche parte.

Se mi dai delucidazioni posso capire meglio.

Ps: $f = fopen('///opt/lampp/htdocs/drupal/sites/default/settings.php', 'r+'); r+ significa: apre un file esistente per operazioni di lettura e scrittura. I contenuti del file, nel caso esista già, rimangono inalterati ma la file position è settata a 0 cosicchè si possa procedere alla sovrascrittura.

Il comportamento è quanto indicato nel codice, tu stai dicendo:

Apri il file

<?php
// ..
$f = fopen('///opt/lampp/htdocs/drupal/sites/default/settings.php', 'r+');
?>

Scorri ogni linea del file

<?php
while($line = fgets($f)) {
?>

Controlla se la riga contiene ['moodle']:

<?php
            
if(preg_match("/(\['moodle'\])+/", $line)) {
?>

Se la contiene setta la variabile trovato a true..

<?php
                  $found
= true;
?>

Inserisci in fondo al file che hai aperto prima, la riga di connessione precedentemente trovata, sostituita con quella precedente

<?php
                  fputs
($f, preg_replace($line, "\$db_url['moodle'] = 'mysqli://".$user.":".$pass."@".$address."/".$name."';", $line));
?>

Termina il loop

<?php
                  
break;
              }
}
?>

Se non trovi nulla aggiungi una nuova riga
<?php
if(!$found) {
  
fputs($f, "\$db_url['moodle'] = 'mysqli://".$user.":".$pass."@".$address."/".$name."';");
}
?>

Chiudi il file

<?php
fclose
($f);
?>

Mentre credo tu debba andare a fare la sostituzione della riga nel fil, ad esempio (tanto per farti capire, NON è un codice fatto bene), farei:

<?php
$f
= fopen('///opt/lampp/htdocs/drupal/sites/default/settings.php', 'w');
$fp = fopen('///opt/lampp/htdocs/drupal/sites/default/settings-new.php', 'w');
while(
$line = fgets($f)) {
   if(
preg_match("/(\['moodle'\])+/", $line)) {
    
$line = preg_replace($line, "\$db_url['moodle'] = 'mysqli://".$user.":".$pass."@".$address."/".$name."';", $line);
   }
  
fwrite($fp, $line);
}
fclose($fp);
fclose($f);
?>

Ciao
Marco
--
My blog
Working at @agavee

Intanto grazie a tutti per le risposte.
Girovagando su internet per qualche giorno alla fine siamo giunti a questa conclusione. non so se è quella migliore, in ogni caso fa al caso nostro =)

@danzisiweb:
Questa è la funzione submit di un form che imposta i settings del nostro modulo, quindi non deve essere eseguita solo all'installazione, ma potenzialmente anche altre volte.

@mavimo:
Se ho capito bene la soluzione che hai proposto, pare che tu crei un nuovo file e poi vai ad inserire la riga necessaria su quello. Noi dobbiamo in ogni caso andare a modificare l'originale =)

<?php
 
function moodledata_settings_form_submit($form_id,$form){
   
$found = false;
   
$name=$form['values']['db_name'];
   
$user=$form['values']['user'];
   
$pass=$form['values']['password'];
   
$address=$form['values']['server_address'];
   
$nomeFile='///opt/lampp/htdocs/drupal/sites/default/settings.php';
   
$file = file($nomeFile,FILE_IGNORE_NEW_LINES);
   
$f = @fopen('///opt/lampp/htdocs/drupal/sites/default/settings.php', 'r+');
    if(
$f==NULL) {
       
drupal_set_message("Can't open Settings.php, check access permissions to the file.","error");
    }else {
        while(
$line = fgets($f)) {
        if(
preg_match("/(\['moodle'\])+/", $line)) {
          
$found = true;
          
$rigaDaSostituire=$line;
           if(
$pass=='' || $pass==null || empty($pass)){
              
$rigaDiSostituzione="\$db_url['moodle'] = 'mysql://".$user."@".$address."/".$name."';";
           }else {
              
$rigaDiSostituzione="\$db_url['moodle'] = 'mysql://".$user.":".$pass."@".$address."/".$name."';";
           }
          
$indiciRigheDaSostituire = array_keys($file,$rigaDaSostituire);
          
$righeDiSostituzione = array_fill_keys($indiciRigheDaSostituire,$rigaDiSostituzione);
            
$file = array_replace( $file, $righeDiSostituzione);
            
file_put_contents($nomeFile,implode("\n",$file));
            
drupal_set_message("Settings has been saved");
           break;
        }
        }
        if(!
$found) {
            if(
$pass=='' || $pass==null || empty($pass)){
               
fputs($f, "\n\$db_url['moodle'] = 'mysql://".$user."@".$address."/".$name."';");
           }else {
               
fputs($f, "\n\$db_url['moodle'] = 'mysql://".$user.":".$pass."@".$address."/".$name."';");
            }
           
drupal_set_message("Settings has been saved");
        }
       
fclose($f);
    }
}
 
?>

Ancora una domanda (scusate se abusiamo della vostra pazienza),
attualmente noi passiamo il path assoluto del file Settings.php, però questo è valido solo nel caso in cui si utilizzi lampp.
Attualmente la cartella di lavoro è opt/lampp/htdocs/drupal/module/moodledata, mentre il file settings.php si trova in opt/lampp/htdocs/drupal/sites/defalut.
Come possiamo andare indietro di due cartelle (ripartendo da drupal per intendersi) così da poter passare ad fopen un path che sia valido per tutti?

@buribasi: si era solo per farti capire il motivo dell'"errato funzionamento" di quello che stavi facendo (in realtà stava facendo quello che gli chiedevi :) )

Potresti fare anche solo uno spostamento dei file alla fine ;)

settings.php -> settings-old.php
settings-new.php -> settings.php

Ciao
Marco
--
My blog
Working at @agavee