Как сохранить строку в локальный файл в PHP?

Это сообщение является вторым в моей выродка серии.

При программировании моя тема Tweaker, Я столкнулся с этим проблемы. У меня был строку на моем сервере в моей программе PHP (оптимальной стилей, на самом деле), и я хотел, чтобы дать пользователю возможность сохранить его в файл его компьютера. Я бы подумал, что это общая проблема, и все общие проблемы могут быть решены путем погуглить. Но, И вот, Я просто не мог найти удовлетворительное решение. Я обнаружил, что мой собственный, и думал, я хотел бы поделиться его здесь, на благо всех будущих сотрудников Google еще приходят и уходят.

Прежде чем перейти к решению, давайте разберемся, в чем проблема. Проблема в том, в разделении труда между двумя компьютерами — один сервер, где ваш WordPress и PHP работаете; другой компьютер клиента, где обзора происходит. Строка мы говорим о находится на сервере. Мы хотим сохранить его в файле на компьютере клиента. Единственный способ сделать это через служение строку как HTML ответ.

На первый взгляд, это не выглядит как одной из основных проблем. Ведь, серверы регулярно передача строк и данные клиентов — вот как мы видим, ничего на браузере, в том числе то, что вы читаете. Если бы это было просто любая программа PHP, что хочет сохранить строку, это не было бы проблемой,. Вы могли просто свалка строку в файл на сервере и служат файл.

Но что же делать, если вы не хотите, чтобы дать весь мир способ захоронения строк в файлах на сервере? Хорошо, вы могли бы сделать нечто подобное:

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

Так, просто поставить этот код в ваш foo.php, которая вычисляет строка $ stylestr, и вы сделали. Но наша беда в том, что мы работаем в рамках плагина WordPress, и не может использовать заголовок() звонки. При попытке сделать это, Вы получите сообщение об ошибке сказав, что заголовок уже сделано чувак. Для этой задачи, Я нашел гениальное решение в одном из плагинов, которые я использую. Забыли которых один, но я предполагаю, что это распространенная техника. Решение состоит в определении пустой IFRAME и установить его источник, в какой функции PHP напишет. Так плавающего фрейма ожидает полный источник HTML, вы имеете право (на самом деле, обязанными) с получением указанного в заголовке() директивы. Фрагмент кода выглядит примерно так:

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

Теперь вопрос в том,, что должно быть источником? Другими словами, что составляет $ styleurl? Очевидно, он не собирается быть статический файл на вашем сервере. И цель этой должности, чтобы показать, что он не должен быть файл на сервере вообще. Это из двух частей ответ. Вы должны помнить, что вы работаете в рамках WordPress, и вы не можете сделать автономные файлы PHP. Единственное, что вы можете сделать, это добавить аргументы с существующими файлами PHP, или плагины вы создали. Таким образом, вы сначала сделать кнопку отправки следующим:

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

Обратите внимание, что имя атрибута кнопки является “saveCSS.” Сейчас, в части кода, который обрабатывает Принято, ты это:

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

?>

Это $ styleurl что вы бы дали в качестве источника вашей Iframe, вперед. Обратите внимание, что это то же самое, как ваш pluging страницу URL, исключением того, что вам удалось добавить “?сохранить” В конце этого. Следующий фокус в том, чтобы захватить этот аргумент и обработать его. Для этого, Вы используете функцию API WordPress, add_action как:

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

Это добавляет функцию saveCSS к инициализации части вашего плагина. Теперь вы должны определить эту функцию:

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

Теперь мы почти дома бесплатно. Единственное, что нужно понимать, что вас сделать нужно кубик(). Если ваша функция не умирает, он будет изрыгать из остальной части WordPress генерируемого вещи в вашем файле сохранения, добавив его в свой строки $ stylestr.

Это может показаться сложным. Хорошо, Я предполагаю, что это немного сложнее, но как только вы его реализации и получить это работает, Вы можете (и сделать) забыть о нем. По крайней мере, Я делаю. Вот почему я разместил его здесь, так что в следующий раз мне нужно это сделать, Я могу посмотреть его.

Комментарии