Hoe om 'n string te red na 'n plaaslike lêer in PHP?

Hierdie pos is die tweede een in my geek reeks.

Terwyl programmering my Tema Tweaker, Ek het gekom oor hierdie probleem. Ek het 'n string op my bediener in my PHP program (die tweaked style, in die feit dat), en ek wou die gebruiker die opsie om dit te bewaar tot 'n lêer sy rekenaar gee. Ek sou gedink het dit was 'n algemene probleem, en al die gemeenskaplike probleme kan deur Googlen opgelos word. Maar, kyk en kyk, Ek kon net nie 'n bevredigende oplossing te vind. Ek het my eie, en gedink ek sal dit hier te deel, vir die voordeel van al die toekomstige Googlers nog kom en gaan.

Voor ons gaan in die oplossing, Ons verstaan ​​wat die probleem is. Die probleem is in die verdeling van arbeid tussen twee rekenaars — een is die bediener, waar jou WordPress en PHP hardloop; die ander is die kliënt se rekenaar waar die besigtiging plaasvind. Die string ons praat oor is op die bediener. Ons wil dit op te slaan in 'n lêer op die kliënt se rekenaar. Die enigste manier om dit te doen, is deur die bediening van die string as 'n html antwoord.

Met die eerste oogopslag, dit nie soos 'n groot probleem te kyk. Na alles, bedieners stuur gereeld snare en data aan kliënte — dit is hoe ons sien niks op die die leser, insluitend wat jy lees. As dit was net 'n PHP-program wat wil hê dat die string te red, sou dit nie 'n probleem te wees nie. Jy kan net stort die string in 'n lêer op die bediener en dien die lêer.

Maar wat doen jy as jy nie wil hê die hele wêreld 'n manier van die storting van snare lêers op jou bediener? Wel, jy kan iets soos hierdie te doen:

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

So, net sit hierdie kode in jou foo.php wat bere die string $ stylestr en wat jy gedoen. Maar ons probleem is dat ons is besig om in die WordPress plugin raamwerk, en kan nie die kop gebruik() oproepe. As jy probeer om dit te doen, sal jy die fout boodskap kry sê dat header reeds dude gedoen. Vir hierdie probleem, Ek het gevind dat die vernuftige oplossing in een van die plugins wat ek gebruik. Vergeet wat een, maar ek dink dit is 'n algemene tegniek. Die oplossing is 'n leë iFrame te definieer en stel die bron wat die PHP funksie sou skryf. Sedert iFrame verwag 'n volle HTML bron, jy is toegelaat (in die feit dat, verplig) die kop te gee() voorskrifte. Die kode uit lyk iets soos:

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

Nou is die vraag, wat moet die bron? Met ander woorde, wat is $ styleUrl? Duidelik, dit gaan nie 'n statiese lêer te wees op jou bediener. En die doel van hierdie pos is om te wys dat dit nie 'n lêer op die bediener te wees ten alle. Dit is 'n twee-deel antwoord. Jy moet onthou dat jy besig is binne die raamwerk WordPress, en jy kan nie losstaande PHP lêers. Die enigste ding wat jy kan doen, is om argumente aan die bestaande PHP lêers te voeg, of die plugins wat jy geskep het. So jy eers 'n stuur-knoppie soos volg:

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

Let daarop dat die naam eienskap van die knoppie “saveCSS.” Nou, in die deel van die kode wat voorlê hanteer, jy iets soos doen:

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

?>

Dit is die $ styleUrl wat jy sou gee as die bron van jou iFrame, vorentoe. Let daarop dat dit dieselfde as jou pluging bladsy URL, behalwe dat jy daarin geslaag om by te voeg “?red” aan die einde van dit. Die volgende truuk is dat argument te vang en dit hanteer. Vir daardie, jy gebruik om die WordPress API funksie, add_action as:

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

Dit voeg 'n funksie saveCSS na die init deel van jou plugin. Nou het jy hierdie funksie te definieer:

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

Nou is ons amper by die huis gratis. Die enigste ding om te verstaan ​​is dat jy van moet die steentjie(). As jou funksie nie sterf, dit sal uitspuug die res van die WordPress gegenereer dinge in jou stoor die lêer, aanbring dit aan jou string $ stylestr.

Dit mag lyk ingewikkeld. Wel, Ek dink dit is 'n bietjie ingewikkeld, maar sodra jy dit implementeer en kry dit loop, jy kan (en doen) vergeet dit. Ten minste, Ek doen. Dit is waarom ek dit gepos het hier, sodat die volgende keer wat ek nodig het om dit te doen, Ek kan kyk dit.

Kommentaar