Tag Archives: corda

Como salvar uma string para um arquivo local em PHP?

Este post é a segunda em minha série nerd.

Ao programar minha Tema Tweaker, Me deparei com este problema. Eu tinha uma corda no meu servidor no meu programa php (a folha de estilo refinado, de fato), e eu queria dar ao usuário a opção de salvá-lo em um arquivo de seu computador. Eu já pensei que este era um problema comum, e todos os problemas comuns podem ser resolvidos por pesquisando. Mas, E eis, Eu simplesmente não conseguia encontrar uma solução satisfatória. Eu encontrei a minha própria, e pensei que eu iria partilhá-la aqui, para o benefício de todos os futuros Googlers ainda de ir e vir.

Antes de ir para a solução, vamos entender qual é o problema. O problema está na divisão do trabalho entre dois computadores — um é o servidor, onde o seu WordPress e PHP estão executando; o outro é o computador do cliente onde a visualização tem lugar. A seqüência de que estamos a falar é no servidor. Queremos salvá-lo em um arquivo no computador do cliente. A única maneira de fazer isso é que serve a cadeia como uma resposta html.

À primeira vista, este não parece ser um grande problema. Afinal, servidores enviam regularmente cordas e dados para clientes — é assim que vejo nada no navegador, incluindo o que você está lendo. Se fosse apenas um programa PHP que quer salvar a string, não seria um problema. Você poderia simplesmente despejar a string em um arquivo no servidor e servir o arquivo.

Mas o que fazer se você não quer dar a todo o mundo uma forma de dumping cordas para arquivos em seu servidor? Bem, você poderia fazer algo parecido com isto:

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

Assim, basta colocar este código em seu foo.php que calcula a string $ stylestr e está feito. Mas o nosso problema é que estamos a trabalhar no âmbito plugin para WordPress, e não pode usar o cabeçalho() chamadas. Quando você tenta fazer isso, você receberá a mensagem de erro dizendo que o cabeçalho já é feito cara. Para este problema, Eu encontrei a solução engenhosa em um dos plugins que eu uso. Esqueceu que um, mas eu acho que é uma técnica comum. A solução é definir um iFrame vazio e definir sua origem para que a função PHP escreveria. Desde iFrame espera uma fonte HTML completo, você está autorizado (de fato, obrigado) para dar o cabeçalho() directivas. O trecho de código é algo como:

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

Agora a questão é, o que deve ser a fonte? Em outras palavras, o que é de R $ styleUrl? Claramente, não vai ser um arquivo estático em seu servidor. E o objetivo deste post é mostrar que ele não tem que ser um arquivo no servidor em tudo. É uma resposta em duas partes. Você tem que lembrar que você está trabalhando no âmbito WordPress, e você não pode fazer arquivos php autônomos. A única coisa que você pode fazer é adicionar argumentos para os arquivos php existentes, ou os plugins que você criou. Então você primeiro fazer um botão de envio da seguinte forma:

<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-se que o atributo nome do botão é “saveCSS.” Agora, na parte do código que trata submete, você faz algo como:

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

?>

Este é o $ styleUrl que você daria como a fonte de sua iFrame, para a frente. Note que é o mesmo que o URL da página pluging, exceto que você conseguiu adicionar “?salvar” no final da mesma. O próximo truque é capturar esse argumento e segurá-lo. Para isso, você usa a função API WordPress, add_action como:

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

Isso adiciona um saveCSS função para a parte de inicialização do seu plugin. Agora você tem que definir esta função:

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

Agora estamos quase em casa livre. A única coisa a entender é que você do precisa da matriz(). Se a sua função não morre, ele vai vomitar o resto do WordPress material gerado em seu arquivo salvar, acrescentá-lo à sua string $ stylestr.

Pode parecer complicado. Bem, Eu acho que é um pouco complicado, mas uma vez que você implementá-lo e fazê-lo funcionar, você pode (e fazer) esquecê-lo. Finalmente, Faço. É por isso que eu postei isso aqui, para que a próxima vez que eu preciso para fazê-lo, Eu posso procurá-lo.