Wie eine Zeichenfolge in eine lokale Datei in PHP speichern?

Dieser Beitrag ist der zweite in mein Geek-Serie.

Bei der Programmierung meiner Theme Tweaker, Ich auf dieses Problem kam. Ich hatte einen String auf meinem Server in meinem PHP-Programm (die gezwickt Sheet, tatsächlich), und ich wollte, dass die Benutzer die Möglichkeit, das Speichern in einer Datei sein Computer zu geben. Ich hätte gedacht, das war ein häufiges Problem, und alle gängigen Probleme können durch googeln gelöst werden. Aber, siehe da, Ich konnte einfach nicht, eine zufriedenstellende Lösung zu finden. Ich fand meine eigenen, und dachte, ich würde sie hier teilen, zum Nutzen aller zukünftigen Googler noch kommen und gehen.

Bevor wir in die Lösung gehen, Lassen Sie uns zu verstehen, was das Problem ist,. Das Problem ist in der Arbeitsteilung zwischen zwei Computern — einem der Server, wo Ihre Wordpress und PHP laufen; die andere ist dem Client-Computer, wo der Betrachtungsstattfindet. Der String wir reden ist auf dem Server. Wir wollen es in einer Datei auf dem Client-Computer speichern. Der einzige Weg, es zu tun ist, indem er die Zeichenkette als HTML-Antwort.

Auf den ersten Blick, Diese sieht nicht aus wie ein großes Problem. Schließlich, Server senden Strings und Daten für Kunden regelmäßig — das ist, wie wir sehen, alles auf dem Browser, einschließlich dessen, was Sie gerade lesen. Wenn es irgendein PHP-Programm, um die Zeichenfolge zu retten will, Es wäre kein Problem,. Sie könnten nur werfen den String in eine Datei auf dem Server und servieren Sie die Datei.

Aber was tun Sie, wenn Sie nicht möchten, dass die ganze Welt eine Art von Dumping Strings in Dateien auf Ihrem Server? Gut, Sie könnte so etwas tun:

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

So, setzen Sie einfach diesen Code in Ihren foo.php, die die Zeichenfolge $ stylestr berechnet und Sie sind fertig. Aber unser Problem ist, dass wir uns in die Wordpress-Plugin Framework arbeiten, und die Kopfzeile nicht verwenden können,() Anrufe. Wenn Sie versuchen, das zu tun, Sie erhalten die Fehlermeldung, dass Header bereits Kerl getan. Für dieses Problem, Ich fand die geniale Lösung in eines der Plugins, die ich benutze. Passwort denen einer, aber ich denke, es ist eine übliche Technik. Die Lösung ist, um eine leere iFrame definieren und ihre Quelle, was die PHP-Funktion würde schreiben. Seit iFrame erwartet eine vollständige HTML code, Sie dürfen (tatsächlich, verpflichtet) um die Kopfzeile geben() Richtlinien. Das Code-Snippet sieht ungefähr so ​​aus:

<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 .'"' ;
?>

Nun ist die Frage, was sollte die Quelle sein? Mit anderen Worten, was ist $ styleurl? Deutlich, es wird nicht um eine statische Datei auf Ihrem Server sein. Und der Zweck dieser Stelle ist es zu zeigen, daß es nicht um eine Datei auf dem Server überhaupt. Es ist eine zweiteilige Antwort. Sie müssen bedenken, dass Sie innerhalb der Wordpress-Framework arbeiten, und Sie können eigenständige PHP-Dateien nicht machen. Das einzige, was Sie tun können, um Argumente zu den bestehenden PHP-Dateien hinzufügen, oder die Plugins die Sie erstellt haben. So können Sie zunächst eine Absenden-Button wie folgt:

<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>

Beachten Sie, dass das name-Attribut des Buttons ist “saveCSS.” Jetzt, in dem Teil des Codes, der unterwirft Griffe, Sie etwas tun:

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

?>

Dies ist der $ styleurl, die Sie als Quelle für Ihre iFrame geben, vorwärts. Beachten Sie, dass es das gleiche wie Ihr pluging Seite URL, außer dass Sie es geschafft, hinzufügen “?sparen” am Ende von. Der nächste Trick ist, dieses Argument zu erfassen und damit umgehen. Dafür, Sie Wordpress API-Funktion, add_action als:

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

Dies fügt eine Funktion saveCSS in die init Teil des Plugin. Jetzt haben Sie, um diese Funktion zu definieren:

<?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() ;
}
?>

Jetzt kostenlos sind wir fast zu Hause. Das einzige, was zu verstehen ist, dass man tun muss das Werkzeug(). Wenn Ihre Funktion nicht stirbt, es wird aus dem Rest der Wordpress erzeugt Sachen in Ihre Datei speichern speien, Anhängen an Ihren string $ stylestr.

Es kann kompliziert aussehen. Gut, Ich denke, es ist ein bisschen kompliziert, aber wenn Sie es umsetzen und bekommen es läuft, Sie können (und tun,) vergessen Sie es. Mindestens, Ich. Das ist, warum ich gepostet hier, so dass das nächste Mal, wenn ich brauche, um es zu tun, Ich kann es nachschlagen.

Kommentare