Я использую PHP и html, чтобы разработать простой механизм, который создает отчеты и отправляет их по электронной почте. Я использую функцию file_put_contents()
и функцию ob_get_contents()
в качестве параметра, чтобы создать html файл, который я использую для отправки по почте. Я понял, что если я использую ob_get_contents()
без использования ob_start()
он просто берет весь файл и помещает его в html файл. Это не хорошо для меня, так как я хочу, чтобы только части файла находились в сгенерированном html. Чтобы быть более ясным, мой код выглядит примерно так:
<html and php code I want to include in my html file>
.
.
<html and php code I don't want to include in my html file>
.
.
<html and php code I want to include in my html file>
.
.
<html and php code I don't want to include in my html file>
.
.
.
file_put_contents('report.html', ob_get_contents());
$message = file_get_contents('report.html');
mail($to, $subject, $message, $Headers);
Итак, как мне выбрать только те части, которые я хочу включить в report.html?
Большое спасибо!
Вы делаете это излишне сложно, вам не нужны внешние файлы для создания отчета. Взгляните на это:
<?php
$report = '';
// ...
// Code not included in your report
// ...
ob_start();
// ...
// HTML and PHP code you want in your report
// ...
$report .= ob_get_clean();
// ...
// Code not included in your report
// ...
ob_start();
// ...
// HTML and PHP code you want in your report
// ...
$report .= ob_get_clean();
// Mail it
mail($to, $subject, $report, $headers);
?>
EDIT: Что касается комментария OP.
Вам нужно ob_get_flush()
вместо ob_get_clean()
. Оба возвращают содержимое буфера в виде строки, но первый переносит его на вывод сценария, а второй - пустым.
Может или май не поможет
Я всегда обрабатываю это так же, как загружаю страницы при использовании php vanila PHP со сниппетом! Следующее - это то, что я держал навсегда и использовал. Он имеет две возможные основные функции. Один из них - загрузить представление (html-страницу), а другой - получить страницу html в виде строки для таких вещей, как включение в тело электронной почты.
Например:
// will load a page into the clients browser
// note the page location would indicate it will get the file "index.html" from "$_SERVER["DOCUMENT_ROOT"] . '/views/'"
loadView('/views/index.html');
// or, as would be more helpful to you
$msgHTML = loadView('/views/index.html', NULL, TRUE);
Параметр TRUE
просто указывает функции только возвращать строку и ничего не посылать клиенту.
Параметр NULL
вы видите, предназначен для передачи массива данных. Например, скажем, у вас есть html-страница с таблицей, которую вы хотите заполнить для вызова базы данных. Вы просто сделаете свой звонок, поместите свое возвращение в массив и затем добавьте его на страницу.
$arr = array( 'key' => 'value' );
$msgHTML = loadView('/views/index.html', $arr, TRUE);
// then in the index.html
<div><?= $key; ?></div>
Это упрощает создание HTML-кода для электронной почты.
отрывок
if (!function_exists('loadView')) {
function loadView($file, $data=NULL, $get=FALSE) {
if (!empty($data)) extract($data);
ob_start();
if (is_file($file)) include($file);
$return = ob_get_clean();
if (!$get) echo($return);
return $return;
}
}
Таким образом, вы можете сделать что-то вроде:
$htmlFirst = loadView('report.html', NULL, TRUE);
$msgFirst = 'Some message string here';
$htmlSecond = loadView('report2.html', NULL, TRUE);
$msgSecond = 'Some message string here';
$body = $htmlFirst . $msgFirst . $htmlSecond . $msgSecond;
mail($to, $subject, $body, $Headers);