PHP: Как объединить эти два класса?

Как и в названии, у меня проблемы с объединением двух классов. Хотя речь идет о FPDF, я думаю, что это обычный вопрос, поскольку вопрос мог касаться любого скрипта.

Я использую FPDF для создания PDF-документов на лету. Я использую его в сочетании с классом FPDI для добавления векторных изображений в файл PDF. Сценарий можно найти ниже, и он работает как шарм.

<?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();
?>

Проблема в том, что я хотел бы добавить еще один класс для добавления штрих-кодов, но я не знаю, как это интегрировать. Приведенный ниже сценарий отлично работает сам по себе с FPDF, но не с FPDI в сочетании.

<?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.'"');
?>

Проблема, вероятно, в том, что мне нужно объединить эти два:

<?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();
?>

Источники

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

Вопрос

Может ли кто-нибудь помочь мне и сказать, как объединить оба сценария (выше)? Я не новичок в PHP, но я новичок в классах, что довольно сложно..enter code here

Процедура проб и ошибок, объединяющая два вышеуказанных — обновления на основе ответов, которые я получаю

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();

Ошибка

Предупреждение: деление на ноль в /home/fpdf16/fpdf.php в строке 812

Еще один метод проб и ошибок

Это то, что обычно работает, за исключением этого раза. Я добавляю функции в класс штрих-кода просто в расширенный класс FPDI. В результате сценарий истекает, пока я не удалю эту строку: $pdf->Code128(50,20,$code,80,20), но эта строка необходима для создания штрих-кода. У кого-нибудь есть идея, где это может истечь?

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();

person mat    schedule 08.12.2011    source источник
comment
Я не совсем понимаю, чего вы пытаетесь достичь или что здесь происходит с кодом, но вы не можете просто передать вывод PDF_Code128 в bezwaar, например $pdf = new bezwaar($pdf);. Затем в конструкторе bezwaar вы можете получить полный доступ к выходным данным PDF_Code128.   -  person Treffynnon    schedule 08.12.2011
comment
Я не совсем понимаю, что вы имеете в виду. Сейчас я пробую это (я понимаю, что это, наверное, безумие, но я пробую это уже несколько часов) $pdf = new bezwaar(); $pdf=новый PDF_Code128($pdf);   -  person mat    schedule 08.12.2011
comment
@mmmshuddup расширил мою идею ниже, которая излагает это гораздо яснее.   -  person Treffynnon    schedule 08.12.2011
comment
Я отредактировал свой скрипт и добавил код mmmschuddup. Я, вероятно, сделал что-то не так.. Возможно, вы видите ошибку? (ТС редактируется)   -  person mat    schedule 08.12.2011


Ответы (1)


Если вы хотите передать объекты сбоку (например, два класса, которые не связаны иерархически), вот простой пример того, как вы это сделаете. Передавая весь объект вашему классу, вы можете манипулировать им прямо внутри класса следующим образом:

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();
person Yes Barry    schedule 08.12.2011
comment
Я очень ценю вашу помощь, но я ее не понимаю.. Извините. Можно ли добавить то, что вы сделали, к первому опубликованному мной сценарию? Я играю с ним сейчас, не зная, что я делаю. - person mat; 08.12.2011
comment
@mat Хм, это будет сложно. Я взял только один небольшой фрагмент вашего кода, чтобы использовать его в моем примере. Меня смущает, что вы создаете экземпляр (объявляете объект) $pdf дважды. В одном случае вы объявляете $pdf объектом bezwaar, а позже вы объявляете $pdf объектом PDF_Code128. На данный момент я не уверен, какие методы относятся к каким классам. Я постараюсь помочь тебе завтра. Иду спать сейчас. Удачи! - person Yes Barry; 08.12.2011
comment
Я понимаю, что вторая часть будет работать без части FPDI, поэтому я использую $pdf дважды, так как это два скрипта, которые работают автономно, но не вместе. Спокойной ночи! :) - person mat; 08.12.2011