PHP: How to combine these two classes?

2019-05-01 09:56发布

Just like the title says I am having problems combining two classes. Altough this is about FPDF, i do think this is a regular question, since the question could have been about any script.

I am using FPDF to create PDF-documents on the fly. I use it in combination with the FPDI class to add vector images to the PDF file. The script can be found below and works like a charm.

<?php
// Add FPDF to generate PDF files
require_once('../fpdf16/fpdf.php');
// Add FPDI to add the functionality of importing PDF files for layout purposes
require_once('../fpdi131/fpdi.php');
// Code128 to create barcodes
require('code128.php');

// Function that extends FPDI to import a PDF file for layout purposes
class bezwaar extends FPDI
{
    //Page header
    function Header()
    {
        global $tplidx;
        global $pagecount;
        $this->SetFont('Arial','',8); // Font 
        if($this->PageNo()>1) $this->SetY(62); // Margins
        $pagecount = $this->setSourceFile('standaardbezwaar.pdf'); // Open template
        $tplidx = $this->importPage(1, '/MediaBox'); // Template import
        $this->useTemplate($tplidx, 0, 0, 210); // Margins, Margins, Width.
    }

}


#### General settings
$pdf = new bezwaar();
$pdf->AliasNbPages(); // Add headers
$pdf->SetTopMargin(34.7); // Margins top
$pdf->addPage(); // Open page
$pdf->SetFont('Arial','',8); // Set font

#### Content;
$pdf->MultiCell(0,4,$inhoud); // $inhoud is content from a database
$pdf->Output();
?>

The problem is that i would like to add another class to add barcodes, but i don't know how to integrate that. The script below works fine on it's own with FPDF, but not with FPDI combined.

<?php
$pdf=new PDF_Code128();

$code='CODE 128';
$pdf->Code128(50,20,$code,80,20);
$pdf->SetXY(50,45);
$pdf->Write(5,'A set: "'.$code.'"');
?>

The problem is probably because i need to combine these two:

<?php
// I don't know how to combine the two below, especially not since both extend another class..
class bezwaar extends FPDI { } // Extends FPDI
class PDF_Code128 extends FPDF { } // Extends FPDF 


// And / Or

$pdf = new PDF_Code128();
$pdf = new bezwaar();
?>

Sources

FPDF: http://www.fpdf.org
FPDI: http://www.setasign.de/products/pdf-php-solutions/fpdi/
Barcodeclass: http://www.fpdf.org/en/script/script88.php

Question

Could anyone help me out and tell me how to combine both scripts (above)? I am not new in PHP, but I am new with classes, making it pretty hard..enter code here

Trial and Error combining the above two - updates based on the answers I am getting

require_once('../fpdf16/fpdf.php');
require_once('../fpdi131/fpdi.php');
require('code128.php');

// Klasse en functie voor de header
class bezwaar extends FPDI // for example
{
    //Page header
    function Header()
    {
        global $tplidx;
        global $pagecount;
        $this->SetFont('Arial','',8); // Font instellen
        if($this->PageNo()>1) $this->SetY(62); // Pagina marge voor subpaginas
        $pagecount = $this->setSourceFile('standaardbezwaar.pdf'); // Template openen
        $tplidx = $this->importPage(1, '/MediaBox'); // Template importeren
        $this->useTemplate($tplidx, 0, 0, 210); // Marge, Marge, Breedte.
    }
     /**
     * the pdf object
     * @var PDF_Code128
     */
    protected $_pdf;

    /**
     * the code string
     * @var string
     */
    protected $_code = 'CODE 128';

    /**
     * the class constructor method (called automatically upon instantiation)
     * @param PDF_Code128 $pdf
     */
    public function __construct(PDF_Code128 $pdf)
    {
        $this->_pdf = $pdf;
        parent::__construct(); // might be optional
    }

    public function setCode($code)
    {
        $this->_code = $code;
        return $this;
    }

