Невозможно повторно объявить DOMPDF_autoload()

Я знаю, что этот вопрос задавался раньше, но я не понял, как его решить. Например, это DOMPDF, я не могу одновременно создать два PDF-файла занимается одной и той же темой. Я пытался следовать решению, но пока не так хорошо. У меня есть цикл, в котором я хочу создать два файла PDF (два счета). Случай 1 работает только с 1 циклом, во время другого цикла он зависает (Невозможно повторно объявить DOMPDF_autoload() (ранее объявленный в /vendor/dompdf/include/autoload.inc.php в строке 24). Варианты 2 и 3, которые у меня есть пытался применить из приведенного выше вопроса stackoverflow, вообще не работает (некоторые ошибки времени выполнения, синтаксические ошибки, которые я не могу понять).

Это мой код:

$invoices = 2;
$invoice_names = array();
for ($i=1; $i<=$invoices; $i++)
{
$invoice_file_name = 'invoice' .$i. '.pdf';
$invoice_names[] = $invoice_file_name;

require '../vendor/dompdf/include/autoload.inc.php';

// disable DOMPDF's internal autoloader if you are using Composer
define('DOMPDF_ENABLE_AUTOLOAD', false);

// include DOMPDF's default configuration
require_once '../vendor/dompdf/dompdf_config.inc.php';

$htmlString = '';
ob_start();
// This creates html format of an invoice
include('pdf_laskupohja_vanha.php');
$htmlString .= ob_get_clean();

// Case 1 working for the 1. loop
$dompdf = new DOMPDF();
$dompdf->load_html($htmlString);
$dompdf->render();
$output = $dompdf->output();

/* Case 2
$view = $dompdf->load->view("viewname", $htmlString, true);
//create a new dompdf instance
$dompdf->pdf = new DOMPDF();
//render and output pdf
$dompdf->pdf->load_html($view);
$dompdf->pdf->render();
$output = $dompdf->pdf->output(array("compress" => 0));
*/

/* Case 3
$dompdf->load->library('pdf');
$dompdf = new DOMPDF();
$dompdf->set_base_path(['path']);
//create a new dompdf instance (this is the crucial step)
$dompdf->load_view('viewname', $htmlString); 
$dompdf->render();
$output = $dompdf->output();
*/  
file_put_contents('../invoices/' .$invoice_file_name, $output);
}
echo "Invoice(es) OK";

Есть ли «скрытый» способ их реализации (случай 2 и 3), которые не показаны напрямую? Вероятно, включая некоторую модификацию dompdf_config.inc.php или класса DOMPDF. Дело в том, что я не совсем понимаю структуру классов php. Вероятно, основное решение состоит в том, чтобы стереть объект класса предыдущего цикла и создать еще один, но как? Поверьте мне, я боролся с этим уже несколько дней.


person user2857221    schedule 05.05.2016    source источник


Ответы (1)


Я думаю, что вы задаете здесь несколько вопросов, поэтому я отвечу на тот, который, вероятно, затронет вас больше всего, вопрос о повторном использовании.

Существует известная проблема повторного использования экземпляра объекта dompdf. Обходной путь, если вам нужно отобразить только несколько отдельных PDF-файлов, заключается в том, чтобы просто unset использовать переменную $dompdf и повторно использовать ее.

$dompdf = new DOMPDF();
$dompdf->load_html('hello world');
$dompdf->render();
$pdfHello = $dompdf->output();

unset($dompdf);

$dompdf = new DOMPDF();
$dompdf->load_html('goodbye world');
$dompdf->render();
$pdfBye = $dompdf->output();

Еще одна заслуживающая внимания проблема заключается в том, что вы должны включать автозагрузчик dompdf только один раз, а не один раз для каждого цикла. Поместите оператор require в начало файла.

require '../vendor/dompdf/include/autoload.inc.php';

$invoices = 2;
$invoice_names = array();
for ($i=1; $i<=$invoices; $i++)
{
  // PDF-generating code here (NO dompdf require statement)
}
echo "Invoice(es) OK";
person BrianS    schedule 05.05.2016
comment
Спасибо за ответ, но (хотя и не упоминается) я уже пробовал оба предложения. Не работало. - person user2857221; 06.05.2016
comment
На самом деле, я попробовал это во второй раз, и теперь это сработало! Странно у меня не получилось с первого раза (поместить autoload.inc.php вне цикла)??? Что ж, я уже не первый раз что-то слеплю :-| Это сводит меня с ума... Но спасибо! - person user2857221; 06.05.2016
comment
У меня часто бывают такие дни :/ - person BrianS; 07.05.2016