2016-10-17 4 views
0

У меня есть функция FDPF, которая создает стандартный PDF-код для различных частей веб-сайта. Он просто принимает некоторые данные, создает многостраничный PDF-файл и возвращает объект PDF, например.Несколько PDF-файлов в Loop с FPDF

function pdfBuild($orderData) { 



class PDF extends FPDF 
{ 
// Page header 
function Header() 
{ 
    // Logo 
    $this->Image('logo.png',10,6,30); 
    // Arial bold 15 
    $this->SetFont('Arial','B',15); 
    // Move to the right 
    $this->Cell(80); 
    // Title 
    //$this->Cell(80,10,'Game Sheet',1,0,'C'); 
    // Line break 
    $this->Ln(20); 
} 

// Page footer 
function Footer() 
{ 
    // Position at 1.5 cm from bottom 
    $this->SetY(-15); 
    // Arial italic 8 
    $this->SetFont('Arial','I',8); 
    // Page number 
    $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); 
} 



} 

$pdf = new PDF(); 
$pdf->AliasNbPages(); 
$pdf->SetFont('Times','',12); 
    for($a=0;$a<count($orderData);$a++) { 
    $pdf->AddPage(); 
    //Add stuff to PDF 
    } 
return $pdf; 

} 

Моя проблема возникает в цикле, что сообщения электронной почты отдельные PDF-файлы из клиентов, например

function buildPDFs() { 

    //Get a location 
    $query = "GET SOME CLIENT INFORMATION"; 
    $result = getSQLConnection($query); 
    if ($result->num_rows > 0) { 

      while($row = $result->fetch_assoc()) { 

       //Get some info from dB using $row 

       //Format info from db into $data variable 

       $pdf = pdfBuild($data); 

       //Test Data 
       $to = '[email protected]'; 
       $from = '[email protected]'; 
       $subject = 'PDFs' 
       $message = 'Howdy'; 
       //End 
       emailPDF($pdf, $to, $from, $subject, $message); 

      } 
    } 

    echo 'Done'; 

} 

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

Нужно ли отключать или иным образом «разрушать» объект PDF каждый раз в цикле?

Обновление

Удаление определения класса Колонтитулы, как в приведенном выше фрагменте кода, решает эту проблему. Но я не понимаю, почему.

Вопрос: Почему удаление кода расширения класса разрешает проблему и позволяет циклу генерировать разные PDF-файлы каждый раз, как и ожидалось, и отправлять их по электронной почте правильно?

Ответьте на сообщение от Veve и решите проблему. Я был неправильно декларирование и полностью злоупотребляя класса

+0

если PDF не изменится, построить его вне цикла только один раз – nogad

+0

Где вы определяете '$ data' внутри вашей функции? – BenM

+0

@nogad, не могли бы вы расширить свой ответ. Как его создать «один раз»? BenM, данные построены с использованием другой функции. Я могу подтвердить его изменение на каждой итерации цикла и отправку. Однако объект PDF не меняется. – Colin

ответ

1

Почему удаление кода «класс расширения» решить эту проблему и позволяют цикл генерировать различные PDF-файлы каждый раз, как и ожидалось, и отправить их правильно?

Это потому, что вы смешиваете декларацию функции и класса в ней.

Чтобы устранить ее, сначала создайте pdf.php с расширенным классом, который только переопределить желаемые методы:

require_once('fpdf.php'); 

class PDF extends FPDF 
{ 
    // Page header 
    function Header() 
    { 
     // Logo 
     $this->Image('logo.png',10,6,30); 
     // Arial bold 15 
     $this->SetFont('Arial','B',15); 
     // Move to the right 
     $this->Cell(80); 
     // Title 
     //$this->Cell(80,10,'Game Sheet',1,0,'C'); 
     // Line break 
     $this->Ln(20); 
    } 

    // Page footer 
    function Footer() 
    { 
     // Position at 1.5 cm from bottom 
     $this->SetY(-15); 
     // Arial italic 8 
     $this->SetFont('Arial','I',8); 
     // Page number 
     $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); 
    } 
} 

После этого, в вашем code.php вы можете использовать этот класс , с кодом, который используется для генерации PDF в своей собственной функции:

require_once('pdf.php'); 

function pdfBuild($orderData) { 
    $pdf = new PDF(); 
    $pdf->AliasNbPages(); 
    $pdf->SetFont('Times','',12); 
     for($a=0;$a<count($orderData);$a++) { 
     $pdf->AddPage(); 
     //Add stuff to PDF 
     } 
    return $pdf; 
} 

function buildPDFs() { 

    //Get a location 
    $query = "GET SOME CLIENT INFORMATION"; 
    $result = getSQLConnection($query); 
    if ($result->num_rows > 0) { 

      while($row = $result->fetch_assoc()) { 

       //Get some info from dB using $row 

       //Format info from db into $data variable 

       $pdf = pdfBuild($data); 

       //Test Data 
       $to = '[email protected]'; 
       $from = '[email protected]'; 
       $subject = 'PDFs' 
       $message = 'Howdy'; 
       //End 
       emailPDF($pdf, $to, $from, $subject, $message); 

      } 
    } 

    echo 'Done'; 

} 
+1

Спасибо, Veve. Отличный ответ и работает! – Colin

Смежные вопросы