    public function getCode()
    {
        return $this->_code;
    }

    /**
     * The code you had before (bad function name, I know)
     */
    public function setPdfStuff()
    {
        $this->_pdf->Code128(50, 20, $this->_code, 80, 20);
        $this->_pdf->SetXY(50, 45);
        $this->_pdf->Write(5,'A set: "'.$this->_code.'"');
    }
}


$pdf = new bezwaar(new PDF_Code128());
$pdf->AliasNbPages(); // header
$pdf->SetTopMargin(34.7); // margins
$pdf->addPage(); // create new page

//Arial
$pdf->SetFont('Arial','',8);
//Output
$pdf->MultiCell(0,4,$inhoud);

$pdf->setPdfStuff();
$pdf->Output();

Error

Warning: Division by zero in /home/fpdf16/fpdf.php on line 812

Another trial and error

This is what usually works, except this time. I am adding the functions within the barcode class simply in the extended FPDI class. The result is that the script times out unless i deleted this line: $pdf->Code128(50,20,$code,80,20), but that line is ofcoarse needed to create the barcode. Does anyone have an idea where it could time out?

require_once('../fpdf16/fpdf.php');
require_once('../fpdi131/fpdi.php');
require('code128.php');

// Klasse en functie voor de header
class bezwaar extends FPDI
{
    //Page header
    function Header()
    {
        global $tplidx;
        global $pagecount;
        $this->SetFont('Arial','',8); // Font instellen
        if($this->PageNo()>1) $this->SetY(62); // Pagina marge voor subpaginas
        $pagecount = $this->setSourceFile('standaardbezwaar.pdf'); // Template openen
        $tplidx = $this->importPage(1, '/MediaBox'); // Template importeren
        $this->useTemplate($tplidx, 0, 0, 210); // Marge, Marge, Breedte.
    }

