Tag Archives: rentetan

Bagaimana untuk menyimpan rentetan ke fail tempatan dalam PHP?

Jawatan ini adalah yang kedua dalam siri geek saya.

Walaupun pengaturcaraan Tweaker Tema saya, Saya terserempak dengan masalah ini. Saya mempunyai tali pada pelayan saya dalam program php saya (lembaran gaya yang mengagak, sebenarnya), dan saya mahu memberi pengguna pilihan untuk menyimpannya ke fail komputer. Saya akan tunggu fikir ini adalah masalah biasa, dan semua masalah yang sama boleh diselesaikan dengan Googling. Tetapi, lo dan tiba-tiba, Saya tidak dapat mencari jalan penyelesaian yang memuaskan. Saya mendapati saya sendiri, dan pemikiran saya akan berkongsi di sini, untuk manfaat semua Googlers masa depan belum datang dan pergi.

Sebelum kita pergi ke dalam penyelesaian, mari kita memahami apa masalah sebenar. Masalahnya ialah dalam pembahagian kerja antara dua komputer — satu adalah pelayan, mana WordPress dan PHP anda berjalan; yang lain adalah komputer pelanggan di mana tontonan yang sedang berlaku. Rentetan kita bercakap mengenai adalah pada pelayan. Kami mahu menyimpannya di dalam fail pada komputer pelanggan. Satu-satunya cara untuk melakukannya adalah dengan menyampaikan tali sebagai jawapan html.

Pada pandangan pertama, ini tidak kelihatan seperti masalah besar. Lagipun, pelayan kerap menghantar rentetan dan data kepada pelanggan — itulah bagaimana kita melihat apa-apa pada pelayar yang, termasuk apa yang anda membaca. Jika ia hanya mana-mana program PHP yang mahu menyelamatkan tali, ia tidak akan menjadi masalah. Anda hanya boleh membuang tali ke dalam fail pada pelayan dan berkhidmat fail.

Tetapi apa yang anda lakukan jika anda tidak mahu untuk memberi seluruh dunia cara lambakan tali untuk fail pada pelayan anda? Baik, anda boleh melakukan sesuatu seperti ini:

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

Jadi, hanya meletakkan kod ini di foo.php anda yang mengira $ string stylestr dan anda telah selesai. Tetapi masalah kami adalah bahawa kami sedang bekerja dalam rangka plugin WordPress, dan tidak boleh menggunakan pengepala() panggilan. Apabila anda cuba untuk berbuat demikian, anda akan mendapat mesej ralat yang mengatakan kepala yang sudah selesai dude. Untuk masalah ini, Saya dapati penyelesaian bijak di salah satu plugin yang saya gunakan. Lupa yang satu, tetapi saya rasa ia adalah satu teknik yang biasa. Penyelesaian itu adalah untuk mentakrifkan iFrame kosong dan menetapkan sumber untuk apa fungsi PHP yang akan menulis. Sejak iFrame menjangka sumber HTML penuh, anda dibenarkan (sebenarnya, wajib) untuk memberikan pengepala() arahan. Kod yang kelihatan seperti:

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

Sekarang soalnya ialah, apa yang perlu menjadi sumber? Dalam erti kata lain, apa yang $ styleurl? Jelas, ia tidak akan menjadi satu fail statik pada pelayan anda. Dan tujuan jawatan ini adalah untuk menunjukkan bahawa ia tidak perlu menjadi fail pada pelayan di semua. Ia adalah jawapan dua bahagian. Anda perlu ingat bahawa anda bekerja dalam rangka kerja WordPress, dan anda tidak boleh membuat fail php berdiri sendiri. Satu-satunya perkara yang boleh anda lakukan adalah untuk menambah hujah-hujah kepada fail php yang sedia ada, atau plugin yang anda buat. Jadi anda pertama membuat butang mengemukakan seperti berikut:

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

Ambil perhatian bahawa atribut nama butang adalah “saveCSS.” Sekarang, dalam sebahagian daripada kod yang mengendalikan penyerahan yang, anda melakukan sesuatu seperti:

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

?>

Ini adalah $ styleurl yang akan anda berikan sebagai sumber iFrame anda, ke hadapan. Perhatikan bahawa ia adalah sama dengan URL halaman pluging anda, kecuali anda berjaya menambah “?menyelamatkan” pada akhir ia. Trik seterusnya adalah untuk menangkap hujah itu dan mengendalikan. Untuk itu, anda menggunakan fungsi API WordPress, add_action sebagai:

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

Ini menambah fungsi saveCSS kepada sebahagian yang init plugin anda. Sekarang anda perlu untuk menentukan fungsi ini:

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

Sekarang kita yang hampir percuma. Satu-satunya perkara yang perlu difahami adalah bahawa anda daripada perlu mati(). Jika fungsi anda tidak mati, ia akan memuntahkan keluar seluruh perkara WordPress yang dihasilkan ke dalam fail menyelamatkan anda, appending kepada rentetan $ stylestr anda.

Ia mungkin kelihatan rumit. Baik, Saya rasa ia agak rumit, tetapi apabila anda melaksanakannya dan mendapatkan ia berjalan, anda boleh (dan berbuat) lupa mengenainya. Sekurang-kurangnya, Saya buat. Itulah sebabnya saya mencatatkan di sini, supaya masa akan datang saya perlu melakukannya, Saya boleh melihat ia.