Tag Archives: string

How to save a string to a local file in PHP?

Esta postagem é a segunda da minha série geek,,en,Ao programar meu Tema Tweaker,,en,Me deparei com esse problema,,en,Eu tinha uma string no meu servidor no meu programa php,,en,a folha de estilo ajustada,,en,e eu queria dar ao usuário a opção de salvá-lo em um arquivo em seu computador,,en,Eu teria pensado que esse era um problema comum,,en,e todos os problemas comuns podem ser resolvidos no Google,,en,vejam só,,en,Eu simplesmente não conseguia encontrar uma solução satisfatória,,en,Eu encontrei o meu próprio,,en,e pensei em compartilhar aqui,,en,para o benefício de todos os futuros Googlers que ainda virão e partirão,,en,Antes de entrarmos na solução,,en,vamos entender qual é o problema,,en,O problema está na divisão de trabalho entre dois computadores,,en,um é o servidor,,en,onde seu WordPress e PHP estão sendo executados,,en.

While programming my Theme Tweaker, I came across this problem. I had a string on my server in my php program (the tweaked stylesheet, in fact), and I wanted to give the user the option of saving it to a file his computer. I would’ve thought this was a common problem, and all common problems can be solved by Googling. But, lo and behold, I just couldn’t find a satisfactory solution. I found my own, and thought I would share it here, for the benefit of all the future Googlers yet to come and go.

Before we go into the solution, let’s understand what the problem is. The problem is in the division of labor between two computers — one is the server, where your WordPress and PHP are running; o outro é o computador do cliente onde a visualização está ocorrendo,,en,A string de que estamos falando está no servidor,,en,Queremos salvá-lo em um arquivo no computador do cliente,,en,A única maneira de fazer isso é servindo a string como uma resposta html,,en,isso não parece ser um grande problema,,en,servidores enviam regularmente strings e dados para clientes,,en,é assim que vemos qualquer coisa no navegador,,en,incluindo o que você está lendo,,en,Se fosse qualquer programa PHP que deseja salvar a string,,en,não seria um problema,,en,Você pode simplesmente despejar a string em um arquivo no servidor e servir o arquivo,,en,Mas o que você faz se não quiser dar ao mundo uma maneira de despejar strings para arquivos em seu servidor,,en,você poderia fazer algo assim,,en. The string we are talking about is on the server. We want to save it in a file on the client’s computer. The only way to do it is by serving the string as an html reply.

At first glance, this doesn’t look like a major problem. After all, servers regularly send strings and data to clients — that’s how we see anything on the the browser, including what you are reading. If it was just any PHP program that wants to save the string, it wouldn’t be a problem. You could just dump the string into a file on the server and serve the file.

But what do you do if you don’t want to give the whole world a way of dumping strings to files on your server? Well, you could do something like this:

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

So, basta colocar este código em seu foo.php que calcula a string $ stylestr e está feito,,en,Mas nosso problema é que estamos trabalhando na estrutura de plug-ins do WordPress,,en,e não pode usar o cabeçalho,,en,chamadas,,en,Quando você tenta fazer isso,,en,você receberá a mensagem de erro dizendo que o cabeçalho já está feito cara,,en,Para este problema,,en,Encontrei a solução engenhosa em um dos plug-ins que uso,,en,Esqueci qual,,en,mas acho que é uma técnica comum,,en,A solução é definir um iFrame vazio e definir sua fonte para o que a função PHP escreveria,,en,Como o iFrame espera uma fonte HTML completa,,en,você esta autorizado,,en,obrigado,,en,dar o cabeçalho,,en,diretivas,,en,O snippet de código é parecido com,,en,Agora a questão é,,en,qual deveria ser a fonte,,en,o que é $ styleurl,,en,Claramente,,en,não vai ser um arquivo estático em seu servidor,,en. But our trouble is that we are working in the WordPress plugin framework, and cannot use the header() calls. When you try to do that, you will get the error message saying that header is already done dude. For this problem, I found the ingenious solution in one of the plugins that I use. Forgot which one, but I guess it is a common technique. The solution is to define an empty iFrame and set its source to what the PHP function would write. Since iFrame expects a full HTML source, you are allowed (in fact, obliged) to give the header() directives. The code snippet looks something like:

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

Now the question is, what should the source be? In other words, what is $styleurl? Clearly, it is not going to be a static file on your server. E o objetivo desta postagem é mostrar que não precisa ser um arquivo no servidor,,en,É uma resposta em duas partes,,en,Você tem que lembrar que está trabalhando dentro da estrutura do WordPress,,en,e você não pode criar arquivos php independentes,,en,A única coisa que você pode fazer é adicionar argumentos aos arquivos php existentes,,en,ou os plug-ins que você criou,,en,Então você primeiro cria um botão de envio da seguinte maneira,,en,Observe que o atributo de nome do botão é,,en,saveCSS.,,en,na parte do código que lida com os envios,,en,você faz algo como,,en,Este é o $ styleurl que você forneceria como a fonte do seu iFrame,,en,frente,,sv,Observe que é o mesmo que o URL da página de plug-in,,en,exceto que você conseguiu adicionar,,en,Salve ,,en,no final disso,,en,O próximo truque é capturar esse argumento e lidar com ele,,en,Por isso,,en. It is a two-part answer. You have to remember that you are working within the WordPress framework, and you cannot make standalone php files. The only thing you can do is to add arguments to the existing php files, or the plugins you have created. So you first make a submit button as follows:

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

Note that the name attribute of the button is “saveCSS.” Now, in the part of the code that handles submits, you do something like:

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

?>

This is the $styleurl that you would give as the source of your iFrame, fram. Note that it is the same as your pluging page URL, except that you managed to add “?save” at the end of it. The next trick is to capture that argument and handle it. For that, você usa a função API do WordPress,,en,add_action as,,en,Isto adiciona uma função saveCSS à parte init do seu plugin,,en,Agora você tem que definir esta função,,en,Agora estamos quase em casa livres,,en,A única coisa a entender é que você,,en,Faz,,en,precisa do dado,,en,Se sua função não morrer,,en,ele vai vomitar o resto do material gerado pelo WordPress em seu arquivo salvo,,en,anexando-o à sua string $ stylestr,,en,Pode parecer complicado,,en,Eu acho que é um pouco complicado,,en,mas depois de implementá-lo e colocá-lo em execução,,en,você pode,,en,e fazer,,en,esqueça isso,,en,eu faço,,en,É por isso que postei aqui,,en,para que da próxima vez eu precise fazer isso,,en,Eu posso pesquisar,,en,php,,en,plugins,,en,corda,,en,wordpress,,en,Presente de Humboldt por Saul Bellow,,en, add_action as:

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

This adds a function saveCSS to the init part of your plugin. Now you have to define this function:

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

Now we are almost home free. The only thing to understand is that you do need the die(). If your function doesn’t die, it will spew out the rest of the WordPress generated stuff into your save file, appending it to your string $stylestr.

It may look complicated. Well, I guess it is a bit complicated, but once you implement it and get it running, you can (and do) forget about it. At least, I do. That’s why I posted it here, so that the next time I need to do it, I can look it up.