    var $T128;                                             // tableau des codes 128
var $ABCset="";                                        // jeu des caractères éligibles au C128
var $Aset="";                                          // Set A du jeu des caractères éligibles
var $Bset="";                                          // Set B du jeu des caractères éligibles
var $Cset="";                                          // Set C du jeu des caractères éligibles
var $SetFrom;                                          // Convertisseur source des jeux vers le tableau
var $SetTo;                                            // Convertisseur destination des jeux vers le tableau
var $JStart = array("A"=>103, "B"=>104, "C"=>105);     // Caractères de sélection de jeu au début du C128
var $JSwap = array("A"=>101, "B"=>100, "C"=>99);       // Caractères de changement de jeu

//____________________________ Extension du constructeur _______________________
function PDF_Code128($orientation='P', $unit='mm', $format='A4') {

    parent::FPDF($orientation,$unit,$format);

    $this->T128[] = array(2, 1, 2, 2, 2, 2);           //0 : [ ]               // composition des caractères
    $this->T128[] = array(2, 2, 2, 1, 2, 2);           //1 : [!]
    $this->T128[] = array(2, 2, 2, 2, 2, 1);           //2 : ["]
    $this->T128[] = array(1, 2, 1, 2, 2, 3);           //3 : [#]
    $this->T128[] = array(1, 2, 1, 3, 2, 2);           //4 : [$]
    $this->T128[] = array(1, 3, 1, 2, 2, 2);           //5 : [%]
    $this->T128[] = array(1, 2, 2, 2, 1, 3);           //6 : [&]
    $this->T128[] = array(1, 2, 2, 3, 1, 2);           //7 : [']
    $this->T128[] = array(1, 3, 2, 2, 1, 2);           //8 : [(]
    $this->T128[] = array(2, 2, 1, 2, 1, 3);           //9 : [)]
    $this->T128[] = array(2, 2, 1, 3, 1, 2);           //10 : [*]
    $this->T128[] = array(2, 3, 1, 2, 1, 2);           //11 : [+]
    $this->T128[] = array(1, 1, 2, 2, 3, 2);           //12 : [,]
    $this->T128[] = array(1, 2, 2, 1, 3, 2);           //13 : [-]
    $this->T128[] = array(1, 2, 2, 2, 3, 1);           //14 : [.]
    $this->T128[] = array(1, 1, 3, 2, 2, 2);           //15 : [/]
    $this->T128[] = array(1, 2, 3, 1, 2, 2);           //16 : [0]
    $this->T128[] = array(1, 2, 3, 2, 2, 1);           //17 : [1]
    $this->T128[] = array(2, 2, 3, 2, 1, 1);           //18 : [2]
    $this->T128[] = array(2, 2, 1, 1, 3, 2);           //19 : [3]
    $this->T128[] = array(2, 2, 1, 2, 3, 1);           //20 : [4]
    $this->T128[] = array(2, 1, 3, 2, 1, 2);           //21 : [5]
    $this->T128[] = array(2, 2, 3, 1, 1, 2);           //22 : [6]
    $this->T128[] = array(3, 1, 2, 1, 3, 1);           //23 : [7]
    $this->T128[] = array(3, 1, 1, 2, 2, 2);           //24 : [8]
    $this->T128[] = array(3, 2, 1, 1, 2, 2);           //25 : [9]
    $this->T128[] = array(3, 2, 1, 2, 2, 1);           //26 : [:]
    $this->T128[] = array(3, 1, 2, 2, 1, 2);           //27 : [;]
    $this->T128[] = array(3, 2, 2, 1, 1, 2);           //28 : [<]
    $this->T128[] = array(3, 2, 2, 2, 1, 1);           //29 : [=]
    $this->T128[] = array(2, 1, 2, 1, 2, 3);           //30 : [>]
    $this->T128[] = array(2, 1, 2, 3, 2, 1);           //31 : [?]
    $this->T128[] = array(2, 3, 2, 1, 2, 1);           //32 : [@]
    $this->T128[] = array(1, 1, 1, 3, 2, 3);           //33 : [A]
    $this->T128[] = array(1, 3, 1, 1, 2, 3);           //34 : [B]
    $this->T128[] = array(1, 3, 1, 3, 2, 1);           //35 : [C]
    $this->T128[] = array(1, 1, 2, 3, 1, 3);           //36 : [D]
    $this->T128[] = array(1, 3, 2, 1, 1, 3);           //37 : [E]
    $this->T128[] = array(1, 3, 2, 3, 1, 1);           //38 : [F]
    $this->T128[] = array(2, 1, 1, 3, 1, 3);           //39 : [G]
    $this->T128[] = array(2, 3, 1, 1, 1, 3);           //40 : [H]
    $this->T128[] = array(2, 3, 1, 3, 1, 1);           //41 : [I]
    $this->T128[] = array(1, 1, 2, 1, 3, 3);           //42 : [J]
    $this->T128[] = array(1, 1, 2, 3, 3, 1);           //43 : [K]
    $this->T128[] = array(1, 3, 2, 1, 3, 1);           //44 : [L]
    $this->T128[] = array(1, 1, 3, 1, 2, 3);           //45 : [M]
    $this->T128[] = array(1, 1, 3, 3, 2, 1);           //46 : [N]
    $this->T128[] = array(1, 3, 3, 1, 2, 1);           //47 : [O]
    $this->T128[] = array(3, 1, 3, 1, 2, 1);           //48 : [P]
    $this->T128[] = array(2, 1, 1, 3, 3, 1);           //49 : [Q]
    $this->T128[] = array(2, 3, 1, 1, 3, 1);           //50 : [R]
    $this->T128[] = array(2, 1, 3, 1, 1, 3);           //51 : [S]
    $this->T128[] = array(2, 1, 3, 3, 1, 1);           //52 : [T]
    $this->T128[] = array(2, 1, 3, 1, 3, 1);           //53 : [U]
    $this->T128[] = array(3, 1, 1, 1, 2, 3);           //54 : [V]
    $this->T128[] = array(3, 1, 1, 3, 2, 1);           //55 : [W]
    $this->T128[] = array(3, 3, 1, 1, 2, 1);           //56 : [X]
    $this->T128[] = array(3, 1, 2, 1, 1, 3);           //57 : [Y]
    $this->T128[] = array(3, 1, 2, 3, 1, 1);           //58 : [Z]
    $this->T128[] = array(3, 3, 2, 1, 1, 1);           //59 : [[]
    $this->T128[] = array(3, 1, 4, 1, 1, 1);           //60 : [\]
    $this->T128[] = array(2, 2, 1, 4, 1, 1);           //61 : []]
    $this->T128[] = array(4, 3, 1, 1, 1, 1);           //62 : [^]
    $this->T128[] = array(1, 1, 1, 2, 2, 4);           //63 : [_]
    $this->T128[] = array(1, 1, 1, 4, 2, 2);           //64 : [`]
    $this->T128[] = array(1, 2, 1, 1, 2, 4);           //65 : [a]
    $this->T128[] = array(1, 2, 1, 4, 2, 1);           //66 : [b]
    $this->T128[] = array(1, 4, 1, 1, 2, 2);           //67 : [c]
    $this->T128[] = array(1, 4, 1, 2, 2, 1);           //68 : [d]
    $this->T128[] = array(1, 1, 2, 2, 1, 4);           //69 : [e]
    $this->T128[] = array(1, 1, 2, 4, 1, 2);           //70 : [f]
    $this->T128[] = array(1, 2, 2, 1, 1, 4);           //71 : [g]
    $this->T128[] = array(1, 2, 2, 4, 1, 1);           //72 : [h]
    $this->T128[] = array(1, 4, 2, 1, 1, 2);           //73 : [i]
    $this->T128[] = array(1, 4, 2, 2, 1, 1);           //74 : [j]
    $this->T128[] = array(2, 4, 1, 2, 1, 1);           //75 : [k]
    $this->T128[] = array(2, 2, 1, 1, 1, 4);           //76 : [l]
    $this->T128[] = array(4, 1, 3, 1, 1, 1);           //77 : [m]
    $this->T128[] = array(2, 4, 1, 1, 1, 2);           //78 : [n]
    $this->T128[] = array(1, 3, 4, 1, 1, 1);           //79 : [o]
    $this->T128[] = array(1, 1, 1, 2, 4, 2);           //80 : [p]
    $this->T128[] = array(1, 2, 1, 1, 4, 2);           //81 : [q]
    $this->T128[] = array(1, 2, 1, 2, 4, 1);           //82 : [r]
    $this->T128[] = array(1, 1, 4, 2, 1, 2);           //83 : [s]
    $this->T128[] = array(1, 2, 4, 1, 1, 2);           //84 : [t]
    $this->T128[] = array(1, 2, 4, 2, 1, 1);           //85 : [u]
    $this->T128[] = array(4, 1, 1, 2, 1, 2);           //86 : [v]
    $this->T128[] = array(4, 2, 1, 1, 1, 2);           //87 : [w]
    $this->T128[] = array(4, 2, 1, 2, 1, 1);           //88 : [x]
    $this->T128[] = array(2, 1, 2, 1, 4, 1);           //89 : [y]
    $this->T128[] = array(2, 1, 4, 1, 2, 1);           //90 : [z]
    $this->T128[] = array(4, 1, 2, 1, 2, 1);           //91 : [{]
    $this->T128[] = array(1, 1, 1, 1, 4, 3);           //92 : [|]
    $this->T128[] = array(1, 1, 1, 3, 4, 1);           //93 : [}]
    $this->T128[] = array(1, 3, 1, 1, 4, 1);           //94 : [~]
    $this->T128[] = array(1, 1, 4, 1, 1, 3);           //95 : [DEL]
    $this->T128[] = array(1, 1, 4, 3, 1, 1);           //96 : [FNC3]
    $this->T128[] = array(4, 1, 1, 1, 1, 3);           //97 : [FNC2]
    $this->T128[] = array(4, 1, 1, 3, 1, 1);           //98 : [SHIFT]
    $this->T128[] = array(1, 1, 3, 1, 4, 1);           //99 : [Cswap]
    $this->T128[] = array(1, 1, 4, 1, 3, 1);           //100 : [Bswap]                
    $this->T128[] = array(3, 1, 1, 1, 4, 1);           //101 : [Aswap]
    $this->T128[] = array(4, 1, 1, 1, 3, 1);           //102 : [FNC1]
    $this->T128[] = array(2, 1, 1, 4, 1, 2);           //103 : [Astart]
    $this->T128[] = array(2, 1, 1, 2, 1, 4);           //104 : [Bstart]
    $this->T128[] = array(2, 1, 1, 2, 3, 2);           //105 : [Cstart]
    $this->T128[] = array(2, 3, 3, 1, 1, 1);           //106 : [STOP]
    $this->T128[] = array(2, 1);                       //107 : [END BAR]

    for ($i = 32; $i <= 95; $i++) {                                            // jeux de caractères
        $this->ABCset .= chr($i);
    }
    $this->Aset = $this->ABCset;
    $this->Bset = $this->ABCset;
    for ($i = 0; $i <= 31; $i++) {
        $this->ABCset .= chr($i);
        $this->Aset .= chr($i);
    }
    for ($i = 96; $i <= 126; $i++) {
        $this->ABCset .= chr($i);
        $this->Bset .= chr($i);
    }
    $this->Cset="0123456789";

    for ($i=0; $i<96; $i++) {                                                  // convertisseurs des jeux A & B  
        @$this->SetFrom["A"] .= chr($i);
        @$this->SetFrom["B"] .= chr($i + 32);
        @$this->SetTo["A"] .= chr(($i < 32) ? $i+64 : $i-32);
        @$this->SetTo["B"] .= chr($i);
    }
}

//________________ Fonction encodage et dessin du code 128 _____________________
function Code128($x, $y, $code, $w, $h) {
    $Aguid = "";                                                                      // Création des guides de choix ABC
    $Bguid = "";
    $Cguid = "";
    for ($i=0; $i < strlen($code); $i++) {
        $needle = substr($code,$i,1);
        $Aguid .= ((strpos($this->Aset,$needle)===false) ? "N" : "O"); 
        $Bguid .= ((strpos($this->Bset,$needle)===false) ? "N" : "O"); 
        $Cguid .= ((strpos($this->Cset,$needle)===false) ? "N" : "O");
    }

    $SminiC = "OOOO";
    $IminiC = 4;

    $crypt = "";
    while ($code > "") {
                                                                                    // BOUCLE PRINCIPALE DE CODAGE
        $i = strpos($Cguid,$SminiC);                                                // forçage du jeu C, si possible
        if ($i!==false) {
            $Aguid [$i] = "N";
            $Bguid [$i] = "N";
        }

        if (substr($Cguid,0,$IminiC) == $SminiC) {                                  // jeu C
            $crypt .= chr(($crypt > "") ? $this->JSwap["C"] : $this->JStart["C"]);  // début Cstart, sinon Cswap
            $made = strpos($Cguid,"N");                                             // étendu du set C
            if ($made === false) {
                $made = strlen($Cguid);
            }
            if (fmod($made,2)==1) {
                $made--;                                                            // seulement un nombre pair
            }
            for ($i=0; $i < $made; $i += 2) {
                $crypt .= chr(strval(substr($code,$i,2)));                          // conversion 2 par 2
            }
            $jeu = "C";
        } else {
            $madeA = strpos($Aguid,"N");                                            // étendu du set A
            if ($madeA === false) {
                $madeA = strlen($Aguid);
            }
            $madeB = strpos($Bguid,"N");                                            // étendu du set B
            if ($madeB === false) {
                $madeB = strlen($Bguid);
            }
            $made = (($madeA < $madeB) ? $madeB : $madeA );                         // étendu traitée
            $jeu = (($madeA < $madeB) ? "B" : "A" );                                // Jeu en cours

            $crypt .= chr(($crypt > "") ? $this->JSwap[$jeu] : $this->JStart[$jeu]); // début start, sinon swap

            $crypt .= strtr(substr($code, 0,$made), $this->SetFrom[$jeu], $this->SetTo[$jeu]); // conversion selon jeu

        }
        $code = substr($code,$made);                                           // raccourcir légende et guides de la zone traitée
        $Aguid = substr($Aguid,$made);
        $Bguid = substr($Bguid,$made);
        $Cguid = substr($Cguid,$made);
    }                                                                          // FIN BOUCLE PRINCIPALE

    $check = ord($crypt[0]);                                                   // calcul de la somme de contrôle
    for ($i=0; $i<strlen($crypt); $i++) {
        $check += (ord($crypt[$i]) * $i);
    }
    $check %= 103;

    $crypt .= chr($check) . chr(106) . chr(107);                               // Chaine Cryptée complète

    $i = (strlen($crypt) * 11) - 8;                                            // calcul de la largeur du module
    $modul = $w/$i;

    for ($i=0; $i<strlen($crypt); $i++) {                                      // BOUCLE D'IMPRESSION
        $c = $this->T128[ord($crypt[$i])];
        for ($j=0; $j<count($c); $j++) {
            $this->Rect($x,$y,$c[$j]*$modul,$h,"F");
            $x += ($c[$j++]+$c[$j])*$modul;
        }
    }
}

}


