Tag Archives: stringa

Come salvare una stringa in un file locale in PHP?

Questo post è il secondo nella mia serie Geek.

Durante la programmazione il mio Tema Tweaker, Mi sono imbattuto in questo problema. Avevo una corda sul mio server nel mio programma php (il foglio di stile ottimizzato, infatti), e volevo dare all'utente la possibilità di salvare in un file il suo computer. Avrei pensato che questo era un problema comune, e tutti i problemi comuni possono essere risolti da usare Google. Ma, Ed ecco, Io non riuscivo a trovare una soluzione soddisfacente. Ho trovato la mia, e ho pensato di condividerle qui, a beneficio di tutti i Googler futuri ancora venire e andare.

Prima di andare nella soluzione, cerchiamo di capire qual è il problema. Il problema è nella divisione del lavoro tra due computer — uno è il server, dove il vostro WordPress e PHP sono in esecuzione; l'altro è il computer del cliente, dove la visualizzazione avviene. La stringa di cui stiamo parlando è sul server. Noi vogliamo salvarlo in un file sul computer del cliente. L'unico modo per farlo è quello di servire la stringa come una risposta html.

A prima vista, questo non sembra un grosso problema. Dopotutto, server inviano regolarmente stringhe e dati ai clienti — è così che vediamo qualcosa sul browser, tra cui quello che stai leggendo. Se fosse un qualsiasi programma PHP che vuole salvare la stringa, non sarebbe un problema. Si può solo scaricare la stringa in un file sul server e servire il file.

Ma cosa fare se non si vuole dare al mondo intero un modo di dumping stringhe da file sul server? Bene, si potrebbe fare qualcosa di simile:

<?php
header('Content-Disposition: attachment; filename="style.css"');
header("Content-Transfer-Encoding: ascii");
header('Expires: 0');
header('Pragma: no-cache');
print $stylestr ;
?>

Così, basta mettere questo codice nel tuo foo.php che calcola la stringa $ stylestr e si è fatto. Ma il nostro problema è che stiamo lavorando nel quadro plugin per WordPress, e non è possibile utilizzare l'intestazione() chiamate. Quando si tenta di farlo, si otterrà il messaggio di errore dicendo che intestazione è già stato fatto tizio. Per questo problema, Ho trovato la soluzione ingegnosa in uno dei plugin che uso. Hai dimenticato che uno, ma credo che sia una tecnica comune. La soluzione è quella di definire un iFrame vuota e impostare la sua fonte di ciò che la funzione PHP scriverebbe. Poiché iFrame aspetta un sorgente HTML completo, si è permesso (infatti, obbligato) invia l'intestazione() direttive. Il frammento di codice simile a:

<iframe id="saveCSS" src="about:blank" style="visibility:hidden;border:none;height:1em;width:1px;"></iframe>
<script type="text/javascript">
var fram = document.getElementById("saveCSS");
<?php echo 'fram.src = "' . $styleurl .'"' ;
?>

Ora la domanda è, ciò che dovrebbe essere la fonte? In altre parole, ciò che è $ styleUrl? Chiaramente, non sarà un file statico sul server. E lo scopo di questo post è quello di dimostrare che esso non deve essere un file sul server a tutti. Si tratta di una risposta in due parti. Bisogna ricordare che si sta lavorando nel quadro di WordPress, e non è possibile rendere i file php standalone. L'unica cosa che puoi fare è quello di aggiungere argomenti per i file php esistenti, o i plugin hanno creato. Quindi prima di effettuare un pulsante di invio come segue:

<form method="post" action="<?php echo $_SERVER["REQUEST_URI"]?>">
<div class="submit">
<input type="submit" name="saveCSS" title="Download the tweaked stylesheet to your computer" value="Download Stylesheet" />
</div>

Si noti che l'attributo nome del pulsante è “saveCSS.” Ora, nella parte del codice che gestisce sottomette, fai qualcosa come:

<?php
if (isset($_POST['saveCSS']))
$styleurl = get_option('siteurl') . '/' . "/wp-admin/themes.php?page=theme-tweaker.php&save" ;

?>

Questo è il $ styleUrl che dareste come la fonte della vostra iFrame, avanti. Si noti che è lo stesso come tua pagina pluging URL, tranne che sei riuscito a aggiungere “?salvare” al termine di essa. Il trucco successivo è quello di catturare tale argomento e gestirlo. Per questo, si utilizza la funzione API di WordPress, add_action come:

<?php
if (isset($_GET['save'] ))
add_action('init', array(&$thmTwk, 'saveCSS'));
else
remove_action('init', array(&$thmTwk, 'saveCSS'));
?>

Questo aggiunge una funzione saveCSS alla parte init del vostro plugin. Ora dovete definire questa funzione:

<?php
function saveCSS() {
header('Content-Disposition: attachment; filename="style.css"');
header("Content-Transfer-Encoding: ascii");
header('Expires: 0');
header('Pragma: no-cache');
$stylestr = "Whatever string you want to save";
ob_start() ;
print $stylestr ;
ob_end_flush() ;
die() ;
}
?>

Ora siamo quasi a casa gratis. L'unica cosa da capire è che si fare necessario il dado(). Se la funzione non muore, si sputano il resto della roba generato WordPress nel tuo file di salvataggio, aggiungerlo alla stringa $ stylestr.

Può sembrare complicato. Bene, Credo che sia un po 'complicato, ma una volta che si implementa e farlo funzionare, puoi (e fare) non pensarci più. Almeno, Faccio. È per questo che ho postato qui, in modo che la prossima volta che ho bisogno di farlo, Posso guardare in su.