Вставка вывода на страницу после выполнения документа
В PHP есть ситуация, когда мне нужно, чтобы страница в основном выполнялась, но в вывод с этой страницы был вставлен элемент.
Я думаю, что буферизация выходных данных может помочь, но я не могу понять, как реализовать ее в моей ситуации.
Мой код выглядит так:
//this document is part of a global functions file
function pageHeader (){
//I'm using $GLOBALS here because it works, however I would really rather a better method if possible
$GLOBALS['error_handler'] = new ErrorHandler(); //ErrorHandler class sets a function for set_error_handler, which gets an array of errors from the executed page
require_once($_SERVER['DOCUMENT_ROOT'].'/sales/global/_header.php');
//I would like the unordered list from ->displayErrorNotice() to be displayed here, but if I do that the list is empty because the list was output before the rest of the document was executed
}
function pageFooter (){
$GLOBALS['error_handler'] ->displayErrorNotice(); //this function displays the errors as an html unordered list
include($_SERVER['DOCUMENT_ROOT']."/sales/global/_footer.php");
}
Большинство страниц на сайте включают этот документ и используют pageHeader()
а также pageFooter()
функции. Я пытаюсь добиться того, чтобы поместить неупорядоченный список сгенерированных PHP ошибок в список HTML сразу после включения _header.php. Я могу заставить список работать так, как задумано, если поместить его в нижний колонтитул (после того, как документ был выполнен), но я не хочу его там. Я думаю, что я мог бы переместить это с JS, но я думаю, что должно быть решение PHP.
ОБНОВИТЬ
Мне интересно, есть ли функция обратного вызова для ob_start()
который ищет в буфере регулярное выражение, куда поместить список ошибок, а затем вставляет его, будет решением.
ОБНОВЛЕНИЕ 2 Я решил проблему, мой ответ ниже. Я приму это через 2 дня, когда мне позволят.
2 ответа
Решил это наконец. Ключ заключался в том, чтобы буферизовать выходные данные, найти в буфере заданный фрагмент html и заменить его неупорядоченным списком.
Моя реализация такова:
function outputBufferCallback($buffer){
return str_replace("<insert_errors>", $GLOBALS['error_handler']->returnErrorNotice(), $buffer);
}
function pageHeader (){
ob_start('outputBufferCallback');
//I'm using $GLOBALS here because it works, however I would really rather a better method if possible
$GLOBALS['error_handler'] = new ErrorHandler(); //ErrorHandler class sets a function for set_error_handler, which gets an array of errors from the executed page
require_once($_SERVER['DOCUMENT_ROOT'].'/sales/global/_header.php');
echo '<insert_errors>'; //this snippet is replaced by the ul at buffer flush
}
function pageFooter (){
include($_SERVER['DOCUMENT_ROOT']."/sales/global/_footer.php");
ob_end_flush();
}
Если я правильно понял, вы пытаетесь вставить вычисленный код / ошибки между верхним и нижним колонтитулом. Я предполагаю, что ошибки суммируются / суммируются в самом конце страницы и будут завершены после нижнего колонтитула.
Если это правда, я не могу придумать, как сделать это с чистым php. Он может проходить через страницу только один раз и не может сдвоиться назад. Что вы можете сделать, это создать элемент после нижнего колонтитула и переместить его, используя JavaScript, в область, где вы хотите отобразить его. Это был бы самый простой способ, которым я мог бы подумать. Вы можете сделать это легко с помощью jquery.
Я могу объяснить далее, нахожусь ли я на правильном пути, но я не на 100% уверен, что вы спрашиваете еще...
Командой jquery, которую вы бы использовали, является.appendTo().