$pdf = new bezwaar(); // PDF aanmaken met nieuwe klasses en functies
$pdf->AliasNbPages(); // Toevoeging voor headers
$pdf->SetTopMargin(34.7); // Marge bovenkant instellen
$pdf->addPage(); // Pagina openen

//Arial
$pdf->SetFont('Arial','',8);
//Output inhoud
$pdf->MultiCell(0,4,$inhoud);


//A set
$code='CODE 128';
$pdf->Code128(50,20,$code,80,20);
$pdf->SetXY(50,45);
$pdf->Write(5,'A set: "'.$code.'"');
$pdf->Output();

1条回答
倾城 Initia
2楼-- · 2019-05-01 10:43

If you want to pass objects laterally (e.g. two classes who are not hierarchically related), here is a simple example of how you'd do it. By passing the entire object to your class, you can manipulate it right within the class like so:

class bezwaar extends FPDI // for example
{
    /**
     * the pdf object
     * @var PDF_Code128
     */
    protected $_pdf;

    /**
     * the code string
     * @var string
     */
    protected $_code = 'CODE 128';

    /**
     * the class constructor method (called automatically upon instantiation)
     * @param PDF_Code128 $pdf
     */
    public function __construct(PDF_Code128 $pdf)
    {
        $this->_pdf = $pdf;
        parent::__construct(); // might be optional
    }

    public function setCode($code)
    {
        $this->_code = $code;
        return $this;
    }

    public function getCode()
    {
        return $this->_code;
    }

    /**
     * The code you had before (bad function name, I know)
     */
    public function setPdfStuff()
    {
        $this->_pdf->Code128(50, 20, $this->_code, 80, 20);
        $this->_pdf->SetXY(50, 45);
        $this->_pdf->Write(5,'A set: "'.$this->_code.'"');
    }
}

$pdf = new bezwaar(new PDF_Code128());
$pdf->setCode('CODE 128')
    ->setPdfStuff();
查看更多
登录 后发表回答